Files
cloudron-box/src/maildb.js
T

97 lines
3.0 KiB
JavaScript
Raw Normal View History

2018-01-20 22:17:53 -08:00
'use strict';
exports = module.exports = {
get: get,
2018-12-06 10:23:10 -08:00
list: list,
2018-01-20 22:17:53 -08:00
update: update,
clear: clear,
2018-01-20 22:17:53 -08:00
TYPE_USER: 'user',
TYPE_APP: 'app',
2018-01-24 14:42:45 -08:00
TYPE_GROUP: 'group'
2018-01-20 22:17:53 -08:00
};
var assert = require('assert'),
2019-10-24 13:34:14 -07:00
BoxError = require('./boxerror.js'),
2018-01-20 22:17:53 -08:00
database = require('./database.js'),
safe = require('safetydance');
2019-06-10 12:23:29 -07:00
var MAILDB_FIELDS = [ 'domain', 'enabled', 'mailFromValidation', 'catchAllJson', 'relayJson', 'dkimSelector' ].join(',');
2018-01-20 22:17:53 -08:00
function postProcess(data) {
data.enabled = !!data.enabled; // int to boolean
data.mailFromValidation = !!data.mailFromValidation; // int to boolean
data.catchAll = safe.JSON.parse(data.catchAllJson) || [ ];
delete data.catchAllJson;
data.relay = safe.JSON.parse(data.relayJson) || { provider: 'cloudron-smtp' };
delete data.relayJson;
return data;
}
function clear(callback) {
assert.strictEqual(typeof callback, 'function');
// using TRUNCATE makes it fail foreign key check
database.query('DELETE FROM mail', [], function (error) {
2019-10-24 13:34:14 -07:00
if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error));
2018-01-20 22:17:53 -08:00
callback(null);
});
}
function get(domain, callback) {
assert.strictEqual(typeof domain, 'string');
assert.strictEqual(typeof callback, 'function');
2018-01-23 15:45:30 +01:00
database.query('SELECT ' + MAILDB_FIELDS + ' FROM mail WHERE domain = ?', [ domain ], function (error, results) {
2019-10-24 13:34:14 -07:00
if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error));
2019-10-24 20:48:38 -07:00
if (results.length === 0) return callback(new BoxError(BoxError.NOT_FOUND, 'Mail domain not found'));
2018-01-20 22:17:53 -08:00
callback(null, postProcess(results[0]));
});
}
2018-12-06 10:23:10 -08:00
function list(callback) {
2018-01-24 11:33:09 -08:00
assert.strictEqual(typeof callback, 'function');
database.query('SELECT ' + MAILDB_FIELDS + ' FROM mail ORDER BY domain', function (error, results) {
2019-10-24 13:34:14 -07:00
if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error));
2018-01-24 11:33:09 -08:00
results.forEach(function (result) { postProcess(result); });
callback(null, results);
});
}
2018-01-20 22:17:53 -08:00
function update(domain, data, callback) {
assert.strictEqual(typeof domain, 'string');
assert.strictEqual(typeof data, 'object');
assert.strictEqual(typeof callback, 'function');
var args = [ ];
var fields = [ ];
for (var k in data) {
if (k === 'catchAll') {
fields.push('catchAllJson = ?');
args.push(JSON.stringify(data[k]));
} else if (k === 'relay') {
fields.push('relayJson = ?');
args.push(JSON.stringify(data[k]));
} else {
fields.push(k + ' = ?');
args.push(data[k]);
}
}
args.push(domain);
database.query('UPDATE mail SET ' + fields.join(', ') + ' WHERE domain=?', args, function (error, result) {
2019-10-24 13:34:14 -07:00
if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error));
2019-10-24 20:48:38 -07:00
if (result.affectedRows !== 1) return callback(new BoxError(BoxError.NOT_FOUND, 'Mail domain not found'));
2018-01-20 22:17:53 -08:00
callback(null);
});
}