From 859dff024b8320e0ae2e1b6d45267d228bed480f Mon Sep 17 00:00:00 2001 From: Alexander Alemayhu Date: Mon, 19 Feb 2024 20:50:45 +0100 Subject: [PATCH] fix: prevent crashes in nested uploads --- src/lib/getSafeFilename.test.ts | 5 +++++ src/lib/getSafeFilename.ts | 3 +++ src/lib/parser/DeckParser.ts | 21 +++++++++++---------- src/services/UploadService.ts | 3 ++- 4 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 src/lib/getSafeFilename.test.ts create mode 100644 src/lib/getSafeFilename.ts diff --git a/src/lib/getSafeFilename.test.ts b/src/lib/getSafeFilename.test.ts new file mode 100644 index 000000000..3ede742bf --- /dev/null +++ b/src/lib/getSafeFilename.test.ts @@ -0,0 +1,5 @@ +import { getSafeFilename } from './getSafeFilename'; + +test("returns filename without slashes", () => { + expect(getSafeFilename("x/y/z")).toBe('x-y-z') +}) diff --git a/src/lib/getSafeFilename.ts b/src/lib/getSafeFilename.ts new file mode 100644 index 000000000..563048209 --- /dev/null +++ b/src/lib/getSafeFilename.ts @@ -0,0 +1,3 @@ +export function getSafeFilename(name: string) { + return name.replace(/\//g, '-'); +} diff --git a/src/lib/parser/DeckParser.ts b/src/lib/parser/DeckParser.ts index 7b5269377..f6ffc434b 100644 --- a/src/lib/parser/DeckParser.ts +++ b/src/lib/parser/DeckParser.ts @@ -47,16 +47,14 @@ export class DeckParser { const firstFile = this.files.find((file) => isFileNameEqual(file, name)); const contents = getHTMLContents(firstFile); - if (contents) { - this.payload = this.handleHTML( - name, - contents.toString(), - this.settings.deckName || '', - [] - ); - } else { - throw new Error(`Error Unknown file ${name}`); - } + this.payload = contents + ? this.handleHTML( + name, + contents.toString(), + this.settings.deckName || '', + [] + ) + : []; } findNextPage(href: string | undefined): string | Uint8Array | undefined { @@ -473,6 +471,9 @@ export class DeckParser { } totalCardCount() { + if (this.payload.length === 0) { + return 0; + } return this.payload.map((p) => p.cardCount).reduce((a, b) => a + b); } diff --git a/src/services/UploadService.ts b/src/services/UploadService.ts index 091954a51..330186c5b 100644 --- a/src/services/UploadService.ts +++ b/src/services/UploadService.ts @@ -12,6 +12,7 @@ import StorageHandler from '../lib/storage/StorageHandler'; import { UploadedFile } from '../lib/storage/types'; import GeneratePackagesUseCase from '../usecases/uploads/GeneratePackagesUseCase'; import { toText } from './NotionService/BlockHandler/helpers/deckNameToText'; +import { getSafeFilename } from '../lib/getSafeFilename'; class UploadService { getUploadsByOwner(owner: number) { @@ -63,7 +64,7 @@ class UploadService { const workspace = new Workspace(true, 'fs'); for (const pkg of packages) { - const p = path.join(workspace.location, pkg.name); + const p = path.join(workspace.location, getSafeFilename(pkg.name)); fs.writeFileSync(p, pkg.apkg); }