diff --git a/CHANGES b/CHANGES index d97ab7d66..0208a510e 100644 --- a/CHANGES +++ b/CHANGES @@ -1783,4 +1783,5 @@ * Make footer customizable * Add UI to import backups * Display timestamps in browser timezone in the UI +* Mail eventlog diff --git a/src/addons.js b/src/addons.js index 29c461629..0854e1c2b 100644 --- a/src/addons.js +++ b/src/addons.js @@ -20,6 +20,8 @@ exports = module.exports = { getMountsSync: getMountsSync, getContainerNamesSync: getContainerNamesSync, + getServiceDetails: getServiceDetails, + // exported for testing _setupOauth: setupOauth, _teardownOauth: teardownOauth, diff --git a/src/infra_version.js b/src/infra_version.js index 01bac90a0..a45477ffa 100644 --- a/src/infra_version.js +++ b/src/infra_version.js @@ -19,7 +19,7 @@ exports = module.exports = { 'postgresql': { repo: 'cloudron/postgresql', tag: 'cloudron/postgresql:2.0.2@sha256:6dcee0731dfb9b013ed94d56205eee219040ee806c7e251db3b3886eaa4947ff' }, 'mongodb': { repo: 'cloudron/mongodb', tag: 'cloudron/mongodb:2.1.0@sha256:6d1bf221cfe6124957e2c58b57c0a47214353496009296acb16adf56df1da9d5' }, 'redis': { repo: 'cloudron/redis', tag: 'cloudron/redis:2.1.0@sha256:f2cda21bd15c21bbf44432df412525369ef831a2d53860b5c5b1675e6f384de2' }, - 'mail': { repo: 'cloudron/mail', tag: 'cloudron/mail:2.5.0@sha256:086ae1c9433d90a820326aa43914a2afe94ad707074ef2bc05a7ef4798e83655' }, + 'mail': { repo: 'cloudron/mail', tag: 'cloudron/mail:2.6.0@sha256:f91b11419a30808fa8be624ee42d4a670ca0f3fb0a0f8592e1c498d05c2fefbc' }, 'graphite': { repo: 'cloudron/graphite', tag: 'cloudron/graphite:2.2.0@sha256:fc9ca69d16e6ebdbd98ed53143d4a0d2212eef60cb638dc71219234e6f427a2c' }, 'sftp': { repo: 'cloudron/sftp', tag: 'cloudron/sftp:0.1.0@sha256:e177c5bf5f38c84ce1dea35649c22a1b05f96eec67a54a812c5a35e585670f0f' } } diff --git a/src/mail.js b/src/mail.js index 99e296d60..acc4f64b2 100644 --- a/src/mail.js +++ b/src/mail.js @@ -48,10 +48,13 @@ exports = module.exports = { removeList: removeList, resolveList: resolveList, + getEventlog: getEventlog, + _readDkimPublicKeySync: readDkimPublicKeySync }; -var assert = require('assert'), +var addons = require('./addons.js'), + assert = require('assert'), async = require('async'), BoxError = require('./boxerror.js'), constants = require('./constants.js'), @@ -69,6 +72,7 @@ var assert = require('assert'), nodemailer = require('nodemailer'), path = require('path'), paths = require('./paths.js'), + request = require('request'), reverseProxy = require('./reverseproxy.js'), safe = require('safetydance'), settings = require('./settings.js'), @@ -664,6 +668,23 @@ function configureMail(mailFqdn, mailDomain, callback) { }); } +function getEventlog(page, perPage, callback) { + 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}&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/mail.js b/src/routes/mail.js index 01fadb617..f99e90e72 100644 --- a/src/routes/mail.js +++ b/src/routes/mail.js @@ -31,7 +31,9 @@ exports = module.exports = { getList: getList, addList: addList, updateList: updateList, - removeList: removeList + removeList: removeList, + + getEventlog: getEventlog }; var assert = require('assert'), @@ -197,10 +199,10 @@ function listMailboxes(req, res, next) { assert.strictEqual(typeof req.params.domain, 'string'); 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 postive number')); + 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 postive number')); + if (!perPage || perPage < 0) return next(new HttpError(400, 'per_page query param has to be a positive number')); mail.listMailboxes(req.params.domain, page, perPage, function (error, result) { if (error) return next(BoxError.toHttpError(error)); @@ -261,10 +263,10 @@ function listAliases(req, res, next) { assert.strictEqual(typeof req.params.domain, 'string'); 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 postive number')); + 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 postive number')); + if (!perPage || perPage < 0) return next(new HttpError(400, 'per_page query param has to be a positive number')); mail.listAliases(req.params.domain, page, perPage, function (error, result) { if (error) return next(BoxError.toHttpError(error)); @@ -370,3 +372,17 @@ 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(page, perPage, function (error, result) { + if (error) return next(BoxError.toHttpError(error)); + + next(new HttpSuccess(200, { eventlogs: result })); + }); +} diff --git a/src/server.js b/src/server.js index b5324320d..ffff95c11 100644 --- a/src/server.js +++ b/src/server.js @@ -238,6 +238,8 @@ function initializeExpressSync() { }, routes.settings.set); // email routes + router.get('/api/v1/mailserver/eventlog', token, authorizeAdmin, routes.mail.getEventlog); + router.get ('/api/v1/mail/:domain', token, authorizeAdmin, routes.mail.getDomain); router.post('/api/v1/mail', token, authorizeAdmin, routes.mail.addDomain); router.get ('/api/v1/mail/:domain/stats', token, authorizeAdmin, routes.mail.getDomainStats);