You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/user/email.js

107 lines
2.8 KiB
JavaScript

'use strict';
var async = require('async'),
nconf = require('nconf'),
winston = require('winston'),
11 years ago
user = require('../user'),
utils = require('../../public/src/utils'),
translator = require('../../public/src/modules/translator'),
11 years ago
plugins = require('../plugins'),
db = require('../database'),
meta = require('../meta'),
emailer = require('../emailer');
(function(UserEmail) {
UserEmail.exists = function(email, callback) {
11 years ago
user.getUidByEmail(email.toLowerCase(), function(err, exists) {
callback(err, !!exists);
});
};
UserEmail.available = function(email, callback) {
11 years ago
db.isObjectField('email:uid', email.toLowerCase(), function(err, exists) {
callback(err, !exists);
});
};
10 years ago
UserEmail.verify = function(uid, email, callback) {
callback = callback || function() {};
var confirm_code = utils.generateUUID(),
confirm_link = nconf.get('url') + '/confirm/' + confirm_code;
plugins.fireHook('filter:user.verify.code', confirm_code, function(err, confirm_code) {
10 years ago
if (err) {
return callback(err);
}
async.series([
function(next) {
db.setObject('confirm:' + confirm_code, {
11 years ago
email: email.toLowerCase(),
uid: uid
}, next);
},
function(next) {
db.expireAt('confirm:' + confirm_code, Math.floor(Date.now() / 1000 + 60 * 60 * 2), next);
}
], function(err) {
10 years ago
if (err) {
return callback(err);
}
user.getUserField(uid, 'username', function(err, username) {
if (err) {
11 years ago
return winston.error(err.stack);
}
11 years ago
var title = meta.config.title || meta.config.browserTitle || 'NodeBB';
translator.translate('[[email:welcome-to, ' + title + ']]', meta.config.defaultLang, function(subject) {
11 years ago
var data = {
11 years ago
site_title: title,
11 years ago
username: username,
confirm_link: confirm_link,
confirm_code: confirm_code,
11 years ago
subject: subject,
template: 'welcome',
uid: uid
};
11 years ago
if (plugins.hasListeners('action:user.verify')) {
plugins.fireHook('action:user.verify', {uid: uid, data: data});
10 years ago
callback();
11 years ago
} else if (plugins.hasListeners('action:email.send')) {
10 years ago
emailer.send('welcome', uid, data, callback);
10 years ago
} else {
winston.warn('No emailer to send verification email!');
10 years ago
callback();
11 years ago
}
});
});
});
});
};
UserEmail.confirm = function(code, callback) {
db.getObject('confirm:' + code, function(err, confirmObj) {
if (err) {
return callback(new Error('[[error:parse-error]]'));
}
if (confirmObj && confirmObj.uid && confirmObj.email) {
async.series([
async.apply(user.setUserField, confirmObj.uid, 'email:confirmed', 1),
async.apply(db.delete, 'confirm:' + code)
], function(err) {
callback(err ? new Error('[[error:email-confirm-failed]]') : null);
});
} else {
callback(new Error('[[error:invalid-data]]'));
}
});
};
}(exports));