diff --git a/src/mail.js b/src/mail.js index a8667b73c..88550de76 100644 --- a/src/mail.js +++ b/src/mail.js @@ -48,13 +48,10 @@ exports = module.exports = { removeList: removeList, resolveList: resolveList, - getEventlog: getEventlog, - _readDkimPublicKeySync: readDkimPublicKeySync }; -var addons = require('./addons.js'), - assert = require('assert'), +var assert = require('assert'), async = require('async'), BoxError = require('./boxerror.js'), constants = require('./constants.js'), @@ -72,7 +69,6 @@ var addons = require('./addons.js'), nodemailer = require('nodemailer'), path = require('path'), paths = require('./paths.js'), - request = require('request'), reverseProxy = require('./reverseproxy.js'), safe = require('safetydance'), settings = require('./settings.js'), @@ -667,24 +663,6 @@ function configureMail(mailFqdn, mailDomain, callback) { }); } -function getEventlog(search, page, perPage, callback) { - assert.strictEqual(typeof search, 'string'); - assert.strictEqual(typeof page, 'number'); - assert.strictEqual(typeof perPage, 'number'); - assert.strictEqual(typeof callback, 'function'); - - addons.getServiceDetails('mail', 'CLOUDRON_MAIL_TOKEN', function (error, addonDetails) { - if (error) return callback(error); - - request.get(`https://${addonDetails.ip}:3000/eventlog?access_token=${addonDetails.token}&search=${search}&page=${page}&per_page=${perPage}`, { json: true, rejectUnauthorized: false }, function (error, response) { - if (error) return callback(new BoxError(BoxError.MAIL_ERROR, `Error getting eventlog: ${error.message}`)); - if (response.statusCode !== 200) return callback(new BoxError(BoxError.MAIL_ERROR, `Error getting eventlog. Status code: ${response.statusCode} message: ${response.body}`)); - - callback(null, response.body.eventlogs); - }); - }); -} - function getMailAuth(callback) { assert.strictEqual(typeof callback, 'function'); diff --git a/src/routes/index.js b/src/routes/index.js index 296cb8ba2..e357eb0d9 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -12,6 +12,7 @@ exports = module.exports = { graphs: require('./graphs.js'), groups: require('./groups.js'), mail: require('./mail.js'), + mailserver: require('./mailserver.js'), notifications: require('./notifications.js'), profile: require('./profile.js'), provision: require('./provision.js'), diff --git a/src/routes/mail.js b/src/routes/mail.js index 8a130ba8a..4cfbccd36 100644 --- a/src/routes/mail.js +++ b/src/routes/mail.js @@ -31,8 +31,6 @@ exports = module.exports = { addList: addList, updateList: updateList, removeList: removeList, - - getEventlog: getEventlog }; var assert = require('assert'), @@ -354,17 +352,3 @@ function removeList(req, res, next) { next(new HttpSuccess(204)); }); } - -function getEventlog(req, res, next) { - var page = typeof req.query.page !== 'undefined' ? parseInt(req.query.page) : 1; - if (!page || page < 0) return next(new HttpError(400, 'page query param has to be a positive number')); - - var perPage = typeof req.query.per_page !== 'undefined'? parseInt(req.query.per_page) : 25; - if (!perPage || perPage < 0) return next(new HttpError(400, 'per_page query param has to be a positive number')); - - mail.getEventlog(req.query.search || '', page, perPage, function (error, result) { - if (error) return next(BoxError.toHttpError(error)); - - next(new HttpSuccess(200, { eventlogs: result })); - }); -} diff --git a/src/routes/mailserver.js b/src/routes/mailserver.js new file mode 100644 index 000000000..90794b4b2 --- /dev/null +++ b/src/routes/mailserver.js @@ -0,0 +1,43 @@ +'use strict'; + +exports = module.exports = { + proxy +}; + +var addons = require('../addons.js'), + assert = require('assert'), + BoxError = require('../boxerror.js'), + middleware = require('../middleware/index.js'), + HttpError = require('connect-lastmile').HttpError, + url = require('url'); + +function proxy(req, res, next) { + assert.strictEqual(typeof req.params.pathname, 'string'); + + let parsedUrl = url.parse(req.url, true /* parseQueryString */); + + // do not proxy protected values + delete parsedUrl.query['access_token']; + delete req.headers['authorization']; + delete req.headers['cookies']; + + addons.getServiceDetails('mail', 'CLOUDRON_MAIL_TOKEN', function (error, addonDetails) { + if (error) return next(BoxError.toHttpError(error)); + + parsedUrl.query['access_token'] = addonDetails.token; + req.url = url.format({ pathname: req.params.pathname, query: parsedUrl.query }); + + const proxyOptions = url.parse(`https://${addonDetails.ip}:3000`); + proxyOptions.rejectUnauthorized = false; + const mailserverProxy = middleware.proxy(proxyOptions); + + mailserverProxy(req, res, function (error) { + if (!error) return next(); + + if (error.code === 'ECONNREFUSED') return next(new HttpError(424, 'Unable to connect to mail server')); + if (error.code === 'ECONNRESET') return next(new HttpError(424, 'Unable to query mail server')); + + next(new HttpError(500, error)); + }); + }); +} diff --git a/src/server.js b/src/server.js index 89c16c7e9..4862bfa0c 100644 --- a/src/server.js +++ b/src/server.js @@ -236,7 +236,7 @@ function initializeExpressSync() { }, routes.settings.set); // email routes - router.get('/api/v1/mailserver/eventlog', token, authorizeAdmin, routes.mail.getEventlog); + router.get('/api/v1/mailserver/:pathname', token, authorizeAdmin, routes.mailserver.proxy); router.get ('/api/v1/mail/:domain', token, authorizeAdmin, routes.mail.getDomain); router.post('/api/v1/mail', token, authorizeAdmin, routes.mail.addDomain);