feat: add expiring backups and live account checks
CI / verify (push) Canceled after 0s

This commit is contained in:
Sucukdeluxe
2026-09-01 15:43:20 +02:00
parent 96037f2e1c
commit 9e5c5126dd
19 changed files with 710 additions and 128 deletions
+22 -10
View File
@@ -28,10 +28,12 @@ function createFixture(overrides = {}) {
entries.set(id, {
id,
displayKey: `${key.slice(0, 9)}${key.slice(-4)}`,
createdAt: '2026-08-22T10:00:00.000Z'
createdAt: '2026-08-22T10:00:00.000Z',
expiresAt: null
});
}
let createdAt;
let expiresAt;
let createArguments;
const removalPlans = new WeakMap();
const keyring = {
@@ -43,11 +45,12 @@ function createFixture(overrides = {}) {
issues: overrides.listIssues || []
};
},
prepare: (value, timestamp) => {
prepare: (value, timestamp, expiration) => {
events.push('prepare');
if (overrides.prepareError) throw overrides.prepareError;
createdAt = timestamp;
return { id, encryptedKey: 'encrypted-key', createdAt: timestamp };
expiresAt = expiration ?? null;
return { id, encryptedKey: 'encrypted-key', createdAt: timestamp, expiresAt };
},
commit: async (entry) => {
events.push('commit');
@@ -56,7 +59,8 @@ function createFixture(overrides = {}) {
entries.set(entry.id, {
id: entry.id,
displayKey: `${key.slice(0, 9)}${key.slice(-4)}`,
createdAt: entry.createdAt
createdAt: entry.createdAt,
expiresAt: entry.expiresAt ?? null
});
},
getKey: async (entryId) => {
@@ -90,7 +94,8 @@ function createFixture(overrides = {}) {
appVersion: () => '2.1.31',
createBackup: (...args) => {
createArguments = args;
return { key, record };
const expiration = args[3] === 'forever' ? null : new Date(new Date(args[2]).getTime() + 7 * 24 * 60 * 60 * 1000).toISOString();
return { key, record, expiresAt: expiration };
},
uploadBackup: async (uploadedRecord) => {
events.push('upload');
@@ -112,6 +117,9 @@ function createFixture(overrides = {}) {
get createdAt() {
return createdAt;
},
get expiresAt() {
return expiresAt;
},
get createArguments() {
return createArguments;
}
@@ -174,14 +182,15 @@ 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]);
assert.deepEqual(fixture.createArguments, [settings, '2.1.31', fixture.createdAt, '7d']);
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,
entry: {
id,
displayKey: `${key.slice(0, 9)}${key.slice(-4)}`,
createdAt: fixture.createdAt
createdAt: fixture.createdAt,
expiresAt: fixture.expiresAt
}
});
assert.equal(JSON.stringify(result).includes(key), false);
@@ -202,7 +211,8 @@ describe('transactional online backup manager', () => {
entry: {
id,
displayKey: `${key.slice(0, 9)}${key.slice(-4)}`,
createdAt: fixture.createdAt
createdAt: fixture.createdAt,
expiresAt: fixture.expiresAt
}
});
});
@@ -445,7 +455,8 @@ describe('transactional online backup manager', () => {
entries: [{
id,
displayKey: `${key.slice(0, 9)}${key.slice(-4)}`,
createdAt: '2026-08-22T10:00:00.000Z'
createdAt: '2026-08-22T10:00:00.000Z',
expiresAt: null
}]
});
fixture.keyring.list = async () => {
@@ -464,7 +475,8 @@ describe('transactional online backup manager', () => {
entries: [{
id,
displayKey: `${key.slice(0, 9)}${key.slice(-4)}`,
createdAt: '2026-08-22T10:00:00.000Z'
createdAt: '2026-08-22T10:00:00.000Z',
expiresAt: null
}],
warningCode: 'KEYRING_DECRYPT_FAILED',
warning: 'Gespeicherter Online-Sicherungsschlüssel konnte nicht entschlüsselt werden'