From 627cae9b3b4d4636204461dd83f973b2ac6947b8 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Mon, 27 Jul 2026 16:30:49 +0200 Subject: [PATCH] =?UTF-8?q?Spam-Anh=C3=A4nge:=20klarer=20Fehler=20statt=20?= =?UTF-8?q?Junk-Ordner-Raterei=20(Pentest=20R124)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nachtrag zum R124-Fix: statt bei nicht auffindbarem Junk-Ordner still auf INBOX bzw. den geratenen String 'Junk' zurückzufallen, wird jetzt ein klarer Fehler zurückgegeben – sonst könnte im Randfall (Junk-Ordner serverseitig entfernt/umbenannt) doch wieder die falsche UID aus dem falschen Ordner gezogen werden. - 4 Controller-Funktionen (downloadAttachment, saveAttachmentTo, saveAttachmentAsInvoice, saveAttachmentAsContractDocument): 404 "Postfach hat keinen Spam-/Junk-Ordner (mehr)". - 2 Service-Funktionen (moveEmailToTrash, restoreEmailFromTrash): klare error-Message im TrashOperationResult. Kein undefined mehr Richtung IMAP-Lib. Co-Authored-By: Claude Opus 4.7 --- .../src/controllers/cachedEmail.controller.ts | 52 +++++++++++++++++-- backend/src/services/cachedEmail.service.ts | 12 ++++- docs/todo.md | 6 +++ 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/backend/src/controllers/cachedEmail.controller.ts b/backend/src/controllers/cachedEmail.controller.ts index 85b20e2d..ca32a703 100644 --- a/backend/src/controllers/cachedEmail.controller.ts +++ b/backend/src/controllers/cachedEmail.controller.ts @@ -749,7 +749,18 @@ export async function downloadAttachment(req: AuthRequest, res: Response): Promi if (email.folder === 'SENT') { imapFolder = 'Sent'; } else if (email.folder === 'SPAM') { - imapFolder = (await findJunkFolderPath(credentials)) || 'Junk'; + // Kein stiller Fallback: findet sich der Junk-Ordner nicht (mehr), + // lieber ein klarer Fehler als aus dem falschen Ordner (INBOX/'Junk') + // die falsche UID zu ziehen. + const junkPath = await findJunkFolderPath(credentials); + if (!junkPath) { + res.status(404).json({ + success: false, + error: 'Postfach hat keinen Spam-/Junk-Ordner (mehr) – Anhang nicht abrufbar', + } as ApiResponse); + return; + } + imapFolder = junkPath; } else { imapFolder = 'INBOX'; } @@ -1426,7 +1437,18 @@ export async function saveAttachmentTo(req: AuthRequest, res: Response): Promise if (email.folder === 'SENT') { imapFolder = 'Sent'; } else if (email.folder === 'SPAM') { - imapFolder = (await findJunkFolderPath(credentials)) || 'Junk'; + // Kein stiller Fallback: findet sich der Junk-Ordner nicht (mehr), + // lieber ein klarer Fehler als aus dem falschen Ordner (INBOX/'Junk') + // die falsche UID zu ziehen. + const junkPath = await findJunkFolderPath(credentials); + if (!junkPath) { + res.status(404).json({ + success: false, + error: 'Postfach hat keinen Spam-/Junk-Ordner (mehr) – Anhang nicht abrufbar', + } as ApiResponse); + return; + } + imapFolder = junkPath; } else { imapFolder = 'INBOX'; } @@ -2244,7 +2266,18 @@ export async function saveAttachmentAsInvoice(req: AuthRequest, res: Response): if (email.folder === 'SENT') { imapFolder = 'Sent'; } else if (email.folder === 'SPAM') { - imapFolder = (await findJunkFolderPath(credentials)) || 'Junk'; + // Kein stiller Fallback: findet sich der Junk-Ordner nicht (mehr), + // lieber ein klarer Fehler als aus dem falschen Ordner (INBOX/'Junk') + // die falsche UID zu ziehen. + const junkPath = await findJunkFolderPath(credentials); + if (!junkPath) { + res.status(404).json({ + success: false, + error: 'Postfach hat keinen Spam-/Junk-Ordner (mehr) – Anhang nicht abrufbar', + } as ApiResponse); + return; + } + imapFolder = junkPath; } else { imapFolder = 'INBOX'; } @@ -2415,7 +2448,18 @@ export async function saveAttachmentAsContractDocument(req: AuthRequest, res: Re if (email.folder === 'SENT') { imapFolder = 'Sent'; } else if (email.folder === 'SPAM') { - imapFolder = (await findJunkFolderPath(credentials)) || 'Junk'; + // Kein stiller Fallback: findet sich der Junk-Ordner nicht (mehr), + // lieber ein klarer Fehler als aus dem falschen Ordner (INBOX/'Junk') + // die falsche UID zu ziehen. + const junkPath = await findJunkFolderPath(credentials); + if (!junkPath) { + res.status(404).json({ + success: false, + error: 'Postfach hat keinen Spam-/Junk-Ordner (mehr) – Anhang nicht abrufbar', + } as ApiResponse); + return; + } + imapFolder = junkPath; } else { imapFolder = 'INBOX'; } diff --git a/backend/src/services/cachedEmail.service.ts b/backend/src/services/cachedEmail.service.ts index fe962fe0..837d4456 100644 --- a/backend/src/services/cachedEmail.service.ts +++ b/backend/src/services/cachedEmail.service.ts @@ -824,7 +824,11 @@ export async function moveEmailToTrash(id: number): Promise