refactor: expose online backup deletion outcome

This commit is contained in:
Sucukdeluxe
2026-08-22 10:29:31 +02:00
parent b55f99de24
commit 84032e0e68
2 changed files with 38 additions and 4 deletions
+3 -3
View File
@@ -235,9 +235,9 @@ async function deleteOnlineBackup(key, baseUrl = ONLINE_BACKUP_API_URL, options)
headers: { 'content-type': 'application/json', accept: 'application/json' },
body: JSON.stringify({ id: parsed.id, deleteSecret })
}, options);
if (response.status !== 204) {
throw new Error(response.status === 404 ? 'Online-Sicherung wurde nicht gefunden' : 'Online-Sicherung konnte nicht gelöscht werden');
}
if (response.status === 204) return { deleted: true, notFound: false };
if (response.status === 404) return { deleted: false, notFound: true };
throw new Error('Online-Sicherung konnte nicht gelöscht werden');
}
module.exports = {
+35 -1
View File
@@ -110,7 +110,7 @@ describe('online backup transport', () => {
await uploadOnlineBackup(created.record, baseUrl);
const restored = await downloadOnlineBackup(created.key, baseUrl);
await deleteOnlineBackup(created.key, baseUrl);
assert.deepEqual(await deleteOnlineBackup(created.key, baseUrl), { deleted: true, notFound: false });
assert.deepEqual(restored.settings, settings());
assert.equal(JSON.stringify(stored).includes(parseOnlineBackupKey(created.key).masterKey.toString('base64url')), false);
@@ -119,6 +119,40 @@ describe('online backup transport', () => {
assert.equal(requestedUrls.join(' ').includes(stored.id), false);
});
it('returns an idempotent outcome when the backup is already missing', async () => {
const { createOnlineBackup, deleteOnlineBackup } = require('../lib/online-backup');
const server = http.createServer((_request, response) => {
response.writeHead(404, { 'content-type': 'application/json' });
response.end('{"error":"not_found"}');
});
servers.push(server);
server.listen(0, '127.0.0.1');
await once(server, 'listening');
const missingBaseUrl = `http://127.0.0.1:${server.address().port}`;
const { key } = createOnlineBackup(settings(), '2.0.3');
assert.deepEqual(await deleteOnlineBackup(key, missingBaseUrl), { deleted: false, notFound: true });
});
it('uses the generic deletion error without reflecting the server response body', async () => {
const { createOnlineBackup, deleteOnlineBackup } = require('../lib/online-backup');
const server = http.createServer((_request, response) => {
response.writeHead(500, { 'content-type': 'application/json' });
response.end('{"leaked":"server-secret-value"}');
});
servers.push(server);
server.listen(0, '127.0.0.1');
await once(server, 'listening');
const baseUrl = `http://127.0.0.1:${server.address().port}`;
const { key } = createOnlineBackup(settings(), '2.0.3');
await assert.rejects(
deleteOnlineBackup(key, baseUrl),
(error) => error.message === 'Online-Sicherung konnte nicht gelöscht werden'
&& !error.message.includes('server-secret-value')
);
});
it('does not reflect server response bodies into client errors', async () => {
const { createOnlineBackup, uploadOnlineBackup } = require('../lib/online-backup');
const server = http.createServer((_request, response) => {