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(/