mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 07:37:25 +01:00
145 lines
4.6 KiB
JavaScript
145 lines
4.6 KiB
JavaScript
var nodemailer = require('nodemailer');
|
|
var nconf = require('nconf');
|
|
var crypto = require('crypto');
|
|
var path = require("path");
|
|
var request = require('request');
|
|
|
|
// Set when utils.setupConfig is run
|
|
var isProd, baseUrl;
|
|
|
|
module.exports.ga = undefined; // set Google Analytics on nconf init
|
|
|
|
module.exports.sendEmail = function(mailData) {
|
|
var smtpTransport = nodemailer.createTransport("SMTP",{
|
|
service: nconf.get('SMTP_SERVICE'),
|
|
auth: {
|
|
user: nconf.get('SMTP_USER'),
|
|
pass: nconf.get('SMTP_PASS')
|
|
}
|
|
});
|
|
smtpTransport.sendMail(mailData, function(error, response){
|
|
var logging = require('./logging');
|
|
if(error) logging.error(error);
|
|
else logging.info("Message sent: " + response.message);
|
|
smtpTransport.close(); // shut down the connection pool, no more messages
|
|
});
|
|
}
|
|
|
|
function getUserInfo(user, fields) {
|
|
var info = {};
|
|
|
|
if(fields.indexOf('name') != -1){
|
|
if(user.auth.local){
|
|
info.name = user.profile.name || user.auth.local.username;
|
|
}else if(user.auth.facebook){
|
|
info.name = user.auth.facebook.displayName || user.auth.facebook.username;
|
|
}
|
|
}
|
|
|
|
if(fields.indexOf('email') != -1){
|
|
if(user.auth.local){
|
|
info.email = user.auth.local.email;
|
|
}else if(user.auth.facebook && user.auth.facebook.emails && user.auth.facebook.emails[0] && user.auth.facebook.emails[0].value){
|
|
info.email = user.auth.facebook.emails[0].value;
|
|
}
|
|
}
|
|
|
|
if(fields.indexOf('canSend') != -1){
|
|
info.canSend = user.preferences.emailNotifications.unsubscribeFromAll !== true;
|
|
}
|
|
|
|
return info;
|
|
}
|
|
|
|
module.exports.getUserInfo = getUserInfo;
|
|
|
|
module.exports.txnEmail = function(mailingInfoArray, emailType, variables){
|
|
var mailingInfoArray = Array.isArray(mailingInfoArray) ? mailingInfoArray : [mailingInfoArray];
|
|
var variables = [
|
|
{name: 'BASE_URL', content: baseUrl},
|
|
{name: 'EMAIL_SETTINGS_URL', content: baseUrl + '/#/options/settings/notifications'}
|
|
].concat(variables || []);
|
|
|
|
// It's important to pass at least a user with its `preferences` as we need to check if he unsubscribed
|
|
mailingInfoArray = mailingInfoArray.map(function(mailingInfo){
|
|
return mailingInfo._id ? getUserInfo(mailingInfo, ['email', 'name', 'canSend']) : mailingInfo;
|
|
}).filter(function(mailingInfo){
|
|
return (mailingInfo.email && mailingInfo.canSend);
|
|
});
|
|
|
|
// When only one recipient send his info as variables
|
|
if(mailingInfoArray.length === 1 && mailingInfoArray[0].name){
|
|
variables.push({name: 'RECIPIENT_NAME', content: mailingInfoArray[0].name});
|
|
}
|
|
|
|
if(isProd && mailingInfoArray.length > 0){
|
|
request({
|
|
url: nconf.get('EMAIL_SERVER:url') + '/job',
|
|
method: 'POST',
|
|
auth: {
|
|
user: nconf.get('EMAIL_SERVER:authUser'),
|
|
pass: nconf.get('EMAIL_SERVER:authPassword')
|
|
},
|
|
json: {
|
|
type: 'email',
|
|
data: {
|
|
emailType: emailType,
|
|
to: mailingInfoArray,
|
|
variables: variables
|
|
},
|
|
options: {
|
|
attemps: 5,
|
|
backoff: {delay: 10*60*1000, type: 'fixed'}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// Encryption using http://dailyjs.com/2010/12/06/node-tutorial-5/
|
|
// Note: would use [password-hash](https://github.com/davidwood/node-password-hash), but we need to run
|
|
// model.query().equals(), so it's a PITA to work in their verify() function
|
|
|
|
module.exports.encryptPassword = function(password, salt) {
|
|
return crypto.createHmac('sha1', salt).update(password).digest('hex');
|
|
}
|
|
|
|
module.exports.makeSalt = function() {
|
|
var len = 10;
|
|
return crypto.randomBytes(Math.ceil(len / 2)).toString('hex').substring(0, len);
|
|
}
|
|
|
|
/**
|
|
* Load nconf and define default configuration values if config.json or ENV vars are not found
|
|
*/
|
|
module.exports.setupConfig = function(){
|
|
nconf.argv()
|
|
.env()
|
|
//.file('defaults', path.join(path.resolve(__dirname, '../config.json.example')))
|
|
.file('user', path.join(path.resolve(__dirname, '../config.json')));
|
|
|
|
if (nconf.get('NODE_ENV') === "development")
|
|
Error.stackTraceLimit = Infinity;
|
|
if (nconf.get('NODE_ENV') === 'production')
|
|
require('newrelic');
|
|
|
|
isProd = nconf.get('NODE_ENV') === 'production';
|
|
baseUrl = nconf.get('BASE_URL');
|
|
|
|
module.exports.ga = require('universal-analytics')(nconf.get('GA_ID'));
|
|
};
|
|
|
|
var algorithm = 'aes-256-ctr';
|
|
module.exports.encrypt = function(text){
|
|
var cipher = crypto.createCipher(algorithm,nconf.get('SESSION_SECRET'))
|
|
var crypted = cipher.update(text,'utf8','hex')
|
|
crypted += cipher.final('hex');
|
|
return crypted;
|
|
}
|
|
|
|
module.exports.decrypt = function(text){
|
|
var decipher = crypto.createDecipher(algorithm,nconf.get('SESSION_SECRET'))
|
|
var dec = decipher.update(text,'hex','utf8')
|
|
dec += decipher.final('utf8');
|
|
return dec;
|
|
} |