Skip to content

Commit 293205f

Browse files
author
David Roberts
committed
Set execute permissions for native plugin programs (#21657)
1 parent 514cacc commit 293205f

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

core/src/main/java/org/elasticsearch/plugins/InstallPluginCommand.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,12 @@
4747
import java.net.URLDecoder;
4848
import java.nio.charset.StandardCharsets;
4949
import java.nio.file.DirectoryStream;
50+
import java.nio.file.FileVisitResult;
5051
import java.nio.file.Files;
5152
import java.nio.file.Path;
53+
import java.nio.file.SimpleFileVisitor;
5254
import java.nio.file.StandardCopyOption;
55+
import java.nio.file.attribute.BasicFileAttributes;
5356
import java.nio.file.attribute.PosixFileAttributeView;
5457
import java.nio.file.attribute.PosixFileAttributes;
5558
import java.nio.file.attribute.PosixFilePermission;
@@ -493,15 +496,24 @@ private void install(Terminal terminal, boolean isBatch, Path tmpRoot, Environme
493496
}
494497

495498
Files.move(tmpRoot, destination, StandardCopyOption.ATOMIC_MOVE);
496-
try (DirectoryStream<Path> stream = Files.newDirectoryStream(destination)) {
497-
for (Path pluginFile : stream) {
499+
Files.walkFileTree(destination, new SimpleFileVisitor<Path>() {
500+
@Override
501+
public FileVisitResult visitFile(Path pluginFile, BasicFileAttributes attrs) throws IOException {
498502
if (Files.isDirectory(pluginFile)) {
499503
setFileAttributes(pluginFile, PLUGIN_DIR_PERMS);
500504
} else {
501-
setFileAttributes(pluginFile, PLUGIN_FILES_PERMS);
505+
// There can also be "bin" directories under the plugin directory, storing native code executables
506+
Path parentDir = pluginFile.getParent().getFileName();
507+
if ("bin".equals(parentDir.toString())) {
508+
setFileAttributes(pluginFile, BIN_FILES_PERMS);
509+
} else {
510+
setFileAttributes(pluginFile, PLUGIN_FILES_PERMS);
511+
}
502512
}
513+
return FileVisitResult.CONTINUE;
503514
}
504-
}
515+
});
516+
505517
terminal.println("-> Installed " + info.getName());
506518

507519
} catch (Exception installProblem) {

qa/evil-tests/src/test/java/org/elasticsearch/plugins/InstallPluginCommandTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,34 @@ public void testBinPermissions() throws Exception {
477477
}
478478
}
479479

480+
public void testPlatformBinPermissions() throws Exception {
481+
assumeTrue("posix filesystem", isPosix);
482+
Tuple<Path, Environment> env = createEnv(fs, temp);
483+
Path pluginDir = createPluginDir(temp);
484+
Path platformDir = pluginDir.resolve("platform");
485+
Path platformNameDir = platformDir.resolve("linux-x86_64");
486+
Path platformBinDir = platformNameDir.resolve("bin");
487+
Files.createDirectories(platformBinDir);
488+
Path programFile = Files.createFile(platformBinDir.resolve("someprogram"));
489+
// a file created with Files.createFile() should not have execute permissions
490+
Set<PosixFilePermission> sourcePerms = Files.getPosixFilePermissions(programFile);
491+
assertFalse(sourcePerms.contains(PosixFilePermission.OWNER_EXECUTE));
492+
assertFalse(sourcePerms.contains(PosixFilePermission.GROUP_EXECUTE));
493+
assertFalse(sourcePerms.contains(PosixFilePermission.OTHERS_EXECUTE));
494+
String pluginZip = createPlugin("fake", pluginDir);
495+
installPlugin(pluginZip, env.v1());
496+
assertPlugin("fake", pluginDir, env.v2());
497+
// check that the installed program has execute permissions, even though the one added to the plugin didn't
498+
Path installedPlatformBinDir = env.v2().pluginsFile().resolve("fake").resolve("platform").resolve("linux-x86_64").resolve("bin");
499+
assertTrue(Files.isDirectory(installedPlatformBinDir));
500+
Path installedProgramFile = installedPlatformBinDir.resolve("someprogram");
501+
assertTrue(Files.isRegularFile(installedProgramFile));
502+
Set<PosixFilePermission> installedPerms = Files.getPosixFilePermissions(installedProgramFile);
503+
assertTrue(installedPerms.contains(PosixFilePermission.OWNER_EXECUTE));
504+
assertTrue(installedPerms.contains(PosixFilePermission.GROUP_EXECUTE));
505+
assertTrue(installedPerms.contains(PosixFilePermission.OTHERS_EXECUTE));
506+
}
507+
480508
public void testConfig() throws Exception {
481509
Tuple<Path, Environment> env = createEnv(fs, temp);
482510
Path pluginDir = createPluginDir(temp);

0 commit comments

Comments
 (0)