diff --git a/core/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java b/core/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java index 9e17eec2e93..aa224b3c7c3 100644 --- a/core/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java +++ b/core/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java @@ -237,6 +237,10 @@ class InstallPluginCommand extends SettingCommand { } // fall back to plain old URL + if (pluginId.contains("://") == false) { + // definitely not a valid url, so assume it is a plugin name + throw new UserError(ExitCodes.USAGE, "Unknown plugin " + pluginId); + } terminal.println("-> Downloading " + URLDecoder.decode(pluginId, "UTF-8")); return downloadZip(terminal, pluginId, tmpDir); } diff --git a/qa/evil-tests/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java b/qa/evil-tests/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java index 5c766018f13..fdf52da2634 100644 --- a/qa/evil-tests/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java +++ b/qa/evil-tests/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java @@ -307,6 +307,12 @@ public class InstallPluginCommandTests extends ESTestCase { assertTrue(e.getMessage(), e.getMessage().contains("no protocol")); } + public void testUnknownPlugin() throws Exception { + Tuple env = createEnv(fs, temp); + UserError e = expectThrows(UserError.class, () -> installPlugin("foo", env.v1())); + assertTrue(e.getMessage(), e.getMessage().contains("Unknown plugin foo")); + } + public void testPluginsDirMissing() throws Exception { Tuple env = createEnv(fs, temp); Files.delete(env.v2().pluginsFile());