From 7ec39acd4b56f271106b61a1521fb8586742cbfc Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Tue, 6 Jun 2017 10:13:10 -0700 Subject: [PATCH] Settings: Fix setting groups to include secure settings (#25076) This commit fixes the group methdos of Settings to properly include grouped secure settings. Previously the secure settings were included but without the group prefix being removed. closes #25069 --- .../common/settings/Settings.java | 38 ++++++------------- .../common/settings/SettingsTests.java | 24 ++++++++++++ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/common/settings/Settings.java b/core/src/main/java/org/elasticsearch/common/settings/Settings.java index fc7912c88ac8c..f71ddccd9d345 100644 --- a/core/src/main/java/org/elasticsearch/common/settings/Settings.java +++ b/core/src/main/java/org/elasticsearch/common/settings/Settings.java @@ -507,35 +507,21 @@ public Map getGroups(String settingPrefix, boolean ignoreNonGr } private Map getGroupsInternal(String settingPrefix, boolean ignoreNonGrouped) throws SettingsException { - // we don't really care that it might happen twice - Map> map = new LinkedHashMap<>(); - for (Object o : settings.keySet()) { - String setting = (String) o; - if (setting.startsWith(settingPrefix)) { - String nameValue = setting.substring(settingPrefix.length()); - int dotIndex = nameValue.indexOf('.'); - if (dotIndex == -1) { - if (ignoreNonGrouped) { - continue; - } - throw new SettingsException("Failed to get setting group for [" + settingPrefix + "] setting prefix and setting [" - + setting + "] because of a missing '.'"); - } - String name = nameValue.substring(0, dotIndex); - String value = nameValue.substring(dotIndex + 1); - Map groupSettings = map.get(name); - if (groupSettings == null) { - groupSettings = new LinkedHashMap<>(); - map.put(name, groupSettings); + Settings prefixSettings = getByPrefix(settingPrefix); + Map groups = new HashMap<>(); + for (String groupName : prefixSettings.names()) { + Settings groupSettings = prefixSettings.getByPrefix(groupName + "."); + if (groupSettings.isEmpty()) { + if (ignoreNonGrouped) { + continue; } - groupSettings.put(value, get(setting)); + throw new SettingsException("Failed to get setting group for [" + settingPrefix + "] setting prefix and setting [" + + settingPrefix + groupName + "] because of a missing '.'"); } + groups.put(groupName, groupSettings); } - Map retVal = new LinkedHashMap<>(); - for (Map.Entry> entry : map.entrySet()) { - retVal.put(entry.getKey(), new Settings(Collections.unmodifiableMap(entry.getValue()), secureSettings)); - } - return Collections.unmodifiableMap(retVal); + + return Collections.unmodifiableMap(groups); } /** * Returns group settings for the given setting prefix. diff --git a/core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java b/core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java index 96422d8a063f3..9fbad982bdb15 100644 --- a/core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java +++ b/core/src/test/java/org/elasticsearch/common/settings/SettingsTests.java @@ -38,6 +38,7 @@ import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasToString; @@ -525,6 +526,29 @@ public void testSecureSettingsPrefix() { assertTrue(prefixSettings.names().contains("foo")); } + public void testGroupPrefix() { + MockSecureSettings secureSettings = new MockSecureSettings(); + secureSettings.setString("test.key1.foo", "somethingsecure"); + secureSettings.setString("test.key1.bar", "somethingsecure"); + secureSettings.setString("test.key2.foo", "somethingsecure"); + secureSettings.setString("test.key2.bog", "somethingsecure"); + Settings.Builder builder = Settings.builder(); + builder.put("test.key1.baz", "blah1"); + builder.put("test.key1.other", "blah2"); + builder.put("test.key2.baz", "blah3"); + builder.put("test.key2.else", "blah4"); + builder.setSecureSettings(secureSettings); + Settings settings = builder.build(); + Map groups = settings.getGroups("test"); + assertEquals(2, groups.size()); + Settings key1 = groups.get("key1"); + assertNotNull(key1); + assertThat(key1.names(), containsInAnyOrder("foo", "bar", "baz", "other")); + Settings key2 = groups.get("key2"); + assertNotNull(key2); + assertThat(key2.names(), containsInAnyOrder("foo", "bog", "baz", "else")); + } + public void testEmptyFilterMap() { Settings.Builder builder = Settings.builder(); builder.put("a", "a1");