Skip to content

Settings: Fix secure settings by prefix #25064

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 6, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions core/src/main/java/org/elasticsearch/common/settings/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -219,15 +219,15 @@ private Object convertMapsToArrays(Map<String, Object> map) {
*/
public Settings getByPrefix(String prefix) {
return new Settings(new FilteredMap(this.settings, (k) -> k.startsWith(prefix), prefix), secureSettings == null ? null :
new PrefixedSecureSettings(secureSettings, s -> prefix + s, s -> s.startsWith(prefix)));
new PrefixedSecureSettings(secureSettings, prefix, s -> s.startsWith(prefix)));
}

/**
* Returns a new settings object that contains all setting of the current one filtered by the given settings key predicate.
*/
public Settings filter(Predicate<String> predicate) {
return new Settings(new FilteredMap(this.settings, predicate, null), secureSettings == null ? null :
new PrefixedSecureSettings(secureSettings, UnaryOperator.identity(), predicate));
new PrefixedSecureSettings(secureSettings, "", predicate));
}

/**
Expand Down Expand Up @@ -1281,13 +1281,15 @@ public int size() {

private static class PrefixedSecureSettings implements SecureSettings {
private final SecureSettings delegate;
private final UnaryOperator<String> keyTransform;
private final UnaryOperator<String> addPrefix;
private final UnaryOperator<String> removePrefix;
private final Predicate<String> keyPredicate;
private final SetOnce<Set<String>> settingNames = new SetOnce<>();

PrefixedSecureSettings(SecureSettings delegate, UnaryOperator<String> keyTransform, Predicate<String> keyPredicate) {
PrefixedSecureSettings(SecureSettings delegate, String prefix, Predicate<String> keyPredicate) {
this.delegate = delegate;
this.keyTransform = keyTransform;
this.addPrefix = s -> prefix + s;
this.removePrefix = s -> s.substring(prefix.length());
this.keyPredicate = keyPredicate;
}

Expand All @@ -1300,7 +1302,8 @@ public boolean isLoaded() {
public Set<String> getSettingNames() {
synchronized (settingNames) {
if (settingNames.get() == null) {
Set<String> names = delegate.getSettingNames().stream().filter(keyPredicate).collect(Collectors.toSet());
Set<String> names = delegate.getSettingNames().stream()
.filter(keyPredicate).map(removePrefix).collect(Collectors.toSet());
settingNames.set(Collections.unmodifiableSet(names));
}
}
Expand All @@ -1309,12 +1312,12 @@ public Set<String> getSettingNames() {

@Override
public SecureString getString(String setting) throws GeneralSecurityException{
return delegate.getString(keyTransform.apply(setting));
return delegate.getString(addPrefix.apply(setting));
}

@Override
public InputStream getFile(String setting) throws GeneralSecurityException{
return delegate.getFile(keyTransform.apply(setting));
return delegate.getFile(addPrefix.apply(setting));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,16 @@ public void testPrefixMap() {
expectThrows(NoSuchElementException.class, () -> prefixIterator.next());
}

public void testSecureSettingsPrefix() {
MockSecureSettings secureSettings = new MockSecureSettings();
secureSettings.setString("test.prefix.foo", "somethingsecure");
Settings.Builder builder = Settings.builder();
builder.setSecureSettings(secureSettings);
Settings settings = builder.build();
Settings prefixSettings = settings.getByPrefix("test.prefix.");
assertTrue(prefixSettings.names().contains("foo"));
}

public void testEmptyFilterMap() {
Settings.Builder builder = Settings.builder();
builder.put("a", "a1");
Expand Down