Skip to content

Commit 0d88ed2

Browse files
mehakmeetsteveloughran
authored andcommitted
HADOOP-17129. Validating storage keys in ABFS correctly (#2141)
Contributed by Mehakmeet Singh Change-Id: I8016ee2f9ffbc86ea867f4a3d960b134e507d099
1 parent 9e7266d commit 0d88ed2

File tree

3 files changed

+21
-17
lines changed

3 files changed

+21
-17
lines changed

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

Lines changed: 0 additions & 14 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;
@@ -215,16 +214,13 @@ public class AbfsConfiguration{
215214
DefaultValue = DEFAULT_SAS_TOKEN_RENEW_PERIOD_FOR_STREAMS_IN_SECONDS)
216215
private long sasTokenRenewPeriodForStreamsInSeconds;
217216

218-
private Map<String, String> storageAccountKeys;
219-
220217
public AbfsConfiguration(final Configuration rawConfig, String accountName)
221218
throws IllegalAccessException, InvalidConfigurationValueException, IOException {
222219
this.rawConfig = ProviderUtils.excludeIncompatibleCredentialProviders(
223220
rawConfig, AzureBlobFileSystem.class);
224221
this.accountName = accountName;
225222
this.isSecure = getBoolean(FS_AZURE_SECURE_MODE, false);
226223

227-
validateStorageAccountKeys();
228224
Field[] fields = this.getClass().getDeclaredFields();
229225
for (Field field : fields) {
230226
field.setAccessible(true);
@@ -665,16 +661,6 @@ public SASTokenProvider getSASTokenProvider() throws AzureBlobFileSystemExceptio
665661
}
666662
}
667663

668-
void validateStorageAccountKeys() throws InvalidConfigurationValueException {
669-
Base64StringConfigurationBasicValidator validator = new Base64StringConfigurationBasicValidator(
670-
FS_AZURE_ACCOUNT_KEY_PROPERTY_NAME, "", true);
671-
this.storageAccountKeys = rawConfig.getValByRegex(FS_AZURE_ACCOUNT_KEY_PROPERTY_NAME_REGX);
672-
673-
for (Map.Entry<String, String> account : storageAccountKeys.entrySet()) {
674-
validator.validate(account.getValue());
675-
}
676-
}
677-
678664
int validateInt(Field field) throws IllegalAccessException, InvalidConfigurationValueException {
679665
IntegerConfigurationValidatorAnnotation validator = field.getAnnotation(IntegerConfigurationValidatorAnnotation.class);
680666
String value = get(validator.ConfigurationKey());

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

Lines changed: 19 additions & 1 deletion
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,29 @@ 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
}
5155

5256
return key;
5357
}
58+
59+
/**
60+
* A method to validate the storage key.
61+
*
62+
* @param key the key to be validated.
63+
* @throws InvalidConfigurationValueException
64+
*/
65+
private void validateStorageAccountKey(String key)
66+
throws InvalidConfigurationValueException {
67+
Base64StringConfigurationBasicValidator validator = new Base64StringConfigurationBasicValidator(
68+
ConfigurationKeys.FS_AZURE_ACCOUNT_KEY_PROPERTY_NAME, "", true);
69+
70+
validator.validate(key);
71+
}
5472
}

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;
@@ -155,7 +155,7 @@ public void testGetAccountKey() throws Exception {
155155
assertEquals(this.encodedAccountKey, accountKey);
156156
}
157157

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

0 commit comments

Comments
 (0)