mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
feat: add user.email.confirmByUid for sso plugins
This commit is contained in:
@@ -205,7 +205,7 @@ Controllers.registerInterstitial = async function (req, res, next) {
|
||||
};
|
||||
|
||||
Controllers.confirmEmail = function (req, res) {
|
||||
user.email.confirm(req.params.code, function (err) {
|
||||
user.email.confirmByCode(req.params.code, function (err) {
|
||||
res.render('confirm', {
|
||||
error: err ? err.message : '',
|
||||
title: '[[pages:confirm]]',
|
||||
|
||||
@@ -73,11 +73,8 @@ User.validateEmail = async function (socket, uids) {
|
||||
throw new Error('[[error:invalid-data]]');
|
||||
}
|
||||
|
||||
uids = uids.filter(uid => parseInt(uid, 10));
|
||||
await db.setObjectField(uids.map(uid => 'user:' + uid), 'email:confirmed', 1);
|
||||
for (const uid of uids) {
|
||||
await groups.join('verified-users', uid);
|
||||
await groups.leave('unverified-users', uid);
|
||||
await user.email.confirmByUid(uid);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
var nconf = require('nconf');
|
||||
const nconf = require('nconf');
|
||||
const winston = require('winston');
|
||||
|
||||
var user = require('./index');
|
||||
var utils = require('../utils');
|
||||
var plugins = require('../plugins');
|
||||
var db = require('../database');
|
||||
var meta = require('../meta');
|
||||
var emailer = require('../emailer');
|
||||
const user = require('./index');
|
||||
const utils = require('../utils');
|
||||
const plugins = require('../plugins');
|
||||
const db = require('../database');
|
||||
const meta = require('../meta');
|
||||
const emailer = require('../emailer');
|
||||
const groups = require('../groups');
|
||||
|
||||
var UserEmail = module.exports;
|
||||
const UserEmail = module.exports;
|
||||
|
||||
UserEmail.exists = async function (email) {
|
||||
const uid = await user.getUidByEmail(email.toLowerCase());
|
||||
@@ -88,6 +89,13 @@ UserEmail.sendValidationEmail = async function (uid, options) {
|
||||
};
|
||||
|
||||
UserEmail.confirm = async function (code) {
|
||||
// TODO: remove in 1.17.0
|
||||
winston.warn('[deprecated] User.email.confirm deprecated use User.email.confirmByCode');
|
||||
await UserEmail.confirmByCode(code);
|
||||
};
|
||||
|
||||
// confirm email by code sent by confirmation email
|
||||
UserEmail.confirmByCode = async function (code) {
|
||||
const confirmObj = await db.getObject('confirm:' + code);
|
||||
if (!confirmObj || !confirmObj.uid || !confirmObj.email) {
|
||||
throw new Error('[[error:invalid-data]]');
|
||||
@@ -96,10 +104,24 @@ UserEmail.confirm = async function (code) {
|
||||
if (!currentEmail || currentEmail.toLowerCase() !== confirmObj.email) {
|
||||
throw new Error('[[error:invalid-email]]');
|
||||
}
|
||||
await user.setUserField(confirmObj.uid, 'email:confirmed', 1);
|
||||
await groups.join('verified-users', confirmObj.uid);
|
||||
await groups.leave('unverified-users', confirmObj.uid);
|
||||
await UserEmail.confirmByUid(confirmObj.uid);
|
||||
await db.delete('confirm:' + code);
|
||||
await db.delete('uid:' + confirmObj.uid + ':confirm:email:sent');
|
||||
await plugins.hooks.fire('action:user.email.confirmed', { uid: confirmObj.uid, email: confirmObj.email });
|
||||
};
|
||||
|
||||
// confirm uid's email
|
||||
UserEmail.confirmByUid = async function (uid) {
|
||||
if (!(parseInt(uid, 10) > 0)) {
|
||||
throw new Error('[[error:invalid-uid]]');
|
||||
}
|
||||
const currentEmail = await user.getUserField(uid, 'email');
|
||||
if (!currentEmail) {
|
||||
throw new Error('[[error:invalid-email]]');
|
||||
}
|
||||
await Promise.all([
|
||||
user.setUserField(uid, 'email:confirmed', 1),
|
||||
groups.join('verified-users', uid),
|
||||
groups.leave('unverified-users', uid),
|
||||
db.delete('uid:' + uid + ':confirm:email:sent'),
|
||||
]);
|
||||
await plugins.hooks.fire('action:user.email.confirmed', { uid: uid, email: currentEmail });
|
||||
};
|
||||
|
||||
22
test/user.js
22
test/user.js
@@ -2335,7 +2335,7 @@ describe('User', function () {
|
||||
|
||||
describe('email confirm', function () {
|
||||
it('should error with invalid code', function (done) {
|
||||
User.email.confirm('asdasda', function (err) {
|
||||
User.email.confirmByCode('asdasda', function (err) {
|
||||
assert.equal(err.message, '[[error:invalid-data]]');
|
||||
done();
|
||||
});
|
||||
@@ -2351,7 +2351,25 @@ describe('User', function () {
|
||||
const code = await User.email.sendValidationEmail(uid, email);
|
||||
const unverified = await groups.isMember(uid, 'unverified-users');
|
||||
assert.strictEqual(unverified, true);
|
||||
await User.email.confirm(code);
|
||||
await User.email.confirmByCode(code);
|
||||
const [confirmed, isVerified] = await Promise.all([
|
||||
db.getObjectField('user:' + uid, 'email:confirmed'),
|
||||
groups.isMember(uid, 'verified-users', uid),
|
||||
]);
|
||||
assert.strictEqual(parseInt(confirmed, 10), 1);
|
||||
assert.strictEqual(isVerified, true);
|
||||
});
|
||||
|
||||
it('should confirm email of user by uid', async function () {
|
||||
const email = 'confirm2@me.com';
|
||||
const uid = await User.create({
|
||||
username: 'confirme2',
|
||||
email: email,
|
||||
});
|
||||
|
||||
const unverified = await groups.isMember(uid, 'unverified-users');
|
||||
assert.strictEqual(unverified, true);
|
||||
await User.email.confirmByUid(uid);
|
||||
const [confirmed, isVerified] = await Promise.all([
|
||||
db.getObjectField('user:' + uid, 'email:confirmed'),
|
||||
groups.isMember(uid, 'verified-users', uid),
|
||||
|
||||
Reference in New Issue
Block a user