diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/MetaPluginBuildPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/MetaPluginBuildPlugin.groovy index 3df9b604c13..4dc355a4860 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/MetaPluginBuildPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/MetaPluginBuildPlugin.groovy @@ -58,11 +58,9 @@ class MetaPluginBuildPlugin implements Plugin { // create the actual bundle task, which zips up all the files for the plugin Zip bundle = project.tasks.create(name: 'bundlePlugin', type: Zip, dependsOn: [buildProperties]) { - into('elasticsearch') { - from(buildProperties.descriptorOutput.parentFile) { - // plugin properties file - include(buildProperties.descriptorOutput.name) - } + from(buildProperties.descriptorOutput.parentFile) { + // plugin properties file + include(buildProperties.descriptorOutput.name) } // due to how the renames work for each bundled plugin, we must exclude empty dirs or every subdir // within bundled plugin zips will show up at the root as an empty dir @@ -85,10 +83,8 @@ class MetaPluginBuildPlugin implements Plugin { dependsOn bundledPluginProject.bundlePlugin from(project.zipTree(bundledPluginProject.bundlePlugin.outputs.files.singleFile)) { eachFile { FileCopyDetails details -> - // paths in the individual plugins begin with elasticsearch, and we want to add in the - // bundled plugin name between that and each filename - details.relativePath = new RelativePath(true, 'elasticsearch', bundledPluginProjectName, - details.relativePath.toString().replace('elasticsearch/', '')) + // we want each path to have the plugin name interjected + details.relativePath = new RelativePath(true, bundledPluginProjectName, details.relativePath.toString()) } } } diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginBuildPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginBuildPlugin.groovy index 062c1292956..ff3b8f857b5 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginBuildPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginBuildPlugin.groovy @@ -140,9 +140,6 @@ public class PluginBuildPlugin extends BuildPlugin { include 'config/**' include 'bin/**' } - if (project.path.startsWith(':modules:') == false) { - into('elasticsearch') - } } project.assemble.dependsOn(bundle) diff --git a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java index 255c2e991b7..0969fb60f33 100644 --- a/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java +++ b/distribution/tools/plugin-cli/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java @@ -462,17 +462,15 @@ class InstallPluginCommand extends EnvironmentAwareCommand { final Path target = stagingDirectory(pluginsDir); pathsToDeleteOnShutdown.add(target); - boolean hasEsDir = false; try (ZipInputStream zipInput = new ZipInputStream(Files.newInputStream(zip))) { ZipEntry entry; byte[] buffer = new byte[8192]; while ((entry = zipInput.getNextEntry()) != null) { - if (entry.getName().startsWith("elasticsearch/") == false) { - // only extract the elasticsearch directory - continue; + if (entry.getName().startsWith("elasticsearch/")) { + throw new UserException(PLUGIN_MALFORMED, "This plugin was built with an older plugin structure." + + " Contact the plugin author to remove the intermediate \"elasticsearch\" directory within the plugin zip."); } - hasEsDir = true; - Path targetFile = target.resolve(entry.getName().substring("elasticsearch/".length())); + Path targetFile = target.resolve(entry.getName()); // Using the entry name as a path can result in an entry outside of the plugin dir, // either if the name starts with the root of the filesystem, or it is a relative @@ -499,13 +497,11 @@ class InstallPluginCommand extends EnvironmentAwareCommand { } zipInput.closeEntry(); } + } catch (UserException e) { + IOUtils.rm(target); + throw e; } Files.delete(zip); - if (hasEsDir == false) { - IOUtils.rm(target); - throw new UserException(PLUGIN_MALFORMED, - "`elasticsearch` directory is missing in the plugin zip"); - } return target; } diff --git a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java index 724c222af2b..4e0cecae12f 100644 --- a/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java +++ b/distribution/tools/plugin-cli/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java @@ -259,12 +259,12 @@ public class InstallPluginCommandTests extends ESTestCase { static Path createPlugin(String name, Path structure, String... additionalProps) throws IOException { writePlugin(name, structure, additionalProps); - return writeZip(structure, "elasticsearch"); + return writeZip(structure, null); } static Path createMetaPlugin(String name, Path structure) throws IOException { writeMetaPlugin(name, structure); - return writeZip(structure, "elasticsearch"); + return writeZip(structure, null); } void installPlugin(String pluginUrl, Path home) throws Exception { @@ -811,7 +811,7 @@ public class InstallPluginCommandTests extends ESTestCase { Path pluginDir = metaDir.resolve("fake"); Files.createDirectory(pluginDir); Files.createFile(pluginDir.resolve("fake.yml")); - String pluginZip = writeZip(pluginDir, "elasticsearch").toUri().toURL().toString(); + String pluginZip = writeZip(pluginDir, null).toUri().toURL().toString(); NoSuchFileException e = expectThrows(NoSuchFileException.class, () -> installPlugin(pluginZip, env.v1())); assertTrue(e.getMessage(), e.getMessage().contains("plugin-descriptor.properties")); assertInstallCleaned(env.v2()); @@ -822,23 +822,23 @@ public class InstallPluginCommandTests extends ESTestCase { assertInstallCleaned(env.v2()); } - public void testMissingDirectory() throws Exception { + public void testContainsIntermediateDirectory() throws Exception { Tuple env = createEnv(fs, temp); Path pluginDir = createPluginDir(temp); Files.createFile(pluginDir.resolve(PluginInfo.ES_PLUGIN_PROPERTIES)); - String pluginZip = writeZip(pluginDir, null).toUri().toURL().toString(); + String pluginZip = writeZip(pluginDir, "elasticsearch").toUri().toURL().toString(); UserException e = expectThrows(UserException.class, () -> installPlugin(pluginZip, env.v1())); - assertTrue(e.getMessage(), e.getMessage().contains("`elasticsearch` directory is missing in the plugin zip")); + assertThat(e.getMessage(), containsString("This plugin was built with an older plugin structure")); assertInstallCleaned(env.v2()); } - public void testMissingDirectoryMeta() throws Exception { + public void testContainsIntermediateDirectoryMeta() throws Exception { Tuple env = createEnv(fs, temp); Path pluginDir = createPluginDir(temp); Files.createFile(pluginDir.resolve(MetaPluginInfo.ES_META_PLUGIN_PROPERTIES)); - String pluginZip = writeZip(pluginDir, null).toUri().toURL().toString(); + String pluginZip = writeZip(pluginDir, "elasticsearch").toUri().toURL().toString(); UserException e = expectThrows(UserException.class, () -> installPlugin(pluginZip, env.v1())); - assertTrue(e.getMessage(), e.getMessage().contains("`elasticsearch` directory is missing in the plugin zip")); + assertThat(e.getMessage(), containsString("This plugin was built with an older plugin structure")); assertInstallCleaned(env.v2()); } @@ -846,11 +846,12 @@ public class InstallPluginCommandTests extends ESTestCase { Tuple env = createEnv(fs, temp); Path zip = createTempDir().resolve("broken.zip"); try (ZipOutputStream stream = new ZipOutputStream(Files.newOutputStream(zip))) { - stream.putNextEntry(new ZipEntry("elasticsearch/../blah")); + stream.putNextEntry(new ZipEntry("../blah")); } String pluginZip = zip.toUri().toURL().toString(); UserException e = expectThrows(UserException.class, () -> installPlugin(pluginZip, env.v1())); assertTrue(e.getMessage(), e.getMessage().contains("resolving outside of plugin directory")); + assertInstallCleaned(env.v2()); } public void testOfficialPluginsHelpSorted() throws Exception {