4141import java .util .zip .ZipEntry ;
4242import java .util .zip .ZipOutputStream ;
4343
44+ import static java .nio .file .attribute .PosixFilePermission .*;
4445import static org .elasticsearch .common .settings .Settings .settingsBuilder ;
4546import static org .elasticsearch .plugins .PluginInfoTests .writeProperties ;
4647import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .*;
@@ -283,6 +284,39 @@ public void testConfigDirectoryOwnerGroupAndPermissions() throws IOException {
283284 assertThat (pluginConfigFileAttributes .permissions (), equalTo (expectedFilePermissions ));
284285 }
285286
287+ public void testBinDirectoryOwnerGroupAndPermissions () throws IOException {
288+ assumeTrue ("File system does not support permissions, skipping" , supportsPermissions );
289+ URL pluginUrl = createPlugin (true , false );
290+ PluginManager pluginManager = new PluginManager (environment , pluginUrl , PluginManager .OutputMode .VERBOSE , TimeValue .timeValueSeconds (10 ));
291+ pluginManager .downloadAndExtract (pluginName , terminal );
292+ PosixFileAttributes parentFileAttributes = Files .getFileAttributeView (environment .binFile (), PosixFileAttributeView .class ).readAttributes ();
293+ Path binPath = environment .binFile ().resolve (pluginName );
294+ PosixFileAttributes pluginBinDirAttributes = Files .getFileAttributeView (binPath , PosixFileAttributeView .class ).readAttributes ();
295+ assertThat (pluginBinDirAttributes .owner (), equalTo (parentFileAttributes .owner ()));
296+ assertThat (pluginBinDirAttributes .group (), equalTo (parentFileAttributes .group ()));
297+ assertThat (pluginBinDirAttributes .permissions (), equalTo (parentFileAttributes .permissions ()));
298+ Path executableFile = binPath .resolve ("my-binary" );
299+ PosixFileAttributes pluginExecutableFileAttributes = Files .getFileAttributeView (executableFile , PosixFileAttributeView .class ).readAttributes ();
300+ assertThat (pluginExecutableFileAttributes .owner (), equalTo (parentFileAttributes .owner ()));
301+ assertThat (pluginExecutableFileAttributes .group (), equalTo (parentFileAttributes .group ()));
302+ Set <PosixFilePermission > expectedFilePermissions = new HashSet <>();
303+ expectedFilePermissions .add (OWNER_EXECUTE );
304+ expectedFilePermissions .add (GROUP_EXECUTE );
305+ expectedFilePermissions .add (OTHERS_EXECUTE );
306+ for (PosixFilePermission parentPermission : parentFileAttributes .permissions ()) {
307+ switch (parentPermission ) {
308+ case OWNER_EXECUTE :
309+ case GROUP_EXECUTE :
310+ case OTHERS_EXECUTE :
311+ break ;
312+ default :
313+ expectedFilePermissions .add (parentPermission );
314+ }
315+ }
316+
317+ assertThat (pluginExecutableFileAttributes .permissions (), equalTo (expectedFilePermissions ));
318+ }
319+
286320 private URL createPlugin (boolean withBinDir , boolean withConfigDir ) throws IOException {
287321 final Path structure = createTempDir ().resolve ("fake-plugin" );
288322 writeProperties (structure , "description" , "fake desc" ,
@@ -301,7 +335,7 @@ private URL createPlugin(boolean withBinDir, boolean withConfigDir) throws IOExc
301335 // create executable
302336 Path executable = binDir .resolve ("my-binary" );
303337 Files .createFile (executable );
304- Files .setPosixFilePermissions (executable , PosixFilePermissions .fromString ("rwxr-xr-x " ));
338+ Files .setPosixFilePermissions (executable , PosixFilePermissions .fromString ("rw-r--r-- " ));
305339 }
306340 if (withConfigDir ) {
307341 // create bin dir
0 commit comments