diff --git a/src/routes/settings.js b/src/routes/settings.js index a729feb49..52f7df674 100644 --- a/src/routes/settings.js +++ b/src/routes/settings.js @@ -10,7 +10,10 @@ exports = module.exports = { setCloudronName: setCloudronName, getCloudronAvatar: getCloudronAvatar, - setCloudronAvatar: setCloudronAvatar + setCloudronAvatar: setCloudronAvatar, + + getDnsConfig: getDnsConfig, + setDnsConfig: setDnsConfig }; var assert = require('assert'), @@ -83,3 +86,26 @@ function getCloudronAvatar(req, res, next) { res.status(200).send(avatar); }); } + +function getDnsConfig(req, res, next) { + settings.getDnsConfig(function (error, config) { + if (error) return next(new HttpError(500, error)); + + next(new HttpSuccess(200, config)); + }); +} + +function setDnsConfig(req, res, next) { + assert.strictEqual(typeof req.body, 'object'); + + if (req.body.provider !== 'route53') return next(new HttpError(400, 'provider is required')); + if (typeof req.body.accessKeyId !== 'string') return next(new HttpError(400, 'accessKeyId is required')); + if (typeof req.body.secretAccessKey !== 'string') return next(new HttpError(400, 'secretAccessKey is required')); + + settings.setDnsConfig(req.body, function (error) { + if (error && error.reason === SettingsError.BAD_FIELD) return next(new HttpError(400, error.message)); + if (error) return next(new HttpError(500, error)); + + next(new HttpSuccess(200)); + }); +} diff --git a/src/routes/test/settings-test.js b/src/routes/test/settings-test.js index 0cfd94aa9..b7349935b 100644 --- a/src/routes/test/settings-test.js +++ b/src/routes/test/settings-test.js @@ -229,5 +229,46 @@ describe('Settings API', function () { }); }); }); + + describe('dns_config', function () { + it('get dns_config fails', function (done) { + request.get(SERVER_URL + '/api/v1/settings/dns_config') + .query({ access_token: token }) + .end(function (err, res) { + expect(res.statusCode).to.equal(200); + expect(res.body).to.eql({}); + done(err); + }); + }); + + it('cannot set without data', function (done) { + request.post(SERVER_URL + '/api/v1/settings/dns_config') + .query({ access_token: token }) + .end(function (err, res) { + expect(res.statusCode).to.equal(400); + done(); + }); + }); + + it('set succeeds', function (done) { + request.post(SERVER_URL + '/api/v1/settings/dns_config') + .query({ access_token: token }) + .send({ provider: 'route53', accessKeyId: 'accessKey', secretAccessKey: 'secretAccessKey' }) + .end(function (err, res) { + expect(res.statusCode).to.equal(200); + done(); + }); + }); + + it('get succeeds', function (done) { + request.get(SERVER_URL + '/api/v1/settings/dns_config') + .query({ access_token: token }) + .end(function (err, res) { + expect(res.statusCode).to.equal(200); + expect(res.body).to.eql({ provider: 'route53', accessKeyId: 'accessKey', secretAccessKey: 'secretAccessKey', region: 'us-east-1' }); + done(err); + }); + }); + }); }); diff --git a/src/server.js b/src/server.js index 89807e2fe..d77729321 100644 --- a/src/server.js +++ b/src/server.js @@ -161,6 +161,8 @@ function initializeExpressSync() { router.post('/api/v1/settings/cloudron_name', settingsScope, routes.settings.setCloudronName); router.get ('/api/v1/settings/cloudron_avatar', settingsScope, routes.settings.getCloudronAvatar); router.post('/api/v1/settings/cloudron_avatar', settingsScope, multipart, routes.settings.setCloudronAvatar); + router.get ('/api/v1/settings/dns_config', settingsScope, routes.settings.getDnsConfig); + router.post('/api/v1/settings/dns_config', settingsScope, routes.settings.setDnsConfig); // backup routes router.get ('/api/v1/backups', settingsScope, routes.backups.get); diff --git a/src/settings.js b/src/settings.js index fe3ee51b6..6ffa218eb 100644 --- a/src/settings.js +++ b/src/settings.js @@ -30,7 +30,7 @@ exports = module.exports = { TIME_ZONE_KEY: 'time_zone', CLOUDRON_NAME_KEY: 'cloudron_name', DEVELOPER_MODE_KEY: 'developer_mode', - DNS_CREDENTIALS_KEY: 'dns_credentials', + DNS_CONFIG_KEY: 'dns_config', events: new (require('events').EventEmitter)() }; @@ -51,6 +51,7 @@ var gDefaults = (function () { result[exports.TIME_ZONE_KEY] = 'America/Los_Angeles'; result[exports.CLOUDRON_NAME_KEY] = 'Cloudron'; result[exports.DEVELOPER_MODE_KEY] = false; + result[exports.DNS_CONFIG_KEY] = { }; return result; })(); @@ -214,8 +215,8 @@ function setDeveloperMode(enabled, callback) { function getDnsConfig(callback) { assert.strictEqual(typeof callback, 'function'); - settingsdb.get(exports.DNS_CREDENTIALS_KEY, function (error, value) { - if (error && error.reason === DatabaseError.NOT_FOUND) return callback(new SettingsError(SettingsError.NOT_FOUND)); + settingsdb.get(exports.DNS_CONFIG_KEY, function (error, value) { + if (error && error.reason === DatabaseError.NOT_FOUND) return callback(null, gDefaults[exports.DNS_CONFIG_KEY]); if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); callback(null, JSON.parse(value)); // accessKeyId, secretAccessKey, region @@ -226,6 +227,10 @@ function setDnsConfig(dnsConfig, callback) { assert.strictEqual(typeof dnsConfig, 'object'); assert.strictEqual(typeof callback, 'function'); + if (dnsConfig.provider !== 'route53') return callback(new SettingsError(SettingsError.BAD_FIELD, 'provider must be route53')); + if (dnsConfig.accessKeyId === '') return callback(new SettingsError(SettingsError.BAD_FIELD, 'accessKeyId must not be empty')); + if (dnsConfig.secretAccessKey === '') return callback(new SettingsError(SettingsError.BAD_FIELD, 'secretAccessKey must not be empty')); + var credentials = { provider: dnsConfig.provider, accessKeyId: dnsConfig.accessKeyId, @@ -233,7 +238,7 @@ function setDnsConfig(dnsConfig, callback) { region: dnsConfig.region || 'us-east-1' }; - settingsdb.set(exports.DNS_CREDENTIALS_KEY, JSON.stringify(credentials), function (error) { + settingsdb.set(exports.DNS_CONFIG_KEY, JSON.stringify(credentials), function (error) { if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); callback(null);