diff options
author | Tom Smeding <tom@tomsmeding.com> | 2025-02-09 19:43:02 +0100 |
---|---|---|
committer | Tom Smeding <tom@tomsmeding.com> | 2025-02-09 19:43:02 +0100 |
commit | 4647331ff4f87598adc1dee354377284d95be60e (patch) | |
tree | 77b9853ef4453779613bdd679a6933de11971b6f /modules/$email/email.js | |
parent | 7221e1a4d8227bbb71e976ddb493b4977e00ffc4 (diff) |
Disable email module
Diffstat (limited to 'modules/$email/email.js')
-rw-r--r-- | modules/$email/email.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/modules/$email/email.js b/modules/$email/email.js new file mode 100644 index 0000000..d7fe171 --- /dev/null +++ b/modules/$email/email.js @@ -0,0 +1,71 @@ +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(); + }); +}; |