Default new online backup keys to unlimited validity
CI / verify (push) Waiting to run

This commit is contained in:
Sucukdeluxe
2026-09-22 04:52:45 +02:00
parent 15e920fbde
commit 4d17dbd06f
9 changed files with 29 additions and 13 deletions
+11
View File
@@ -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(/<select id="onlineBackupRetentionSelect">([\s\S]*?)<\/select>/)[1];
assert.match(select, /<option value="forever" selected>Unbegrenzt \(Standard\)<\/option>/);
assert.equal((select.match(/ selected/g) || []).length, 1);
assert.match(source, /const retention = retentionSelect\?\.value \|\| 'forever';/);
});
test('translates permanent source deletion controls to English', () => {
assert.equal(translateText('Quelldatei nach vollständigem Upload dauerhaft löschen', 'en'), 'Permanently delete source file after complete upload');
assert.equal(translateText('Dauerhaftes Löschen aktivieren', 'en'), 'Enable permanent deletion');
+1 -1
View File
@@ -182,7 +182,7 @@ describe('transactional online backup manager', () => {
const result = await fixture.manager.createManaged();
assert.deepEqual(fixture.events, ['prepare', 'upload', 'commit']);
assert.deepEqual(fixture.createArguments, [settings, '2.1.31', fixture.createdAt, '7d', null]);
assert.deepEqual(fixture.createArguments, [settings, '2.1.31', fixture.createdAt, 'forever', null]);
assert.match(fixture.createdAt, /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
assert.deepEqual(result, {
ok: true,
+6 -3
View File
@@ -50,10 +50,10 @@ describe('online backup key', () => {
assert.equal(serialized.includes('private-webhook'), false);
assert.equal(serialized.includes(parsed.masterKey.toString('base64url')), false);
assert.deepEqual(Object.keys(created.record).sort(), ['blob', 'deleteVerifier', 'expiresInSeconds', 'id']);
assert.equal(created.record.expiresInSeconds, 604_800);
assert.equal(created.record.expiresInSeconds, null);
});
it('supports the allowed validity periods with seven days as the default', () => {
it('supports the allowed validity periods with unlimited validity as the default', () => {
const { createOnlineBackup, normalizeOnlineBackupRetention } = require('../lib/online-backup');
const createdAt = '2026-08-09T00:00:00.000Z';
const expected = new Map([
@@ -64,7 +64,10 @@ describe('online backup key', () => {
['forever', [null, null]]
]);
assert.equal(createOnlineBackup(settings(), '2.1.41', createdAt).record.expiresInSeconds, 604_800);
assert.equal(normalizeOnlineBackupRetention(), 'forever');
const defaultBackup = createOnlineBackup(settings(), '2.1.41', createdAt);
assert.equal(defaultBackup.record.expiresInSeconds, null);
assert.equal(defaultBackup.expiresAt, null);
for (const [retention, [seconds, expiresAt]] of expected) {
const created = createOnlineBackup(settings(), '2.1.41', createdAt, retention);
assert.equal(created.record.expiresInSeconds, seconds);
+1 -1
View File
@@ -1475,7 +1475,7 @@ setTimeout(async () => {
check('Online backup controls exist', onlineBackupControls);
const onlineBackupRetentionState = await wc.executeJavaScript('(() => { const select = document.getElementById("onlineBackupRetentionSelect"); const wrapper = select.closest(".online-backup-retention-select"); return { value: select.value, options: [...select.options].map(option => option.value + ":" + option.textContent), arrowRight: getComputedStyle(wrapper, "::after").right, fontSize: getComputedStyle(select).fontSize }; })()');
check('Online backup validity defaults to seven days and offers every requested duration', onlineBackupRetentionState.value === '7d' && onlineBackupRetentionState.options.join('|') === '1d:24 Stunden|3d:3 Tage|7d:7 Tage (Standard)|31d:31 Tage|forever:Unbegrenzt' && onlineBackupRetentionState.arrowRight === '14px' && parseFloat(onlineBackupRetentionState.fontSize) >= 10);
check('Online backup validity defaults to unlimited and offers every requested duration', onlineBackupRetentionState.value === 'forever' && onlineBackupRetentionState.options.join('|') === '1d:24 Stunden|3d:3 Tage|7d:7 Tage|31d:31 Tage|forever:Unbegrenzt (Standard)' && onlineBackupRetentionState.arrowRight === '14px' && parseFloat(onlineBackupRetentionState.fontSize) >= 10);
const onlineBackupKeyContract = await wc.executeJavaScript('document.getElementById("onlineBackupKeyInput")?.maxLength + "|" + document.getElementById("onlineBackupKeyInput")?.getAttribute("pattern")');
check('Online backup input enforces the 75-character MHU key format', onlineBackupKeyContract === '75|MHU2-[A-Za-z0-9_-]{70}');