diff --git a/src/mail.js b/src/mail.js index fa4eb265b..902b0c34b 100644 --- a/src/mail.js +++ b/src/mail.js @@ -134,8 +134,6 @@ function verifyRelay(relay, callback) { assert.strictEqual(typeof relay, 'object'); assert.strictEqual(typeof callback, 'function'); - if (process.env.BOX_ENV === 'test') return callback(); - var verifier = relay.provider === 'cloudron-smtp' ? checkOutboundPort25 : checkSmtpRelay.bind(null, relay); verifier(function (error) { @@ -372,7 +370,8 @@ function checkRblStatus(callback) { }); } -function getStatus(callback) { +function getStatus(domain, callback) { + assert.strictEqual(typeof domain, 'string'); assert.strictEqual(typeof callback, 'function'); var results = {}; @@ -389,7 +388,7 @@ function getStatus(callback) { }; } - get(config.fqdn(), function (error, mailConfig) { + get(domain, function (error, mailConfig) { if (error) return callback(error); var checks = [ diff --git a/src/routes/mail.js b/src/routes/mail.js index eb5c5d473..e17cfb3a1 100644 --- a/src/routes/mail.js +++ b/src/routes/mail.js @@ -98,7 +98,7 @@ function setMailEnabled(req, res, next) { if (typeof req.body.enabled !== 'boolean') return next(new HttpError(400, 'enabled is required')); - mail.setMailEnabled(req.params.domain, { enabled: req.body.enabled }, function (error) { + mail.setMailEnabled(req.params.domain, !!req.body.enabled, function (error) { if (error && error.reason === MailError.NOT_FOUND) return next(new HttpError(404, error.message)); if (error && error.reason === MailError.BAD_FIELD) return next(new HttpError(400, error.message)); if (error) return next(new HttpError(500, error)); diff --git a/src/routes/test/mail-test.js b/src/routes/test/mail-test.js index ac2361076..209b71964 100644 --- a/src/routes/test/mail-test.js +++ b/src/routes/test/mail-test.js @@ -10,9 +10,8 @@ var async = require('async'), config = require('../../config.js'), database = require('../../database.js'), expect = require('expect.js'), - mail = require('../../mail.js'), + maildb = require('../../maildb.js'), server = require('../../server.js'), - settingsdb = require('../../settingsdb.js'), superagent = require('superagent'); var SERVER_URL = 'http://localhost:' + config.get('port'); @@ -22,8 +21,8 @@ var token = null; function setup(done) { config._reset(); - config.setFqdn('example-settings-test.com'); - config.setAdminFqdn('my.example-settings-test.com'); + config.setFqdn('example-mail-test.com'); + config.setAdminFqdn('my.example-mail-test.com'); async.series([ server.start.bind(null), @@ -96,7 +95,7 @@ describe('Mail API', function () { }); it('does not fail when dns errors', function (done) { - superagent.get(SERVER_URL + '/api/v1/mail/status') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/status') .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); @@ -115,7 +114,7 @@ describe('Mail API', function () { it('succeeds with dns errors', function (done) { clearDnsAnswerQueue(); - superagent.get(SERVER_URL + '/api/v1/mail/status') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/status') .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); @@ -164,7 +163,7 @@ describe('Mail API', function () { dnsAnswerQueue[mxDomain].MX = null; dnsAnswerQueue[dmarcDomain].TXT = null; - superagent.get(SERVER_URL + '/api/v1/mail/status') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/status') .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); @@ -206,7 +205,7 @@ describe('Mail API', function () { dnsAnswerQueue[dkimDomain].TXT = ['"v=DKIM2; t=s; p=' + cloudron.readDkimPublicKeySync() + '"']; dnsAnswerQueue[spfDomain].TXT = ['"v=spf1 a:random.com ~all"']; - superagent.get(SERVER_URL + '/api/v1/mail/status') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/status') .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); @@ -247,7 +246,7 @@ describe('Mail API', function () { dnsAnswerQueue[spfDomain].TXT = ['"v=spf1 a:example.com a:' + config.mailFqdn() + ' ~all"']; - superagent.get(SERVER_URL + '/api/v1/mail/status') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/status') .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); @@ -271,7 +270,7 @@ describe('Mail API', function () { dnsAnswerQueue[dkimDomain].TXT = ['"v=DKIM1; t=s; p=' + cloudron.readDkimPublicKeySync() + '"']; dnsAnswerQueue[spfDomain].TXT = ['"v=spf1 a:' + config.adminFqdn() + ' ~all"']; - superagent.get(SERVER_URL + '/api/v1/mail/status') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/status') .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); @@ -307,17 +306,17 @@ describe('Mail API', function () { describe('mail from validation', function () { it('get mail from validation succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/mail/mail_from_validation') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn()) .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ enabled: true }); + expect(res.body.mailFromValidation).to.eql(true); done(); }); }); it('cannot set without enabled field', function (done) { - superagent.post(SERVER_URL + '/api/v1/mail/mail_from_validation') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/mail_from_validation') .query({ access_token: token }) .send({ }) .end(function (err, res) { @@ -327,7 +326,7 @@ describe('Mail API', function () { }); it('can set with enabled field', function (done) { - superagent.post(SERVER_URL + '/api/v1/mail/mail_from_validation') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/mail_from_validation') .query({ access_token: token }) .send({ enabled: false }) .end(function (err, res) { @@ -339,17 +338,17 @@ describe('Mail API', function () { describe('catch_all', function () { it('get catch_all succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/mail/catch_all_address') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn()) .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ address: [ ] }); + expect(res.body.catchAll).to.eql([ ]); done(); }); }); it('cannot set without address field', function (done) { - superagent.put(SERVER_URL + '/api/v1/mail/catch_all_address') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/catch_all') .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(400); @@ -358,7 +357,7 @@ describe('Mail API', function () { }); it('cannot set with bad address field', function (done) { - superagent.put(SERVER_URL + '/api/v1/mail/catch_all_address') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/catch_all') .query({ access_token: token }) .send({ address: [ 'user1', 123 ] }) .end(function (err, res) { @@ -368,7 +367,7 @@ describe('Mail API', function () { }); it('set succeeds', function (done) { - superagent.put(SERVER_URL + '/api/v1/mail/catch_all_address') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/catch_all') .query({ access_token: token }) .send({ address: [ 'user1' ] }) .end(function (err, res) { @@ -378,11 +377,11 @@ describe('Mail API', function () { }); it('get succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/mail/catch_all_address') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn()) .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ address: [ 'user1' ] }); + expect(res.body.catchAll).to.eql([ 'user1' ]); done(); }); }); @@ -390,17 +389,17 @@ describe('Mail API', function () { describe('mail relay', function () { it('get mail relay succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/mail/mail_relay') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn()) .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ provider: 'cloudron-smtp' }); + expect(res.body.relay).to.eql({ provider: 'cloudron-smtp' }); done(); }); }); it('cannot set without provider field', function (done) { - superagent.post(SERVER_URL + '/api/v1/mail/mail_relay') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/relay') .query({ access_token: token }) .send({ }) .end(function (err, res) { @@ -410,7 +409,7 @@ describe('Mail API', function () { }); it('cannot set with bad host', function (done) { - superagent.post(SERVER_URL + '/api/v1/mail/mail_relay') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/relay') .query({ access_token: token }) .send({ provider: 'external-smtp', host: true }) .end(function (err, res) { @@ -420,7 +419,7 @@ describe('Mail API', function () { }); it('set fails because mail server is unreachable', function (done) { - superagent.post(SERVER_URL + '/api/v1/mail/mail_relay') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/relay') .query({ access_token: token }) .send({ provider: 'external-smtp', host: 'host', port: 25, username: 'u', password: 'p', tls: true }) .end(function (err, res) { @@ -432,14 +431,14 @@ describe('Mail API', function () { it('get succeeds', function (done) { var relay = { provider: 'external-smtp', host: 'host', port: 25, username: 'u', password: 'p', tls: true }; - settingsdb.set(mail.MAIL_RELAY_KEY, JSON.stringify(relay), function (error) { // skip the mail server verify() + maildb.update(config.fqdn(), { relay: relay }, function (error) { // skip the mail server verify() expect(error).to.not.be.ok(); - superagent.get(SERVER_URL + '/api/v1/mail/mail_relay') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn()) .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql(relay); + expect(res.body.relay).to.eql(relay); done(); }); }); @@ -448,17 +447,17 @@ describe('Mail API', function () { describe('mail_config', function () { it('get mail_config succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/mail/mail_config') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn()) .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ enabled: false }); + expect(res.body.enabled).to.be(false); done(); }); }); it('cannot set without enabled field', function (done) { - superagent.post(SERVER_URL + '/api/v1/mail/mail_config') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/enable') .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(400); @@ -467,7 +466,7 @@ describe('Mail API', function () { }); it('set succeeds', function (done) { - superagent.post(SERVER_URL + '/api/v1/mail/mail_config') + superagent.post(SERVER_URL + '/api/v1/mail/' + config.fqdn() + '/enable') .query({ access_token: token }) .send({ enabled: true }) .end(function (err, res) { @@ -477,11 +476,11 @@ describe('Mail API', function () { }); it('get succeeds', function (done) { - superagent.get(SERVER_URL + '/api/v1/mail/mail_config') + superagent.get(SERVER_URL + '/api/v1/mail/' + config.fqdn()) .query({ access_token: token }) .end(function (err, res) { expect(res.statusCode).to.equal(200); - expect(res.body).to.eql({ enabled: true }); + expect(res.body.enabled).to.be(true); done(); }); }); diff --git a/src/server.js b/src/server.js index fc3814496..c681ca3c2 100644 --- a/src/server.js +++ b/src/server.js @@ -216,7 +216,7 @@ function initializeExpressSync() { router.get ('/api/v1/mail/:domain', settingsScope, routes.user.requireAdmin, routes.mail.get); router.get ('/api/v1/mail/:domain/status', settingsScope, routes.user.requireAdmin, routes.mail.getStatus); router.post('/api/v1/mail/:domain/mail_from_validation', settingsScope, routes.user.requireAdmin, routes.mail.setMailFromValidation); - router.post('/api/v1/mail/:domain/catch_all_address', settingsScope, routes.user.requireAdmin, routes.mail.setCatchAllAddress); + router.post('/api/v1/mail/:domain/catch_all', settingsScope, routes.user.requireAdmin, routes.mail.setCatchAllAddress); router.post('/api/v1/mail/:domain/relay', settingsScope, routes.user.requireAdmin, routes.mail.setMailRelay); router.post('/api/v1/mail/:domain/enable', settingsScope, routes.user.requireAdmin, routes.mail.setMailEnabled); diff --git a/src/test/mail-test.js b/src/test/mail-test.js index b2ffd08fa..0488c0644 100644 --- a/src/test/mail-test.js +++ b/src/test/mail-test.js @@ -27,8 +27,7 @@ function setup(done) { async.series([ database.initialize, database._clear, - // DOMAIN_0 already added for test through domaindb.addDefaultDomain(), - maildb.add.bind(null, DOMAIN_0.domain) + // DOMAIN_0 already added for test through domaindb.addDefaultDomain() ], done); } @@ -83,7 +82,7 @@ describe('Mail', function () { it('can set mail relay', function (done) { var relay = { provider: 'external-smtp', host: 'mx.foo.com', port: 25 }; - mail.setMailRelay(DOMAIN_0.domain, relay, function (error) { // skip the mail server verify() + maildb.update(DOMAIN_0.domain, { relay: relay }, function (error) { // skip the mail server verify() expect(error).to.be(null); mail.get(DOMAIN_0.domain, function (error, mailConfig) { diff --git a/src/test/user-test.js b/src/test/user-test.js index b5a6c97ca..6ce9512d7 100644 --- a/src/test/user-test.js +++ b/src/test/user-test.js @@ -15,6 +15,7 @@ var async = require('async'), groupdb = require('../groupdb.js'), groups = require('../groups.js'), mail = require('../mail.js'), + maildb = require('../maildb.js'), mailboxdb = require('../mailboxdb.js'), mailer = require('../mailer.js'), user = require('../user.js'), @@ -268,8 +269,8 @@ describe('User', function () { }); it('succeeds and attempts to send invite to alternateEmail', function (done) { - // user settingsdb instead of settings, to not trigger further events - settingsdb.set(mail.MAIL_CONFIG_KEY, JSON.stringify({ enabled: true }), function (error) { + // use maildb to not trigger further events + maildb.update(DOMAIN_0.domain, { enabled: true }, function (error) { expect(error).not.to.be.ok(); user.create(USERNAME_1, PASSWORD_1, EMAIL_1, DISPLAY_NAME_1, AUDIT_SOURCE, { sendInvite: true }, function (error, result) { @@ -283,7 +284,7 @@ describe('User', function () { checkMails(2, { sentTo: EMAIL_1.toLowerCase() }, function (error) { expect(error).not.to.be.ok(); - settingsdb.set(mail.MAIL_CONFIG_KEY, JSON.stringify({ enabled: false }), done); + maildb.update(DOMAIN_0.domain, { enabled: false }, done); }); }); }); @@ -588,29 +589,29 @@ describe('User', function () { }); it('succeeds with cloudron mail enabled', function (done) { - // user settingsdb instead of settings, to not trigger further events - settingsdb.set(mail.MAIL_CONFIG_KEY, JSON.stringify({ enabled: true }), function (error) { + // use maildb to not trigger further events + maildb.update(DOMAIN_0.domain, { enabled: true }, function (error) { expect(error).not.to.be.ok(); user.verifyWithEmail(USERNAME + '@' + config.fqdn(), PASSWORD, function (error, result) { expect(error).to.not.be.ok(); expect(result).to.be.ok(); - settingsdb.set(mail.MAIL_CONFIG_KEY, JSON.stringify({ enabled: false }), done); + maildb.update(DOMAIN_0.domain, { enabled: false }, done); }); }); }); it('fails with cloudron mail enabled and invite email', function (done) { - // user settingsdb instead of settings, to not trigger further events - settingsdb.set(mail.MAIL_CONFIG_KEY, JSON.stringify({ enabled: true }), function (error) { + // use maildb to not trigger further events + maildb.update(DOMAIN_0.domain, { enabled: true }, function (error) { expect(error).not.to.be.ok(); user.verifyWithEmail(EMAIL, PASSWORD, function (error) { expect(error).to.be.a(UserError); expect(error.reason).to.equal(UserError.NOT_FOUND); - settingsdb.set(mail.MAIL_CONFIG_KEY, JSON.stringify({ enabled: false }), done); + maildb.update(DOMAIN_0.domain, { enabled: false }, done); }); }); }); @@ -644,8 +645,8 @@ describe('User', function () { }); it('succeeds with email enabled', function (done) { - // user settingsdb instead of settings, to not trigger further events - settingsdb.set(mail.MAIL_CONFIG_KEY, JSON.stringify({ enabled: true }), function (error) { + // use maildb to not trigger further events + maildb.update(DOMAIN_0.domain, { enabled: true }, function (error) { expect(error).not.to.be.ok(); user.get(userObject.id, function (error, result) { @@ -657,7 +658,7 @@ describe('User', function () { expect(result.username).to.equal(USERNAME.toLowerCase()); expect(result.displayName).to.equal(DISPLAY_NAME); - settingsdb.set(mail.MAIL_CONFIG_KEY, JSON.stringify({ enabled: false }), done); + maildb.update(DOMAIN_0.domain, { enabled: false }, done); }); }); });