var cmn = require("../$common.js"), fs = require("fs"), child_process = require("child_process"), bodyParser = require("body-parser"); var ratelimitAllowed = (function() { var numEvents = 20, period = 24 * 3600 * 1000; var eventList = []; return function ratelimitAllowed() { var now = new Date(); while (now - eventList[0] > period) eventList.unshift(); if (eventList.length >= numEvents) return false; eventList.push(now); return true; }; })(); function sendEmail(recip, text) { var opts = { stdio: ["pipe", "inherit", "inherit"] }; var proc = child_process.spawn("msmtp", ["--read-recipients"], opts); // Make sure it doesn't run indefinitely var timeout = setTimeout(() => {proc.kill();}, 5000); proc.on("exit", () => clearTimeout(timeout)); proc.on("error", err => { console.log("email: Failed to start msmtp:", err); clearTimeout(timeout); }); proc.stdin.on("error", err => { console.log("email: Failed to write to msmtp:", err); clearTimeout(timeout); }); proc.stdin.end( "To: " + recip + "\n" + "Subject: Mail from email module\n\n" + text ); } module.exports = function(app, io, moddir) { var allowedRecipients, password; try { allowedRecipients = fs.readFileSync(moddir + "/allowed_recipients.txt").toString().trim().split("\n"); password = fs.readFileSync(moddir + "/password.txt").toString().trim(); } catch (e) { console.error(e); return false; } app.post("/email", bodyParser.json(), function(req, res) { var body = req.body; console.log(body); if (typeof body != "object" || typeof body.password != "string" || typeof body.to != "string" || typeof body.text != "string" || body.password != password || allowedRecipients.indexOf(body.to) == -1) { res.status(400).send("Invalid request"); return; } var text = body.text.slice(0, 1000000); // 1 MB is enough sendEmail(body.to, body.text); res.end(); }); };