fix(v5): MakeMKV-Installer aus dem Internet Archive nur nach Rückfrage, mit Größe und SHA-256
WAS: makemkvInstallerHolen fragt vor der Archiv-Quelle über eine Freigabe-Funktion; ohne Freigabe wird das Archiv übersprungen und im Bericht genannt. Der Kern stellt die Frage ans Fenster (beschaffung-status mit `frage`), die MakeMKV-Karte zeigt sie mit „Archiv-Kopie laden" / „Lieber nicht" (beschaffung-antwort); ohne Antwort in zehn Minuten gilt Nein. Die geladene Datei wird mit Größe und SHA-256 gemeldet. WARUM: Durchsicht 12.09.2026, Fund F16 (Commander-Entscheid: Archiv nur nach Rückfrage) — eine unsignierte EXE von fremder Hand, die mit Adminrechten läuft, entscheidet der Nutzer, nicht Rippy. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3dacd7cb4f
commit
ae82d8c0fd
@@ -136,10 +136,11 @@ describe('dateiPruefen', () => {
|
||||
describe('makemkvInstallerHolen', () => {
|
||||
const GROSS = Buffer.concat([Buffer.from('MZ'), Buffer.alloc(1024 * 1024 + 100, 7)])
|
||||
|
||||
it('Fehlerseite mit HTTP 200 fällt durch die Mindestgröße — die nächste Quelle gewinnt', async () => {
|
||||
it('Fehlerseite mit HTTP 200 fällt durch die Mindestgröße — die nächste Quelle gewinnt (mit Freigabe)', async () => {
|
||||
const ordner = tempOrdner()
|
||||
const holen = (async (url: string | URL | Request) =>
|
||||
String(url).includes('web.archive.org') ? antwort(GROSS) : antwort('<html>kaputt</html>')) as typeof fetch
|
||||
const gefragt: string[] = []
|
||||
const ergebnis = await makemkvInstallerHolen(
|
||||
'1.18.4',
|
||||
() => {},
|
||||
@@ -147,16 +148,35 @@ describe('makemkvInstallerHolen', () => {
|
||||
holen,
|
||||
ordner,
|
||||
(p, v) => dateiPruefen(p, v, () => ({ firma: 'GuinpinSoft inc', produkt: 'MakeMKV', version: 'v1.18.4' }), 'win32'),
|
||||
async (quelle) => {
|
||||
gefragt.push(quelle)
|
||||
return true
|
||||
},
|
||||
)
|
||||
expect(gefragt).toEqual(['Internet Archive'])
|
||||
expect(ergebnis.quelle).toBe('Internet Archive')
|
||||
expect(readFileSync(ergebnis.pfad).length).toBe(GROSS.length)
|
||||
expect(ergebnis.bytes).toBe(GROSS.length)
|
||||
expect(ergebnis.sha256).toMatch(/^[0-9a-f]{64}$/)
|
||||
expect(existsSync(`${ergebnis.pfad}.neu`)).toBe(false)
|
||||
})
|
||||
|
||||
// 5.7.0 (Durchsicht F16): Ohne Freigabe wird das Archiv NIE benutzt — es
|
||||
// liefert eine unsignierte EXE, die mit Adminrechten läuft.
|
||||
it('ohne Freigabe bleibt das Archiv aus — und der Bericht sagt es', async () => {
|
||||
const ordner = tempOrdner()
|
||||
const holen = (async (url: string | URL | Request) =>
|
||||
String(url).includes('web.archive.org') ? antwort(GROSS) : antwort('<html>kaputt</html>')) as typeof fetch
|
||||
await expect(makemkvInstallerHolen('1.18.4', () => {}, '', holen, ordner)).rejects.toThrow(/Internet Archive: nicht freigegeben/)
|
||||
await expect(makemkvInstallerHolen('1.18.4', () => {}, '', holen, ordner, undefined, async () => false)).rejects.toThrow(
|
||||
/Internet Archive: nicht freigegeben/,
|
||||
)
|
||||
})
|
||||
|
||||
it('liefert keine Quelle, steht im Wurf der Bericht ALLER Versuche', async () => {
|
||||
const ordner = tempOrdner()
|
||||
const holen = (async () => antwort('weg', 404)) as typeof fetch
|
||||
await expect(makemkvInstallerHolen('1.18.4', () => {}, '', holen, ordner)).rejects.toThrow(
|
||||
await expect(makemkvInstallerHolen('1.18.4', () => {}, '', holen, ordner, undefined, async () => true)).rejects.toThrow(
|
||||
/Hersteller: HTTP 404[\s\S]*Internet Archive: HTTP 404[\s\S]*makemkv\.com/,
|
||||
)
|
||||
})
|
||||
@@ -166,6 +186,8 @@ describe('Nachrichten-Schema der Update-Strecke', () => {
|
||||
it('Fenster → Kern: makemkv-update und schluessel-pruefen', () => {
|
||||
expect(istFensterNachricht({ art: 'makemkv-update' })).toBe(true)
|
||||
expect(istFensterNachricht({ art: 'schluessel-pruefen' })).toBe(true)
|
||||
expect(istFensterNachricht({ art: 'beschaffung-antwort', ja: true })).toBe(true)
|
||||
expect(istFensterNachricht({ art: 'beschaffung-antwort' })).toBe(false)
|
||||
})
|
||||
it('Haupt → Kern: installer-ergebnis', () => {
|
||||
expect(istHauptNachricht({ art: 'installer-ergebnis', fehler: null })).toBe(true)
|
||||
|
||||
Reference in New Issue
Block a user