Skip to content

Commit dd0582a

Browse files
Mehakmeet Singhsteveloughran
authored andcommitted
CDPD-15111. HADOOP-17129. Validating storage keys in ABFS correctly
Storage Keys in ABFS should be validated after the keys have been loaded. Conflicts: hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AbfsConfiguration.java Change-Id: Iafca3101eedb7555be25b57f972996118d5a5243
1 parent 11c04d5 commit dd0582a

File tree

3 files changed

+22
-19
lines changed

3 files changed

+22
-19
lines changed

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AbfsConfiguration.java

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import java.io.IOException;
2222
import java.lang.reflect.Field;
23-
import java.util.Map;
2423

2524
import com.google.common.annotations.VisibleForTesting;
2625
import com.google.common.base.Preconditions;
@@ -225,16 +224,13 @@ public class AbfsConfiguration{
225224
DefaultValue = DEFAULT_SAS_TOKEN_RENEW_PERIOD_FOR_STREAMS_IN_SECONDS)
226225
private long sasTokenRenewPeriodForStreamsInSeconds;
227226

228-
private Map<String, String> storageAccountKeys;
229-
230227
public AbfsConfiguration(final Configuration rawConfig, String accountName)
231228
throws IllegalAccessException, InvalidConfigurationValueException, IOException {
232229
this.rawConfig = ProviderUtils.excludeIncompatibleCredentialProviders(
233230
rawConfig, AzureBlobFileSystem.class);
234231
this.accountName = accountName;
235232
this.isSecure = getBoolean(FS_AZURE_SECURE_MODE, false);
236233

237-
validateStorageAccountKeys();
238234
Field[] fields = this.getClass().getDeclaredFields();
239235
for (Field field : fields) {
240236
field.setAccessible(true);
@@ -682,17 +678,7 @@ public boolean isReadAheadEnabled() {
682678
public int getReadAheadRange() {
683679
return this.readAheadRange;
684680
}
685-
686-
void validateStorageAccountKeys() throws InvalidConfigurationValueException {
687-
Base64StringConfigurationBasicValidator validator = new Base64StringConfigurationBasicValidator(
688-
FS_AZURE_ACCOUNT_KEY_PROPERTY_NAME, "", true);
689-
this.storageAccountKeys = rawConfig.getValByRegex(FS_AZURE_ACCOUNT_KEY_PROPERTY_NAME_REGX);
690-
691-
for (Map.Entry<String, String> account : storageAccountKeys.entrySet()) {
692-
validator.validate(account.getValue());
693-
}
694-
}
695-
681+
696682
int validateInt(Field field) throws IllegalAccessException, InvalidConfigurationValueException {
697683
IntegerConfigurationValidatorAnnotation validator = field.getAnnotation(IntegerConfigurationValidatorAnnotation.class);
698684
String value = get(validator.ConfigurationKey());

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/SimpleKeyProvider.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys;
2626
import org.apache.hadoop.fs.azurebfs.contracts.exceptions.KeyProviderException;
2727
import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidConfigurationValueException;
28+
import org.apache.hadoop.fs.azurebfs.diagnostics.Base64StringConfigurationBasicValidator;
2829
import org.slf4j.Logger;
2930
import org.slf4j.LoggerFactory;
3031

@@ -43,12 +44,28 @@ public String getStorageAccountKey(String accountName, Configuration rawConfig)
4344
try {
4445
AbfsConfiguration abfsConfig = new AbfsConfiguration(rawConfig, accountName);
4546
key = abfsConfig.getPasswordString(ConfigurationKeys.FS_AZURE_ACCOUNT_KEY_PROPERTY_NAME);
46-
} catch(IllegalAccessException | InvalidConfigurationValueException e) {
47+
48+
// Validating the key.
49+
validateStorageAccountKey(key);
50+
} catch (IllegalAccessException | InvalidConfigurationValueException e) {
4751
throw new KeyProviderException("Failure to initialize configuration", e);
4852
} catch(IOException ioe) {
4953
LOG.warn("Unable to get key from credential providers. {}", ioe);
5054
}
51-
5255
return key;
5356
}
57+
58+
/**
59+
* A method to validate the storage key.
60+
*
61+
* @param key the key to be validated.
62+
* @throws InvalidConfigurationValueException
63+
*/
64+
private void validateStorageAccountKey(String key)
65+
throws InvalidConfigurationValueException {
66+
Base64StringConfigurationBasicValidator validator = new Base64StringConfigurationBasicValidator(
67+
ConfigurationKeys.FS_AZURE_ACCOUNT_KEY_PROPERTY_NAME, "", true);
68+
69+
validator.validate(key);
70+
}
5471
}

hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/TestAbfsConfigurationFieldsValidation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import org.apache.hadoop.fs.azurebfs.contracts.annotations.ConfigurationValidationAnnotations.StringConfigurationValidatorAnnotation;
3131
import org.apache.hadoop.fs.azurebfs.contracts.annotations.ConfigurationValidationAnnotations.LongConfigurationValidatorAnnotation;
3232
import org.apache.hadoop.fs.azurebfs.contracts.annotations.ConfigurationValidationAnnotations.Base64StringConfigurationValidatorAnnotation;
33-
import org.apache.hadoop.fs.azurebfs.contracts.exceptions.ConfigurationPropertyNotFoundException;
33+
import org.apache.hadoop.fs.azurebfs.contracts.exceptions.KeyProviderException;
3434
import org.apache.hadoop.fs.azurebfs.utils.Base64;
3535

3636
import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.FS_AZURE_SSL_CHANNEL_MODE_KEY;
@@ -157,7 +157,7 @@ public void testGetAccountKey() throws Exception {
157157
assertEquals(this.encodedAccountKey, accountKey);
158158
}
159159

160-
@Test(expected = ConfigurationPropertyNotFoundException.class)
160+
@Test(expected = KeyProviderException.class)
161161
public void testGetAccountKeyWithNonExistingAccountName() throws Exception {
162162
Configuration configuration = new Configuration();
163163
configuration.addResource(TestConfigurationKeys.TEST_CONFIGURATION_FILE_NAME);

0 commit comments

Comments
 (0)