From 4d17dbd06f45c62b6524d88cb4feb990dc54f48d Mon Sep 17 00:00:00 2001 From: Sucukdeluxe <259325684+Sucukdeluxe@users.noreply.github.com> Date: Tue, 22 Sep 2026 04:52:45 +0200 Subject: [PATCH] Default new online backup keys to unlimited validity --- PROJECT_MEMORY.md | 4 ++-- lib/online-backup-manager.js | 3 ++- lib/online-backup.js | 2 +- renderer/app.js | 6 +++--- renderer/i18n.js | 3 ++- tests/i18n.test.js | 11 +++++++++++ tests/online-backup-manager.test.js | 2 +- tests/online-backup.test.js | 9 ++++++--- tests/ui-smoke.js | 2 +- 9 files changed, 29 insertions(+), 13 deletions(-) diff --git a/PROJECT_MEMORY.md b/PROJECT_MEMORY.md index 85f245f..2dbbffe 100644 --- a/PROJECT_MEMORY.md +++ b/PROJECT_MEMORY.md @@ -27,7 +27,7 @@ Multi-Hoster-Upload ist eine Electron-Desktopanwendung für Windows, die große - DoodStream-OTP-Prüfungen verwenden dieselbe Cookie-Sitzung weiter, fassen identische oder parallele Checks zusammen und fordern einen neuen Code nur nach einer ausdrücklichen Aktion mit mindestens 60 Sekunden Abstand an. - DoodStream respektiert die ausdrückliche Auswahl `authType=login`: Weblogin und Webupload werden nicht durch einen zusätzlich gespeicherten API-Key übersteuert. API-Accounts und ältere Accounts ohne ausdrückliche Login-Auswahl behalten den API-Weg. - Sammelchecks melden jedes Account-Ergebnis einzeln an den Renderer, sodass fertige Karten sofort grün, rot oder als OTP-pflichtig erscheinen, während die übrigen Accounts weiter geprüft werden. -- Neue Online-Backups unterstützen `24 Stunden`, `3 Tage`, `7 Tage` (Standard), `31 Tage` und `Unbegrenzt`. Endliche Schlüssel werden lokal aus dem verschlüsselten Schlüsselbund entfernt und serverseitig ab Ablauf nicht mehr wiederhergestellt; der Dienst räumt abgelaufene Datensätze bei Zugriff oder der nächsten Speicherung auf. +- Neue Online-Backups unterstützen `24 Stunden`, `3 Tage`, `7 Tage`, `31 Tage` und `Unbegrenzt` (neuer Standard in Oberfläche und Erstellungslogik; nach `2.1.46` geändert, noch nicht veröffentlicht). Bestehende Schlüssel behalten ihre Laufzeit. Endliche Schlüssel werden lokal aus dem verschlüsselten Schlüsselbund entfernt und serverseitig ab Ablauf nicht mehr wiederhergestellt; der Dienst räumt abgelaufene Datensätze bei Zugriff oder der nächsten Speicherung auf. - Vorhandene Online-Backups und alte Upload-Payloads ohne Ablaufangabe bleiben zur Abwärtskompatibilität unbegrenzt gültig. - Backup-Importe wenden Sprache und automatischen Account-Check sofort an. Alle Konfigurationsfelder werden übertragen; Warteschlange, Upload-Wiederherstellungsstatus, letzter Dateiauswahlordner, Automatik-Telemetrie und Pausenzustand bleiben bewusst geräte- beziehungsweise laufzeitgebunden. - Ein nicht vorhandener Ordnerüberwachungspfad bleibt nach dem Import sichtbar gespeichert, die Überwachung wird aber deaktiviert und der Nutzer erhält eine Warnung. Ein nicht vorhandener Log-Ordner wird ebenfalls gemeldet, ohne den konfigurierten Pfad still zu löschen. @@ -77,7 +77,7 @@ Stand: 22.09.2026 (Produktivaktivierung und Release `2.1.46`; ältere Versionspr - Eingebauter Updater mit isoliertem Testprofil und installierter Version `2.1.45` erkennt `2.1.46`, übernimmt den englischen GitHub-Changelog und akzeptiert das Forgejo-Update-Manifest. Alle acht veröffentlichten Dateien wurden erneut heruntergeladen und anhand Größe und SHA-512 gegen die lokalen Dateien geprüft. Titel, Tag, Sprache, Veröffentlichungsstatus und beide anbieterspezifischen Manifeste stimmen. Vollständiger öffentlicher Quellcheck: 163 erlaubte Dateien, Screenshots gültig. Anleitung auf dem Desktop mit abgeschlossenem Live- und Release-Stand aktualisiert. - Lint: erfolgreich, 0 Warnungen und 0 Fehler. -- Haupttests: 822 erfolgreich, 0 fehlgeschlagen; einschließlich vier neuer Wiederherstellungstests und öffentlicher Quellmanifest-Prüfung (163 Dateien). +- Haupttests: 823 erfolgreich, 0 fehlgeschlagen; einschließlich Standardgültigkeit `Unbegrenzt`, deutscher/englischer Auswahl, aller expliziten Laufzeiten, vier Wiederherstellungstests und öffentlicher Quellmanifest-Prüfung (163 Dateien). Backup-API weiterhin 17 Tests erfolgreich; Lint ohne Fehler. Die Änderung der Standardgültigkeit ist nach `2.1.46` committed, aber noch nicht veröffentlicht. - Wiederherstellung lokal Ende-zu-Ende geprüft: öffentliche Schlüsselabfrage, verschlüsselter Serverdatensatz, normaler Import, private Offline-Wiederherstellung und Löschen. Falsche Schlüssel, beschädigte Daten, Kennungstausch, Ablauf, fehlende Serverkonfiguration und Überschreiben bestehender Schlüssel/Ausgabedateien werden geprüft. Anleitung auf dem lokalen Desktop mit eingerichteten Schlüsselpfaden und Sicherungsnachweis aktualisiert. - Backup-API-Tests: 17 erfolgreich, 0 fehlgeschlagen. - Der Regressionstest für die VOE-Fallback-Kette bestätigt bei deaktivierter normaler Rotation genau einen Versuch auf jedem vollen Account und anschließend den erfolgreichen Wechsel auf den vierten Account. diff --git a/lib/online-backup-manager.js b/lib/online-backup-manager.js index a109a0f..259131a 100644 --- a/lib/online-backup-manager.js +++ b/lib/online-backup-manager.js @@ -1,4 +1,5 @@ const { + DEFAULT_ONLINE_BACKUP_RETENTION, createOnlineBackup, deleteOnlineBackup, uploadOnlineBackup @@ -121,7 +122,7 @@ function createOnlineBackupManager({ } } - async function createManaged(retention = '7d') { + async function createManaged(retention = DEFAULT_ONLINE_BACKUP_RETENTION) { try { return await serialize(() => createTransaction(retention)); } catch (error) { diff --git a/lib/online-backup.js b/lib/online-backup.js index 522d898..9a0e282 100644 --- a/lib/online-backup.js +++ b/lib/online-backup.js @@ -23,7 +23,7 @@ const ONLINE_BACKUP_RETENTION_SECONDS = Object.freeze({ '31d': 31 * 24 * 60 * 60, forever: null }); -const DEFAULT_ONLINE_BACKUP_RETENTION = '7d'; +const DEFAULT_ONLINE_BACKUP_RETENTION = 'forever'; function checksum(idBytes, masterKey) { return crypto.createHash('sha256').update(KEY_CONTEXT).update(idBytes).update(masterKey).digest().subarray(0, CHECKSUM_LENGTH); diff --git a/renderer/app.js b/renderer/app.js index 27b20a6..73e9df6 100644 --- a/renderer/app.js +++ b/renderer/app.js @@ -3988,7 +3988,7 @@ async function doOnlineBackupCreate() { const authority = beginManagedOnlineBackupMutation(); const createButton = document.getElementById('createOnlineBackupBtn'); const retentionSelect = document.getElementById('onlineBackupRetentionSelect'); - const retention = retentionSelect?.value || '7d'; + const retention = retentionSelect?.value || 'forever'; if (createButton) createButton.disabled = true; if (retentionSelect) retentionSelect.disabled = true; setOnlineBackupStatus('Verschlüssele und speichere Einstellungen…', 'busy', authority.statusContext); @@ -6615,9 +6615,9 @@ function renderSettings() { diff --git a/renderer/i18n.js b/renderer/i18n.js index 5bb4bd5..a8b925d 100644 --- a/renderer/i18n.js +++ b/renderer/i18n.js @@ -381,7 +381,8 @@ ['Gültigkeitsdauer', 'Validity period'], ['24 Stunden', '24 hours'], ['3 Tage', '3 days'], - ['7 Tage (Standard)', '7 days (default)'], + ['7 Tage', '7 days'], + ['Unbegrenzt (Standard)', 'Unlimited (default)'], ['31 Tage', '31 days'], ['Erstellt', 'Created'], ['Gültig bis', 'Valid until'], diff --git a/tests/i18n.test.js b/tests/i18n.test.js index 6d9746a..25e85e1 100644 --- a/tests/i18n.test.js +++ b/tests/i18n.test.js @@ -6,6 +6,17 @@ const espree = require('espree'); const { normalizeLanguage, translateText } = require('../renderer/i18n'); +test('online backup selection defaults to unlimited in both languages', () => { + assert.equal(translateText('Unbegrenzt (Standard)', 'en'), 'Unlimited (default)'); + assert.equal(translateText('Unlimited (default)', 'de'), 'Unbegrenzt (Standard)'); + assert.equal(translateText('7 Tage', 'en'), '7 days'); + const source = fs.readFileSync(path.join(__dirname, '../renderer/app.js'), 'utf8'); + const select = source.match(/