diff --git a/src/common/utils/tar.ts b/src/common/utils/tar.ts index 004fa354dc..bec7b5b3f2 100644 --- a/src/common/utils/tar.ts +++ b/src/common/utils/tar.ts @@ -15,7 +15,7 @@ export function readFileFromTar({ tarPath, filePath, parseJson }: Re await tar.list({ file: tarPath, - filter: path => path === filePath, + filter: entryPath => path.normalize(entryPath) === filePath, onentry(entry: FileStat) { entry.on("data", chunk => { fileChunks.push(chunk); @@ -41,7 +41,9 @@ export async function listTarEntries(filePath: string): Promise { const entries: string[] = []; await tar.list({ file: filePath, - onentry: (entry: FileStat) => entries.push(entry.path as any as string), + onentry: (entry: FileStat) => { + entries.push(path.normalize(entry.path as any as string)); + }, }); return entries; } diff --git a/src/renderer/components/+extensions/extensions.tsx b/src/renderer/components/+extensions/extensions.tsx index c84c04374c..6ff32943a5 100644 --- a/src/renderer/components/+extensions/extensions.tsx +++ b/src/renderer/components/+extensions/extensions.tsx @@ -47,7 +47,7 @@ interface ExtensionState { @observer export class Extensions extends React.Component { - private supportedFormats = [".tar", ".tgz"]; + private supportedFormats = ["tar", "tgz"]; private installPathValidator: InputValidator = { message: Invalid URL or absolute path, @@ -187,15 +187,17 @@ export class Extensions extends React.Component { await Promise.all( requests .filter(req => !req.data && req.filePath) - .map(request => { - return fse.readFile(request.filePath).then(data => { + .map(async request => { + try { + const data = await fse.readFile(request.filePath); request.data = data; preloadedRequests.push(request); - }).catch(error => { + return request; + } catch(error) { if (showError) { Notifications.error(`Error while reading "${request.filePath}": ${String(error)}`); } - }); + } }) ); @@ -206,7 +208,12 @@ export class Extensions extends React.Component { const tarFiles = await listTarEntries(filePath); // tarball from npm contains single root folder "package/*" - const rootFolder = tarFiles[0].split("/")[0]; + const firstFile = tarFiles[0]; + if (!firstFile) { + throw new Error(`invalid extension bundle, ${manifestFilename} not found`); + } + + const rootFolder = path.normalize(firstFile).split(path.sep)[0]; const packedInRootFolder = tarFiles.every(entry => entry.startsWith(rootFolder)); const manifestLocation = packedInRootFolder ? path.join(rootFolder, manifestFilename) : manifestFilename;