GEODE-2955: Validating region names when creating lucene index This closes #531
Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/ee9ca4e8 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/ee9ca4e8 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/ee9ca4e8 Branch: refs/heads/feature/GEODE-2632-17 Commit: ee9ca4e8176183a6d0128322d21c47e5c4a0ffdf Parents: 662358f Author: David Anuta <david.r.an...@gmail.com> Authored: Wed May 24 11:34:39 2017 -0700 Committer: nabarun <n...@pivotal.io> Committed: Wed May 24 15:25:36 2017 -0700 ---------------------------------------------------------------------- .../geode/internal/cache/LocalRegion.java | 3 +-- .../lucene/internal/LuceneServiceImpl.java | 26 ++++++++++++++++++++ .../internal/cli/LuceneIndexCommands.java | 4 +++ .../functions/LuceneCreateIndexFunction.java | 4 +++ .../cli/LuceneIndexCommandsDUnitTest.java | 26 +++++++++++++++++++- 5 files changed, 60 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/ee9ca4e8/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java ---------------------------------------------------------------------- diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java index 4446d48..f581856 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java +++ b/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java @@ -231,8 +231,6 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory, // package-private to avoid synthetic accessor static final Logger logger = LogService.getLogger(); - private static final Pattern NAME_PATTERN = Pattern.compile("[aA-zZ0-9-_.]+"); - /** * Internal interface used to simulate failures when performing entry operations * @@ -7389,6 +7387,7 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory, "Region names may not begin with a double-underscore: " + name); } + final Pattern NAME_PATTERN = Pattern.compile("[aA-zZ0-9-_.]+"); // Ensure the region only contains valid characters Matcher matcher = NAME_PATTERN.matcher(name); if (!matcher.matches()) { http://git-wip-us.apache.org/repos/asf/geode/blob/ee9ca4e8/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java index afbcc40..8ce7028 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java @@ -17,6 +17,8 @@ package org.apache.geode.cache.lucene.internal; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.geode.cache.lucene.LuceneIndexExistsException; import org.apache.geode.cache.lucene.internal.distributed.LuceneQueryFunction; @@ -126,6 +128,30 @@ public class LuceneServiceImpl implements InternalLuceneService { return getUniqueIndexName(indexName, regionPath) + regionSuffix; } + public static void validateRegionName(String name) { + if (name == null) { + throw new IllegalArgumentException( + LocalizedStrings.LocalRegion_NAME_CANNOT_BE_NULL.toLocalizedString()); + } + if (name.isEmpty()) { + throw new IllegalArgumentException( + LocalizedStrings.LocalRegion_NAME_CANNOT_BE_EMPTY.toLocalizedString()); + } + + if (name.startsWith("__")) { + throw new IllegalArgumentException( + "Region names may not begin with a double-underscore: " + name); + } + + final Pattern NAME_PATTERN = Pattern.compile("[aA-zZ0-9-_.]+"); + // Ensure the region only contains valid characters + Matcher matcher = NAME_PATTERN.matcher(name); + if (!matcher.matches()) { + throw new IllegalArgumentException( + "Region names may only be alphanumeric and may contain hyphens or underscores: " + name); + } + } + public void createIndex(String indexName, String regionPath, Map<String, Analyzer> fieldAnalyzers) { if (fieldAnalyzers == null || fieldAnalyzers.isEmpty()) { http://git-wip-us.apache.org/repos/asf/geode/blob/ee9ca4e8/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommands.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommands.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommands.java index 5e17f6e..9317e2e 100755 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommands.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommands.java @@ -35,6 +35,7 @@ import org.apache.geode.management.cli.CliMetaData; import org.apache.geode.management.cli.ConverterHint; import org.apache.geode.management.cli.Result; import org.apache.geode.management.internal.cli.CliUtil; +import org.apache.geode.management.internal.cli.LogWrapper; import org.apache.geode.management.internal.cli.commands.AbstractCommandsSupport; import org.apache.geode.management.internal.cli.functions.CliFunctionResult; import org.apache.geode.management.internal.cli.i18n.CliStrings; @@ -202,6 +203,9 @@ public class LuceneIndexCommands extends AbstractCommandsSupport { } } result = ResultBuilder.buildResult(tabularResult); + } catch (IllegalArgumentException iae) { + LogWrapper.getInstance().info(iae.getMessage()); + result = ResultBuilder.createUserErrorResult(iae.getMessage()); } catch (CommandResultException crex) { result = crex.getResult(); } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/geode/blob/ee9ca4e8/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java index 9f938a5..422b1ef 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/cli/functions/LuceneCreateIndexFunction.java @@ -15,6 +15,8 @@ package org.apache.geode.cache.lucene.internal.cli.functions; +import static org.apache.geode.cache.lucene.internal.LuceneServiceImpl.validateRegionName; + import org.apache.commons.lang.StringUtils; import org.apache.geode.cache.Cache; import org.apache.geode.cache.CacheFactory; @@ -81,6 +83,8 @@ public class LuceneCreateIndexFunction extends FunctionAdapter implements Intern indexFactory.addField(fields[i], analyzer); } } + + validateRegionName(indexInfo.getRegionPath()); indexFactory.create(indexInfo.getIndexName(), indexInfo.getRegionPath()); // TODO - update cluster configuration by returning a valid XmlEntity http://git-wip-us.apache.org/repos/asf/geode/blob/ee9ca4e8/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java index bc4c68e..04359a3 100755 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/cli/LuceneIndexCommandsDUnitTest.java @@ -198,6 +198,31 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase { } @Test + public void createIndexShouldNotAcceptEmptyRegionNames() { + final VM vm1 = Host.getHost(0).getVM(-1); + vm1.invoke(() -> { + getCache(); + }); + + CommandStringBuilder csb = new CommandStringBuilder(LuceneCliStrings.LUCENE_CREATE_INDEX); + csb.addOption(LuceneCliStrings.LUCENE__INDEX_NAME, INDEX_NAME); + csb.addOption(LuceneCliStrings.LUCENE__REGION_PATH, "\'__\'"); + csb.addOption(LuceneCliStrings.LUCENE_CREATE_INDEX__FIELD, "field1,field2,field3"); + + String resultAsString = executeCommandAndLogResult(csb); + assertTrue(resultAsString.contains("Region names may not begin with a double-underscore:")); + + csb = new CommandStringBuilder(LuceneCliStrings.LUCENE_CREATE_INDEX); + csb.addOption(LuceneCliStrings.LUCENE__INDEX_NAME, INDEX_NAME); + csb.addOption(LuceneCliStrings.LUCENE__REGION_PATH, "\' @@@*%\'"); + csb.addOption(LuceneCliStrings.LUCENE_CREATE_INDEX__FIELD, "field1,field2,field3"); + + resultAsString = executeCommandAndLogResult(csb); + assertTrue(resultAsString + .contains("Region names may only be alphanumeric and may contain hyphens or underscores:")); + } + + @Test public void createIndexShouldTrimAnalyzerNames() throws Exception { final VM vm1 = Host.getHost(0).getVM(-1); vm1.invoke(() -> { @@ -497,7 +522,6 @@ public class LuceneIndexCommandsDUnitTest extends CliCommandTestBase { TabularResultData data = (TabularResultData) executeCommandAndGetResult(csb).getResultData(); assertEquals(4, data.retrieveAllValues("key").size()); - } @Test