diff --git a/src/backups.js b/src/backups.js index 97b24c00f..7427d36fd 100644 --- a/src/backups.js +++ b/src/backups.js @@ -3,6 +3,8 @@ exports = module.exports = { BackupsError: BackupsError, + testConfig: testConfig, + getPaged: getPaged, getByAppIdPaged: getByAppIdPaged, @@ -42,6 +44,7 @@ var addons = require('./addons.js'), safe = require('safetydance'), shell = require('./shell.js'), settings = require('./settings.js'), + SettingsError = require('./settings.js').SettingsError, util = require('util'), webhooks = require('./webhooks.js'); @@ -93,6 +96,16 @@ function api(provider) { } } +function testConfig(backupConfig, callback) { + assert.strictEqual(typeof backupConfig, 'object'); + assert.strictEqual(typeof callback, 'function'); + + var func = api(backupConfig.provider); + if (!func) return callback(new SettingsError(SettingsError.BAD_FIELD, 'unkown storage provider')); + + api(backupConfig.provider).testConfig(backupConfig, callback); +} + function getPaged(page, perPage, callback) { assert(typeof page === 'number' && page > 0); assert(typeof perPage === 'number' && perPage > 0); diff --git a/src/settings.js b/src/settings.js index 789f9abea..79f018602 100644 --- a/src/settings.js +++ b/src/settings.js @@ -54,6 +54,7 @@ exports = module.exports = { }; var assert = require('assert'), + backups = require('./backups.js'), config = require('./config.js'), CronJob = require('cron').CronJob, DatabaseError = require('./databaseerror.js'), @@ -115,6 +116,15 @@ SettingsError.EXTERNAL_ERROR = 'External Error'; SettingsError.NOT_FOUND = 'Not Found'; SettingsError.BAD_FIELD = 'Bad Field'; +function validateBackupConfig(backupConfig, callback) { + assert.strictEqual(typeof backupConfig, 'object'); + assert.strictEqual(typeof callback, 'function'); + + if (process.env.BOX_ENV === 'test') return callback(); + + backups.testConfig(backupConfig, callback); +} + function setAutoupdatePattern(pattern, callback) { assert.strictEqual(typeof pattern, 'string'); assert.strictEqual(typeof callback, 'function'); @@ -388,23 +398,16 @@ function setBackupConfig(backupConfig, callback) { assert.strictEqual(typeof backupConfig, 'object'); assert.strictEqual(typeof callback, 'function'); - if (backupConfig.provider === 'caas') { - if (config.provider() !== 'caas') return callback(new SettingsError(SettingsError.BAD_FIELD, 'provider must be caas')); - } else if (backupConfig.provider === 'filesystem') { - if (typeof backupConfig.backupFolder !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'backupFolder must be string')); - } else if (backupConfig.provider === 's3') { - if (typeof backupConfig.accessKeyId !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'accessKeyId must be a string')); - if (typeof backupConfig.secretAccessKey !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'secretAccessKey must be a string')); - if (typeof backupConfig.bucket !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'bucket must be a string')); - if (typeof backupConfig.prefix !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'prefix must be a string')); - } + validateBackupConfig(backupConfig, function (error) { + if (error) return callback(error); - settingsdb.set(exports.BACKUP_CONFIG_KEY, JSON.stringify(backupConfig), function (error) { - if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); + settingsdb.set(exports.BACKUP_CONFIG_KEY, JSON.stringify(backupConfig), function (error) { + if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); - exports.events.emit(exports.BACKUP_CONFIG_KEY, backupConfig); + exports.events.emit(exports.BACKUP_CONFIG_KEY, backupConfig); - callback(null); + callback(null); + }); }); } diff --git a/src/storage/caas.js b/src/storage/caas.js index 586757f93..cda1bd88d 100644 --- a/src/storage/caas.js +++ b/src/storage/caas.js @@ -9,13 +9,16 @@ exports = module.exports = { getLocalFilePath: getLocalFilePath, copyObject: copyObject, - removeBackup: removeBackup + removeBackup: removeBackup, + + testConfig: testConfig }; var assert = require('assert'), AWS = require('aws-sdk'), config = require('../config.js'), safe = require('safetydance'), + SettingsError = require('../settings.js').SettingsError, superagent = require('superagent'); function getBackupCredentials(apiConfig, callback) { @@ -171,3 +174,12 @@ function removeBackup(apiConfig, backupId, appBackupIds, callback) { callback(new Error('not implemented')); } + +function testConfig(apiConfig, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof callback, 'function'); + + if (config.provider() !== 'caas') return callback(new SettingsError(SettingsError.BAD_FIELD, 'instance provider must be caas')); + + callback(); +} diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index aea76e683..17a9ac6c8 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -9,7 +9,9 @@ exports = module.exports = { getLocalFilePath: getLocalFilePath, copyObject: copyObject, - removeBackup: removeBackup + removeBackup: removeBackup, + + testConfig: testConfig }; var assert = require('assert'), @@ -19,6 +21,7 @@ var assert = require('assert'), fs = require('fs'), path = require('path'), safe = require('safetydance'), + SettingsError = require('../settings.js').SettingsError, shell = require('../shell.js'), util = require('util'); @@ -139,3 +142,12 @@ function removeBackup(apiConfig, backupId, appBackupIds, callback) { }); }, callback); } + +function testConfig(apiConfig, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof callback, 'function'); + + if (typeof apiConfig.backupFolder !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'backupFolder must be string')); + + callback(); +} diff --git a/src/storage/interface.js b/src/storage/interface.js index 6e3fb0696..26aa692f6 100644 --- a/src/storage/interface.js +++ b/src/storage/interface.js @@ -15,7 +15,9 @@ exports = module.exports = { getLocalFilePath: getLocalFilePath, copyObject: copyObject, - removeBackup: removeBackup + removeBackup: removeBackup, + + testConfig: testConfig }; var assert = require('assert'); @@ -100,3 +102,12 @@ function removeBackup(apiConfig, backupId, appBackupIds, callback) { callback(new Error('not implemented')); } + +function testConfig(apiConfig, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof callback, 'function'); + + // Result: none + + callback(new Error('not implemented')); +} diff --git a/src/storage/s3.js b/src/storage/s3.js index 51cf40d8a..0058a4bd6 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -9,12 +9,15 @@ exports = module.exports = { getLocalFilePath: getLocalFilePath, copyObject: copyObject, - removeBackup: removeBackup + removeBackup: removeBackup, + + testConfig: testConfig }; var assert = require('assert'), AWS = require('aws-sdk'), safe = require('safetydance'), + SettingsError = require('../settings.js').SettingsError, superagent = require('superagent'); function getBackupCredentials(apiConfig, callback) { @@ -150,3 +153,15 @@ function removeBackup(apiConfig, backupId, appBackupIds, callback) { callback(new Error('not implemented')); } + +function testConfig(apiConfig, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof callback, 'function'); + + if (typeof apiConfig.accessKeyId !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'accessKeyId must be a string')); + if (typeof apiConfig.secretAccessKey !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'secretAccessKey must be a string')); + if (typeof apiConfig.bucket !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'bucket must be a string')); + if (typeof apiConfig.prefix !== 'string') return callback(new SettingsError(SettingsError.BAD_FIELD, 'prefix must be a string')); + + callback(); +}