diff --git a/src/backuptargets.js b/src/backuptargets.js index 40376e281..ca13528a8 100644 --- a/src/backuptargets.js +++ b/src/backuptargets.js @@ -133,6 +133,7 @@ function removePrivateFields(target) { function validateName(name) { assert.strictEqual(typeof name, 'string'); + if (name.length === 0) return new BoxError(BoxError.BAD_FIELD, 'name cannot be empty'); if (name.length > 48) return new BoxError(BoxError.BAD_FIELD, 'name too long'); } @@ -486,14 +487,20 @@ async function add(data, auditSource) { return id; } -async function addDefault() { - return await add({ +async function addDefault(auditSource) { + assert.strictEqual(typeof auditSource, 'object'); + + debug('addDefault: adding default backup target'); + const defaultBackupTarget = { name: 'Default', provider: 'filesystem', config: { backupDir: paths.DEFAULT_BACKUP_DIR }, retention: { keepWithinSecs: 2 * 24 * 60 * 60 }, - schedule: '00 00 23 * * *' - }); + schedule: '00 00 23 * * *', + format: 'tgz' + }; + defaultBackupTarget.id = await add(defaultBackupTarget, auditSource); + await setPrimary(defaultBackupTarget, auditSource); } // creates a backup target object that is not in the database diff --git a/src/paths.js b/src/paths.js index 31ff00f84..921fdd169 100644 --- a/src/paths.js +++ b/src/paths.js @@ -26,7 +26,7 @@ exports = module.exports = { PROVIDER_FILE: '/etc/cloudron/PROVIDER', - DEFAULT_BACKUP_DIR: '/var/backups', + DEFAULT_BACKUP_DIR: constants.TEST ? '/tmp/backups' : '/var/backups', VOLUMES_MOUNT_DIR: '/mnt/volumes', MANAGED_BACKUP_MOUNT_DIR: '/mnt/managedbackups', DOCKER_SOCKET_PATH: '/var/run/docker.sock', diff --git a/src/provision.js b/src/provision.js index ccf727c08..65560e83a 100644 --- a/src/provision.js +++ b/src/provision.js @@ -86,7 +86,7 @@ async function setupTask(domain, auditSource) { await reverseProxy.ensureCertificate(location, {}, auditSource); await ensureDhparams(); await dashboard.setupLocation(constants.DASHBOARD_SUBDOMAIN, domain, auditSource); - await backupTargets.addDefault(); + await backupTargets.addDefault(auditSource); setProgress('setup', 'Done'), await eventlog.add(eventlog.ACTION_PROVISION, auditSource, {}); } catch (error) { diff --git a/src/routes/test/backuptargets-test.js b/src/routes/test/backuptargets-test.js index 02cea88d3..2acb1e2e0 100644 --- a/src/routes/test/backuptargets-test.js +++ b/src/routes/test/backuptargets-test.js @@ -15,7 +15,7 @@ describe('Backups API', function () { const newTarget = { provider: 'filesystem', - label: 'NewTarget', + name: 'NewTarget', config: { backupDir: '/tmp/boxtest-newtarget' }, format: 'tgz', retention: { keepWithinSecs: 60 * 60 }, @@ -24,7 +24,7 @@ describe('Backups API', function () { const encryptedTarget = { provider: 'filesystem', - label: 'EncryptedTarget', + name: 'EncryptedTarget', config: { backupDir: '/tmp/boxtest-enctarget' }, format: 'rsync', retention: { keepMonthly: 60 }, @@ -74,7 +74,7 @@ describe('Backups API', function () { expect(tmp.provider).to.be(newTarget.provider); expect(tmp.config).to.be.ok(); expect(tmp.format).to.be(newTarget.format); - expect(tmp.label).to.be(newTarget.label); + expect(tmp.name).to.be(newTarget.name); expect(tmp.primary).to.be(false); }); }); @@ -87,7 +87,7 @@ describe('Backups API', function () { expect(response.body.provider).to.be(newTarget.provider); expect(response.body.config).to.be.ok(); expect(response.body.format).to.be(newTarget.format); - expect(response.body.label).to.be(newTarget.label); + expect(response.body.name).to.be(newTarget.name); expect(response.body.primary).to.be(false); }); @@ -98,7 +98,7 @@ describe('Backups API', function () { expect(response.body.provider).to.be(encryptedTarget.provider); expect(response.body.config).to.be.ok(); expect(response.body.format).to.be(encryptedTarget.format); - expect(response.body.label).to.be(encryptedTarget.label); + expect(response.body.name).to.be(encryptedTarget.name); expect(response.body.primary).to.be(false); expect(response.body.encrypted).to.be(true); expect(response.body.encryptedFilenames).to.be(true); diff --git a/src/routes/test/common.js b/src/routes/test/common.js index 193db43c0..c710a532b 100644 --- a/src/routes/test/common.js +++ b/src/routes/test/common.js @@ -117,16 +117,6 @@ async function setupServer() { await database.initialize(); await database._clear(); await appstore._setApiServerOrigin(exports.mockApiServerOrigin); - // duplicated here since we clear the database - const id = await backupTargets.add({ - provider: 'filesystem', - label: 'Default', - config: { backupDir: '/tmp/boxtest' }, - format: 'tgz', - retention: { keepWithinSecs: 2 * 24 * 60 * 60 }, - schedule: '00 00 23 * * *' - }, exports.auditSource); - await backupTargets.setPrimary({ id }, exports.auditSource); await oidcServer.stop(); await server.start(); debug('Set up server complete'); @@ -244,6 +234,6 @@ async function waitForAsyncTask(es) { } async function getDefaultBackupTarget() { - const result = await backupTargets.list(1, 1); - return result[0]; + const result = await backupTargets.list(1, 10); + return result.find(r => r.name === 'Default'); } diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 37b2e61c0..92c29002c 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -263,7 +263,7 @@ function validateDestDir(dir) { if (!dir.endsWith('/')) dir = dir + '/'; // ensure trailing slash for the prefix matching to work const PROTECTED_PREFIXES = [ '/boot/', '/usr/', '/bin/', '/lib/', '/root/', '/var/lib/', paths.baseDir() ]; - if (PROTECTED_PREFIXES.some(p => dir.startsWith(p))) return new BoxError(BoxError.BAD_FIELD, 'backupDir path is protected'); + if (PROTECTED_PREFIXES.some(p => dir.startsWith(p))) return new BoxError(BoxError.BAD_FIELD, `backupDir ${dir} is protected`); return null; } diff --git a/src/test/backuptargets-test.js b/src/test/backuptargets-test.js index baab0c8d9..ac90e2ded 100644 --- a/src/test/backuptargets-test.js +++ b/src/test/backuptargets-test.js @@ -25,7 +25,7 @@ describe('backups', function () { const backupTarget = { provider: 'filesystem', - label: 'Another', + name: 'Another', config: { backupDir: '/tmp/boxtest2' }, format: 'rsync', retention: { keepWithinSecs: 2 * 24 * 60 * 60 }, diff --git a/src/test/common.js b/src/test/common.js index 0935eaaeb..b5e1a0b63 100644 --- a/src/test/common.js +++ b/src/test/common.js @@ -224,7 +224,7 @@ async function databaseSetup() { // duplicated here since we clear the database const id = await backupTargets.add({ provider: 'filesystem', - label: 'Default', + name: 'Default', config: { backupDir: '/tmp/boxtest' }, format: 'tgz', retention: { keepWithinSecs: 2 * 24 * 60 * 60 },