From 6030acb43b5ccc5cf051052b7241f3330c62a820 Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Wed, 17 Aug 2016 14:58:28 -0600 Subject: [PATCH] Disallow creating indices starting with '-' or '+' Previously this was possible, which was problematic when issuing a request like `DELETE /-myindex`, which was interpretted as "delete everything except for myindex". Resolves #19800 --- .../cluster/metadata/MetaDataCreateIndexService.java | 6 +++--- .../java/org/elasticsearch/snapshots/RestoreService.java | 2 +- .../cluster/metadata/MetaDataCreateIndexServiceTests.java | 6 ++++-- docs/reference/migration/migrate_5_0/index-apis.asciidoc | 8 ++++++++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java index 04316cbc638..dfb5474ca59 100644 --- a/core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java +++ b/core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java @@ -144,7 +144,7 @@ public class MetaDataCreateIndexService extends AbstractComponent { this.activeShardsObserver = new ActiveShardsObserver(settings, clusterService, threadPool); } - public void validateIndexName(String index, ClusterState state) { + public static void validateIndexName(String index, ClusterState state) { if (state.routingTable().hasIndex(index)) { throw new IndexAlreadyExistsException(state.routingTable().index(index).getIndex()); } @@ -157,8 +157,8 @@ public class MetaDataCreateIndexService extends AbstractComponent { if (index.contains("#")) { throw new InvalidIndexNameException(index, "must not contain '#'"); } - if (index.charAt(0) == '_') { - throw new InvalidIndexNameException(index, "must not start with '_'"); + if (index.charAt(0) == '_' || index.charAt(0) == '-' || index.charAt(0) == '+') { + throw new InvalidIndexNameException(index, "must not start with '_', '-', or '+'"); } if (!index.toLowerCase(Locale.ROOT).equals(index)) { throw new InvalidIndexNameException(index, "must be lowercase"); diff --git a/core/src/main/java/org/elasticsearch/snapshots/RestoreService.java b/core/src/main/java/org/elasticsearch/snapshots/RestoreService.java index 7ab579aa455..16700f3221a 100644 --- a/core/src/main/java/org/elasticsearch/snapshots/RestoreService.java +++ b/core/src/main/java/org/elasticsearch/snapshots/RestoreService.java @@ -257,7 +257,7 @@ public class RestoreService extends AbstractComponent implements ClusterStateLis if (currentIndexMetaData == null) { // Index doesn't exist - create it and start recovery // Make sure that the index we are about to create has a validate name - createIndexService.validateIndexName(renamedIndexName, currentState); + MetaDataCreateIndexService.validateIndexName(renamedIndexName, currentState); createIndexService.validateIndexSettings(renamedIndexName, snapshotIndexMetaData.getSettings()); IndexMetaData.Builder indexMdBuilder = IndexMetaData.builder(snapshotIndexMetaData).state(IndexMetaData.State.OPEN).index(renamedIndexName); indexMdBuilder.settings(Settings.builder().put(snapshotIndexMetaData.getSettings()).put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID())); diff --git a/core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexServiceTests.java b/core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexServiceTests.java index f1f20511fcc..adf34859d4e 100644 --- a/core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexServiceTests.java +++ b/core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexServiceTests.java @@ -191,7 +191,9 @@ public class MetaDataCreateIndexServiceTests extends ESTestCase { validateIndexName("index#name", "must not contain '#'"); - validateIndexName("_indexname", "must not start with '_'"); + validateIndexName("_indexname", "must not start with '_', '-', or '+'"); + validateIndexName("-indexname", "must not start with '_', '-', or '+'"); + validateIndexName("+indexname", "must not start with '_', '-', or '+'"); validateIndexName("INDEXNAME", "must be lowercase"); @@ -201,7 +203,7 @@ public class MetaDataCreateIndexServiceTests extends ESTestCase { private void validateIndexName(String indexName, String errorMessage) { InvalidIndexNameException e = expectThrows(InvalidIndexNameException.class, - () -> getCreateIndexService().validateIndexName(indexName, ClusterState.builder(ClusterName.CLUSTER_NAME_SETTING + () -> MetaDataCreateIndexService.validateIndexName(indexName, ClusterState.builder(ClusterName.CLUSTER_NAME_SETTING .getDefault(Settings.EMPTY)).build())); assertThat(e.getMessage(), endsWith(errorMessage)); } diff --git a/docs/reference/migration/migrate_5_0/index-apis.asciidoc b/docs/reference/migration/migrate_5_0/index-apis.asciidoc index 599b1681ab5..612572577c9 100644 --- a/docs/reference/migration/migrate_5_0/index-apis.asciidoc +++ b/docs/reference/migration/migrate_5_0/index-apis.asciidoc @@ -49,3 +49,11 @@ CPU usage can be obtained from `OsStats.Cpu#getPercent`. Suggest stats exposed through `suggest` in indices stats has been merged with `search` stats. `suggest` stats is exposed as part of `search` stats. + +==== Creating indices starting with '-' or '+' + +Elasticsearch no longer allows indices to be created started with '-' or '+', so +that the multi-index matching and expansion is not confused. It was previously +possible (but a really bad idea) to create indices starting with a hyphen or +plus sign. Any index already existing with these preceding characters will +continue to work normally.