Files
wmantly efe3e514b0 chore(release): public-release readiness and security fixes for 1.1.16
Security:
- Escape user-supplied values in LDAP filters and DNs (group_ldap.js, user_ldap.js)
- Replace Math.random() token/UUID/OTP generation with crypto.randomUUID / crypto.randomInt
- Refuse startup when oauth.jwtSecret is missing or placeholder

Fixes:
- Correct from-address template rendering in email.js

Packaging:
- Remove private flag and bump version to 1.1.16

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-18 22:08:11 -04:00

66 lines
1.8 KiB
JavaScript

'use strict';
const nodemailer = require('nodemailer');
const mustache = require('mustache');
const conf = require('@simpleworkjs/conf');
var Mail = {};
Mail.send = function(to, subject, message, from){
// Never let the automated test suite deliver real mail — tests run against
// this app's real routes (notification broadcast, password reset, invite,
// OTP-by-email, …) with NODE_ENV=test, and any of them resolving a real
// recipient list must not actually hit SMTP. Tests already tolerate this
// (see e.g. tests/misc.test.js: "SMTP failure is non-fatal") since none
// assert on real delivery.
if(conf.environment === 'test'){
return Promise.resolve({accepted: [], rejected: [], response: 'skipped: NODE_ENV=test'});
}
return new Promise(function(resolve, reject){
var transportOpts = {
host: conf.smtp.host || 'localhost',
port: conf.smtp.port || 25,
secure: conf.smtp.secure !== undefined ? conf.smtp.secure : false
};
if (conf.smtp.user && conf.smtp.pass) {
transportOpts.auth = {
user: conf.smtp.user,
pass: conf.smtp.pass
};
}
var transporter = nodemailer.createTransport(transportOpts);
var mailOpts = {
from: from || conf.smtp.from || `${conf.name} Accounts <noreply@theta42.com>`,
to: to,
subject: subject,
html: message
};
transporter.sendMail(mailOpts, function(err, info){
if (err) {
reject(err);
} else {
resolve(info);
}
});
});
};
Mail.sendTemplate = async function(to, template, context, from){
context.name = conf.name;
template = require(`../views/email_templates/${template}`);
await Mail.send(
to,
mustache.render(template.subject, context),
mustache.render(template.message, context),
from || (template.from && mustache.render(template.from, context))
)
};
module.exports = {Mail};