Set execute permissions for native plugin programs (#21657)
This commit is contained in:
parent
9594b6f50f
commit
6daeb56969
|
@ -47,9 +47,12 @@ import java.net.URLConnection;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.DirectoryStream;
|
import java.nio.file.DirectoryStream;
|
||||||
|
import java.nio.file.FileVisitResult;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.SimpleFileVisitor;
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
import java.nio.file.attribute.PosixFileAttributeView;
|
import java.nio.file.attribute.PosixFileAttributeView;
|
||||||
import java.nio.file.attribute.PosixFileAttributes;
|
import java.nio.file.attribute.PosixFileAttributes;
|
||||||
import java.nio.file.attribute.PosixFilePermission;
|
import java.nio.file.attribute.PosixFilePermission;
|
||||||
|
@ -493,15 +496,24 @@ class InstallPluginCommand extends SettingCommand {
|
||||||
}
|
}
|
||||||
|
|
||||||
Files.move(tmpRoot, destination, StandardCopyOption.ATOMIC_MOVE);
|
Files.move(tmpRoot, destination, StandardCopyOption.ATOMIC_MOVE);
|
||||||
try (DirectoryStream<Path> stream = Files.newDirectoryStream(destination)) {
|
Files.walkFileTree(destination, new SimpleFileVisitor<Path>() {
|
||||||
for (Path pluginFile : stream) {
|
@Override
|
||||||
|
public FileVisitResult visitFile(Path pluginFile, BasicFileAttributes attrs) throws IOException {
|
||||||
if (Files.isDirectory(pluginFile)) {
|
if (Files.isDirectory(pluginFile)) {
|
||||||
setFileAttributes(pluginFile, PLUGIN_DIR_PERMS);
|
setFileAttributes(pluginFile, PLUGIN_DIR_PERMS);
|
||||||
} else {
|
} else {
|
||||||
setFileAttributes(pluginFile, PLUGIN_FILES_PERMS);
|
// There can also be "bin" directories under the plugin directory, storing native code executables
|
||||||
|
Path parentDir = pluginFile.getParent().getFileName();
|
||||||
|
if ("bin".equals(parentDir.toString())) {
|
||||||
|
setFileAttributes(pluginFile, BIN_FILES_PERMS);
|
||||||
|
} else {
|
||||||
|
setFileAttributes(pluginFile, PLUGIN_FILES_PERMS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return FileVisitResult.CONTINUE;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
terminal.println("-> Installed " + info.getName());
|
terminal.println("-> Installed " + info.getName());
|
||||||
|
|
||||||
} catch (Exception installProblem) {
|
} catch (Exception installProblem) {
|
||||||
|
|
|
@ -477,6 +477,34 @@ public class InstallPluginCommandTests extends ESTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testPlatformBinPermissions() throws Exception {
|
||||||
|
assumeTrue("posix filesystem", isPosix);
|
||||||
|
Tuple<Path, Environment> env = createEnv(fs, temp);
|
||||||
|
Path pluginDir = createPluginDir(temp);
|
||||||
|
Path platformDir = pluginDir.resolve("platform");
|
||||||
|
Path platformNameDir = platformDir.resolve("linux-x86_64");
|
||||||
|
Path platformBinDir = platformNameDir.resolve("bin");
|
||||||
|
Files.createDirectories(platformBinDir);
|
||||||
|
Path programFile = Files.createFile(platformBinDir.resolve("someprogram"));
|
||||||
|
// a file created with Files.createFile() should not have execute permissions
|
||||||
|
Set<PosixFilePermission> sourcePerms = Files.getPosixFilePermissions(programFile);
|
||||||
|
assertFalse(sourcePerms.contains(PosixFilePermission.OWNER_EXECUTE));
|
||||||
|
assertFalse(sourcePerms.contains(PosixFilePermission.GROUP_EXECUTE));
|
||||||
|
assertFalse(sourcePerms.contains(PosixFilePermission.OTHERS_EXECUTE));
|
||||||
|
String pluginZip = createPlugin("fake", pluginDir);
|
||||||
|
installPlugin(pluginZip, env.v1());
|
||||||
|
assertPlugin("fake", pluginDir, env.v2());
|
||||||
|
// check that the installed program has execute permissions, even though the one added to the plugin didn't
|
||||||
|
Path installedPlatformBinDir = env.v2().pluginsFile().resolve("fake").resolve("platform").resolve("linux-x86_64").resolve("bin");
|
||||||
|
assertTrue(Files.isDirectory(installedPlatformBinDir));
|
||||||
|
Path installedProgramFile = installedPlatformBinDir.resolve("someprogram");
|
||||||
|
assertTrue(Files.isRegularFile(installedProgramFile));
|
||||||
|
Set<PosixFilePermission> installedPerms = Files.getPosixFilePermissions(installedProgramFile);
|
||||||
|
assertTrue(installedPerms.contains(PosixFilePermission.OWNER_EXECUTE));
|
||||||
|
assertTrue(installedPerms.contains(PosixFilePermission.GROUP_EXECUTE));
|
||||||
|
assertTrue(installedPerms.contains(PosixFilePermission.OTHERS_EXECUTE));
|
||||||
|
}
|
||||||
|
|
||||||
public void testConfig() throws Exception {
|
public void testConfig() throws Exception {
|
||||||
Tuple<Path, Environment> env = createEnv(fs, temp);
|
Tuple<Path, Environment> env = createEnv(fs, temp);
|
||||||
Path pluginDir = createPluginDir(temp);
|
Path pluginDir = createPluginDir(temp);
|
||||||
|
|
Loading…
Reference in New Issue