diff --git a/src/cli_plugin/install/__fixtures__/replies/test_plugin.zip b/src/cli_plugin/install/__fixtures__/replies/test_plugin.zip index 1ec957f80128b..544abf86007e6 100644 Binary files a/src/cli_plugin/install/__fixtures__/replies/test_plugin.zip and b/src/cli_plugin/install/__fixtures__/replies/test_plugin.zip differ diff --git a/src/cli_plugin/install/zip.js b/src/cli_plugin/install/zip.js index 25cdac42398db..7f928275525d5 100644 --- a/src/cli_plugin/install/zip.js +++ b/src/cli_plugin/install/zip.js @@ -132,7 +132,7 @@ export function extractArchive(archive, targetDir, extractPath) { return reject(err); } - readStream.pipe(createWriteStream(fileName)); + readStream.pipe(createWriteStream(fileName, { mode: entry.externalFileAttributes >>> 16 })); readStream.on('end', function () { zipfile.readEntry(); }); diff --git a/src/cli_plugin/install/zip.test.js b/src/cli_plugin/install/zip.test.js index 516e0abe25743..340dec196eef5 100644 --- a/src/cli_plugin/install/zip.test.js +++ b/src/cli_plugin/install/zip.test.js @@ -21,6 +21,7 @@ import rimraf from 'rimraf'; import path from 'path'; import os from 'os'; import glob from 'glob'; +import fs from 'fs'; import { analyzeArchive, extractArchive, _isDirectory } from './zip'; describe('kibana cli', function () { @@ -72,6 +73,28 @@ describe('kibana cli', function () { }); }); + describe('checkFilePermission', () => { + it('verify consistency of modes of files', async () => { + const archivePath = path.resolve(repliesPath, 'test_plugin.zip'); + + await extractArchive(archivePath, tempPath, 'kibana/libs'); + const files = await glob.sync('**/*', { cwd: tempPath }); + + const expected = [ + 'executable', + 'unexecutable' + ]; + expect(files.sort()).toEqual(expected.sort()); + + const executableMode = '0' + (fs.statSync(path.resolve(tempPath, 'executable')).mode & parseInt('777', 8)).toString(8); + const unExecutableMode = '0' + (fs.statSync(path.resolve(tempPath, 'unexecutable')).mode & parseInt('777', 8)).toString(8); + + expect(executableMode).toEqual('0755'); + expect(unExecutableMode).toEqual('0644'); + + }); + }); + it('handles a corrupt zip archive', async () => { try { await extractArchive(path.resolve(repliesPath, 'corrupt.zip'));