diff --git a/server/src/main/java/org/elasticsearch/common/settings/SettingsModule.java b/server/src/main/java/org/elasticsearch/common/settings/SettingsModule.java index 094ce5349b862..adef9fec912f8 100644 --- a/server/src/main/java/org/elasticsearch/common/settings/SettingsModule.java +++ b/server/src/main/java/org/elasticsearch/common/settings/SettingsModule.java @@ -63,11 +63,27 @@ public SettingsModule( List> additionalSettings, List settingsFilter, Set> settingUpgraders) { + this( + settings, + additionalSettings, + settingsFilter, + settingUpgraders, + ClusterSettings.BUILT_IN_CLUSTER_SETTINGS, + IndexScopedSettings.BUILT_IN_INDEX_SETTINGS); + } + + SettingsModule( + final Settings settings, + final List> additionalSettings, + final List settingsFilter, + final Set> settingUpgraders, + final Set> registeredClusterSettings, + final Set> registeredIndexSettings) { this.settings = settings; - for (Setting setting : ClusterSettings.BUILT_IN_CLUSTER_SETTINGS) { + for (Setting setting : registeredClusterSettings) { registerSetting(setting); } - for (Setting setting : IndexScopedSettings.BUILT_IN_INDEX_SETTINGS) { + for (Setting setting : registeredIndexSettings) { registerSetting(setting); } @@ -143,7 +159,7 @@ public SettingsModule( // by now we are fully configured, lets check node level settings for unregistered index settings clusterSettings.validate(settings, true); this.settingsFilter = new SettingsFilter(settingsFilterPattern); - } + } @Override public void configure(Binder binder) { @@ -159,6 +175,9 @@ public void configure(Binder binder) { * the setting during startup. */ private void registerSetting(Setting setting) { + if (setting.getKey().contains(".") == false) { + throw new IllegalArgumentException("setting [" + setting.getKey() + "] is not in any namespace, its name must contain a dot"); + } if (setting.isFiltered()) { if (settingsFilterPattern.contains(setting.getKey()) == false) { registerSettingsFilter(setting.getKey()); diff --git a/server/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java b/server/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java index 42c846d01f5a5..9f2ed63b6da61 100644 --- a/server/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java +++ b/server/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java @@ -24,9 +24,13 @@ import org.hamcrest.Matchers; import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; import static java.util.Collections.emptySet; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.hasToString; import static org.hamcrest.Matchers.is; public class SettingsModuleTests extends ModuleTestCase { @@ -185,4 +189,31 @@ public void testMutuallyExclusiveScopes() { assertThat(e.getMessage(), containsString("Cannot register setting [foo.bar] twice")); } } + + public void testPluginSettingWithoutNamespace() { + final String key = randomAlphaOfLength(8); + final Setting setting = Setting.simpleString(key, Property.NodeScope); + runSettingWithoutNamespaceTest( + key, () -> new SettingsModule(Settings.EMPTY, List.of(setting), List.of(), Set.of(), Set.of(), Set.of())); + } + + public void testClusterSettingWithoutNamespace() { + final String key = randomAlphaOfLength(8); + final Setting setting = Setting.simpleString(key, Property.NodeScope); + runSettingWithoutNamespaceTest( + key, () -> new SettingsModule(Settings.EMPTY, List.of(), List.of(), Set.of(), Set.of(setting), Set.of())); + } + + public void testIndexSettingWithoutNamespace() { + final String key = randomAlphaOfLength(8); + final Setting setting = Setting.simpleString(key, Property.IndexScope); + runSettingWithoutNamespaceTest( + key, () -> new SettingsModule(Settings.EMPTY, List.of(), List.of(), Set.of(), Set.of(), Set.of(setting))); + } + + private void runSettingWithoutNamespaceTest(final String key, final Supplier supplier) { + final IllegalArgumentException e = expectThrows(IllegalArgumentException.class, supplier::get); + assertThat(e, hasToString(containsString("setting [" + key + "] is not in any namespace, its name must contain a dot"))); + } + }