Skip to content

Commit f7ee727

Browse files
jasontedorjkakavas
authored andcommitted
Forbid settings without a namespace (elastic#45947)
This commit forbids settings that are not in any namespace, all setting names must now contain a dot.
1 parent 2496a78 commit f7ee727

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

server/src/main/java/org/elasticsearch/common/settings/SettingsModule.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,27 @@ public SettingsModule(
6363
List<Setting<?>> additionalSettings,
6464
List<String> settingsFilter,
6565
Set<SettingUpgrader<?>> settingUpgraders) {
66+
this(
67+
settings,
68+
additionalSettings,
69+
settingsFilter,
70+
settingUpgraders,
71+
ClusterSettings.BUILT_IN_CLUSTER_SETTINGS,
72+
IndexScopedSettings.BUILT_IN_INDEX_SETTINGS);
73+
}
74+
75+
SettingsModule(
76+
final Settings settings,
77+
final List<Setting<?>> additionalSettings,
78+
final List<String> settingsFilter,
79+
final Set<SettingUpgrader<?>> settingUpgraders,
80+
final Set<Setting<?>> registeredClusterSettings,
81+
final Set<Setting<?>> registeredIndexSettings) {
6682
this.settings = settings;
67-
for (Setting<?> setting : ClusterSettings.BUILT_IN_CLUSTER_SETTINGS) {
83+
for (Setting<?> setting : registeredClusterSettings) {
6884
registerSetting(setting);
6985
}
70-
for (Setting<?> setting : IndexScopedSettings.BUILT_IN_INDEX_SETTINGS) {
86+
for (Setting<?> setting : registeredIndexSettings) {
7187
registerSetting(setting);
7288
}
7389

@@ -143,7 +159,7 @@ public SettingsModule(
143159
// by now we are fully configured, lets check node level settings for unregistered index settings
144160
clusterSettings.validate(settings, true);
145161
this.settingsFilter = new SettingsFilter(settingsFilterPattern);
146-
}
162+
}
147163

148164
@Override
149165
public void configure(Binder binder) {
@@ -159,6 +175,9 @@ public void configure(Binder binder) {
159175
* the setting during startup.
160176
*/
161177
private void registerSetting(Setting<?> setting) {
178+
if (setting.getKey().contains(".") == false) {
179+
throw new IllegalArgumentException("setting [" + setting.getKey() + "] is not in any namespace, its name must contain a dot");
180+
}
162181
if (setting.isFiltered()) {
163182
if (settingsFilterPattern.contains(setting.getKey()) == false) {
164183
registerSettingsFilter(setting.getKey());

server/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@
2424
import org.hamcrest.Matchers;
2525

2626
import java.util.Arrays;
27+
import java.util.List;
28+
import java.util.Set;
29+
import java.util.function.Supplier;
2730

2831
import static java.util.Collections.emptySet;
2932
import static org.hamcrest.Matchers.containsString;
33+
import static org.hamcrest.Matchers.hasToString;
3034
import static org.hamcrest.Matchers.is;
3135

3236
public class SettingsModuleTests extends ModuleTestCase {
@@ -185,4 +189,31 @@ public void testMutuallyExclusiveScopes() {
185189
assertThat(e.getMessage(), containsString("Cannot register setting [foo.bar] twice"));
186190
}
187191
}
192+
193+
public void testPluginSettingWithoutNamespace() {
194+
final String key = randomAlphaOfLength(8);
195+
final Setting<String> setting = Setting.simpleString(key, Property.NodeScope);
196+
runSettingWithoutNamespaceTest(
197+
key, () -> new SettingsModule(Settings.EMPTY, List.of(setting), List.of(), Set.of(), Set.of(), Set.of()));
198+
}
199+
200+
public void testClusterSettingWithoutNamespace() {
201+
final String key = randomAlphaOfLength(8);
202+
final Setting<String> setting = Setting.simpleString(key, Property.NodeScope);
203+
runSettingWithoutNamespaceTest(
204+
key, () -> new SettingsModule(Settings.EMPTY, List.of(), List.of(), Set.of(), Set.of(setting), Set.of()));
205+
}
206+
207+
public void testIndexSettingWithoutNamespace() {
208+
final String key = randomAlphaOfLength(8);
209+
final Setting<String> setting = Setting.simpleString(key, Property.IndexScope);
210+
runSettingWithoutNamespaceTest(
211+
key, () -> new SettingsModule(Settings.EMPTY, List.of(), List.of(), Set.of(), Set.of(), Set.of(setting)));
212+
}
213+
214+
private void runSettingWithoutNamespaceTest(final String key, final Supplier<SettingsModule> supplier) {
215+
final IllegalArgumentException e = expectThrows(IllegalArgumentException.class, supplier::get);
216+
assertThat(e, hasToString(containsString("setting [" + key + "] is not in any namespace, its name must contain a dot")));
217+
}
218+
188219
}

0 commit comments

Comments
 (0)