From 45789918b0de536802d0082dbf75091ed3ef9816 Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Wed, 17 Jun 2026 05:07:13 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20Falsch=20benannte=20Hash-Manifeste=20l?= =?UTF-8?q?=C3=B6schen=20keine=20korrekten=20Dateien=20mehr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit readHashManifest hat den pro Zeile korrekt erkannten Algorithmus mit dem aus der DATEIENDUNG abgeleiteten überschrieben (.sfv→crc32, .md5→md5, .sha1→sha1). parseHashLine erkennt den Algorithmus jedoch eindeutig an der Digest-Länge (32-hex=MD5, 40-hex=SHA1, 8-hex=CRC32) — die Länge ist die verlässliche Quelle. Stimmte die Endung nicht mit dem Zeileninhalt überein (z.B. eine MD5-Zeile in einer .sfv-Datei), wurde der Algorithmus auf crc32 verbogen, hashFile berechnete einen 8-Zeichen-CRC und verglich ihn mit dem 32-Zeichen-MD5 → garantiert Mismatch. Folge: die intakte Datei wurde gelöscht, neu geladen, scheiterte erneut und brach hart ab ("Integritätsprüfung fehlgeschlagen"). Fix: Den von parseHashLine erkannten Algorithmus übernehmen statt ihn per Dateiendung zu überschreiben. Bei korrekt benannten Manifesten ist das ohnehin ein No-op; nur die fehl-etikettierten Fälle werden repariert. Test: .sfv-Datei mit MD5-formatierter Zeile + passende Datei → Algorithmus bleibt MD5 und die Prüfung besteht. Mit der Endungs-Überschreibung wird crc32 erzwungen und die gute Datei fällt durch (rot bewiesen). --- src/main/integrity.ts | 6 +----- tests/integrity.test.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/integrity.ts b/src/main/integrity.ts index 1c6d561..575f697 100644 --- a/src/main/integrity.ts +++ b/src/main/integrity.ts @@ -93,15 +93,11 @@ export function readHashManifest(packageDir: string): Map { expect(parseHashLine(" ")).toBeNull(); }); + it("trusts the per-line algorithm over the file extension for a mislabeled manifest (.sfv holding md5 lines)", async () => { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "rd-int-")); + tempDirs.push(dir); + const filePath = path.join(dir, "movie.bin"); + fs.writeFileSync(filePath, Buffer.from("hello")); + fs.writeFileSync(path.join(dir, "checksums.sfv"), "5d41402abc4b2a76b9719d911017c592 movie.bin\n", "utf8"); + + const manifest = readHashManifest(dir); + expect(manifest.get("movie.bin")?.algorithm).toBe("md5"); + + const result = await validateFileAgainstManifest(filePath, dir); + expect(result.ok).toBe(true); + expect(result.message).toContain("MD5"); + }); + it("keeps first hash entry when duplicate filename appears across manifests", () => { const dir = fs.mkdtempSync(path.join(os.tmpdir(), "rd-int-")); tempDirs.push(dir);