diff --git a/src/platform.js b/src/platform.js index 7175c43c5..3eb0a105e 100644 --- a/src/platform.js +++ b/src/platform.js @@ -260,7 +260,7 @@ function createMailConfig(callback) { settings.getMailRelay(function (error, relay) { if (error) return callback(error); - const enabled = relay.enabled || false, + const enabled = relay.provider === 'cloudron-smtp' ? true : false, host = relay.host || '', port = relay.port || 25, tls = !!relay.tls, diff --git a/src/routes/settings.js b/src/routes/settings.js index 0ad502ee1..2b50bad56 100644 --- a/src/routes/settings.js +++ b/src/routes/settings.js @@ -142,7 +142,7 @@ function getMailRelay(req, res, next) { function setMailRelay(req, res, next) { assert.strictEqual(typeof req.body, 'object'); - if (typeof req.body.enabled !== 'boolean') return next(new HttpError(400, 'enabled is required')); + if (typeof req.body.provider !== 'string') return next(new HttpError(400, 'provider is required')); if ('host' in req.body && typeof req.body.host !== 'string') return next(new HttpError(400, 'host must be a string')); if ('port' in req.body && typeof req.body.port !== 'number') return next(new HttpError(400, 'port must be a string')); if ('tls' in req.body && typeof req.body.tls !== 'boolean') return next(new HttpError(400, 'tls must be a boolean')); diff --git a/src/routes/test/settings-test.js b/src/routes/test/settings-test.js index 63d7566a6..7fb7b5e2d 100644 --- a/src/routes/test/settings-test.js +++ b/src/routes/test/settings-test.js @@ -15,9 +15,10 @@ var appdb = require('../../appdb.js'), expect = require('expect.js'), path = require('path'), paths = require('../../paths.js'), - superagent = require('superagent'), server = require('../../server.js'), settings = require('../../settings.js'), + settingsdb = require('../../settingsdb.js'), + superagent = require('superagent'), fs = require('fs'), nock = require('nock'); @@ -321,12 +322,12 @@ describe('Settings API', function () { .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ enabled: false }); + expect(res.body).to.eql({ provider: 'cloudron-smtp' }); done(); }); }); - it('cannot set without enabled field', function (done) { + it('cannot set without provider field', function (done) { superagent.post(SERVER_URL + '/api/v1/settings/mail_relay') .query({ access_token: token }) .send({ }) @@ -339,30 +340,36 @@ describe('Settings API', function () { it('cannot set with bad host', function (done) { superagent.post(SERVER_URL + '/api/v1/settings/mail_relay') .query({ access_token: token }) - .send({ enabled: true, host: true }) + .send({ provider: 'external-smtp', host: true }) .end(function (err, res) { expect(res.statusCode).to.equal(400); done(); }); }); - it('set succeeds', function (done) { + it('set fails because mail server is unreachable', function (done) { superagent.post(SERVER_URL + '/api/v1/settings/mail_relay') .query({ access_token: token }) - .send({ enabled: true, host: 'host', port: 25, username: 'u', password: 'p', tls: true }) + .send({ provider: 'external-smtp', host: 'host', port: 25, username: 'u', password: 'p', tls: true }) .end(function (err, res) { - expect(res.statusCode).to.equal(202); + expect(res.statusCode).to.equal(400); done(); }); }); it('get succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/settings/mail_relay') - .query({ access_token: token }) - .end(function (err, res) { - expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ enabled: true, host: 'host', port: 25, username: 'u', password: 'p', tls: true }); - done(); + var relay = { provider: 'external-smtp', host: 'host', port: 25, username: 'u', password: 'p', tls: true }; + + settingsdb.set(settings.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { // skip the mail server verify() + expect(error).to.not.be.ok(); + + superagent.get(SERVER_URL + '/api/v1/settings/mail_relay') + .query({ access_token: token }) + .end(function (err, res) { + expect(res.statusCode).to.equal(200); + expect(res.body).to.eql(relay); + done(); + }); }); }); }); diff --git a/src/settings.js b/src/settings.js index 840e97ec4..308c48b48 100644 --- a/src/settings.js +++ b/src/settings.js @@ -115,7 +115,7 @@ var gDefaults = (function () { result[exports.UPDATE_CONFIG_KEY] = { prerelease: false }; result[exports.APPSTORE_CONFIG_KEY] = {}; result[exports.MAIL_CONFIG_KEY] = { enabled: false }; - result[exports.MAIL_RELAY_KEY] = { enabled: false }; + result[exports.MAIL_RELAY_KEY] = { provider: 'cloudron-smtp' }; result[exports.CATCH_ALL_ADDRESS] = [ ]; return result; @@ -682,6 +682,20 @@ function setMailRelay(relay, callback) { assert.strictEqual(typeof relay, 'object'); assert.strictEqual(typeof callback, 'function'); + function save() { + settingsdb.set(exports.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { + if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); + + exports.events.emit(exports.MAIL_RELAY_KEY, relay); + + platform.createMailConfig(NOOP_CALLBACK); + + callback(null); + }); + } + + if (relay.provider === 'cloudron-smtp') return save(); + var transporter = nodemailer.createTransport(smtpTransport({ host: relay.host, port: relay.port, @@ -694,15 +708,7 @@ function setMailRelay(relay, callback) { transporter.verify(function(error) { if (error) return callback(new SettingsError(SettingsError.BAD_FIELD, error.message)); - settingsdb.set(exports.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { - if (error) return callback(new SettingsError(SettingsError.INTERNAL_ERROR, error)); - - exports.events.emit(exports.MAIL_RELAY_KEY, relay); - - platform.createMailConfig(NOOP_CALLBACK); - - callback(null); - }); + save(); }); } diff --git a/src/test/settings-test.js b/src/test/settings-test.js index 2206bab93..b9c5d0acc 100644 --- a/src/test/settings-test.js +++ b/src/test/settings-test.js @@ -9,7 +9,8 @@ var async = require('async'), config = require('../config.js'), database = require('../database.js'), expect = require('expect.js'), - settings = require('../settings.js'); + settings = require('../settings.js'), + settingsdb = require('../settingsdb.js'); function setup(done) { config.set('provider', 'caas'); @@ -184,18 +185,19 @@ describe('Settings', function () { it('can get mail relay', function (done) { settings.getMailRelay(function (error, address) { expect(error).to.be(null); - expect(address).to.eql({ enabled: false }); + expect(address).to.eql({ provider: 'cloudron-smtp' }); done(); }); }); it('can set mail relay', function (done) { - settings.setMailRelay({ enabled: true, host: 'mx.foo.com', port: 25 }, function (error) { + var relay = { provider: 'external-smtp', host: 'mx.foo.com', port: 25 }; ++ settingsdb.set(settings.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { // skip the mail server verify() expect(error).to.be(null); settings.getMailRelay(function (error, address) { expect(error).to.be(null); - expect(address).to.eql({ enabled: true, host: 'mx.foo.com', port: 25 }); + expect(address).to.eql(relay); done(); }); }); diff --git a/webadmin/src/views/email.html b/webadmin/src/views/email.html index a5354797f..433d5a716 100644 --- a/webadmin/src/views/email.html +++ b/webadmin/src/views/email.html @@ -75,11 +75,11 @@