diff --git a/src/converters/main.ts b/src/converters/main.ts index 2c8e6b8c..9a74a12a 100644 --- a/src/converters/main.ts +++ b/src/converters/main.ts @@ -85,6 +85,11 @@ const properties: Record< properties: propertiesxelatex, converter: convertxelatex, }, + // djvu before calibre so the dedicated ddjvu converter wins for DjVu files + djvu: { + properties: propertiesDjvu, + converter: convertDjvu, + }, calibre: { properties: propertiesCalibre, converter: convertCalibre, @@ -93,10 +98,6 @@ const properties: Record< properties: propertiesDasel, converter: convertDasel, }, - djvu: { - properties: propertiesDjvu, - converter: convertDjvu, - }, libreoffice: { properties: propertiesLibreOffice, converter: convertLibreOffice, diff --git a/src/pages/convert.tsx b/src/pages/convert.tsx index e28890cf..27d7c0e8 100644 --- a/src/pages/convert.tsx +++ b/src/pages/convert.tsx @@ -67,6 +67,10 @@ export const convert = new Elysia().use(userService).post( return redirect(`${WEBROOT}/`, 302); } + if (!fileNames.every((name) => typeof name === "string")) { + return redirect(`${WEBROOT}/`, 302); + } + for (let i = 0; i < fileNames.length; i++) { fileNames[i] = sanitize(fileNames[i] || ""); } diff --git a/src/pages/deleteFile.tsx b/src/pages/deleteFile.tsx index ed35550b..6302db9b 100644 --- a/src/pages/deleteFile.tsx +++ b/src/pages/deleteFile.tsx @@ -9,7 +9,7 @@ import path from "node:path"; export const deleteFile = new Elysia().use(userService).post( "/delete", - async ({ body, redirect, cookie: { jobId }, user }) => { + async ({ body, redirect, set, cookie: { jobId }, user }) => { if (!jobId?.value) { return redirect(`${WEBROOT}/`, 302); } @@ -31,6 +31,7 @@ export const deleteFile = new Elysia().use(userService).post( await unlink(targetPath); } catch (e) { if ((e as NodeJS.ErrnoException).code === "ENOENT") { + set.status = 404; return { message: "File not found." }; } throw e; diff --git a/src/pages/root.tsx b/src/pages/root.tsx index 99b1f5ae..0f85f5cf 100644 --- a/src/pages/root.tsx +++ b/src/pages/root.tsx @@ -38,7 +38,15 @@ export const root = new Elysia().use(userService).get( try { const verifiedUser = await jwt.verify(auth.value); if (verifiedUser && verifiedUser.id) { - user = verifiedUser; + const numericId = Number.parseInt(verifiedUser.id); + // IDs below the anonymous range (excluding shared 0) are registered users + const isRegistered = numericId > 0 && numericId < 2 ** 24; + if ( + !isRegistered || + db.query("SELECT * FROM users WHERE id = ?").as(User).get(verifiedUser.id) + ) { + user = verifiedUser; + } } } catch { // Invalid cookie, fall through to anonymous creation