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) {
|
Controllers.confirmEmail = function (req, res) {
|
||||||
user.email.confirm(req.params.code, function (err) {
|
user.email.confirmByCode(req.params.code, function (err) {
|
||||||
res.render('confirm', {
|
res.render('confirm', {
|
||||||
error: err ? err.message : '',
|
error: err ? err.message : '',
|
||||||
title: '[[pages:confirm]]',
|
title: '[[pages:confirm]]',
|
||||||
|
|||||||
@@ -73,11 +73,8 @@ User.validateEmail = async function (socket, uids) {
|
|||||||
throw new Error('[[error:invalid-data]]');
|
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) {
|
for (const uid of uids) {
|
||||||
await groups.join('verified-users', uid);
|
await user.email.confirmByUid(uid);
|
||||||
await groups.leave('unverified-users', uid);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var nconf = require('nconf');
|
const nconf = require('nconf');
|
||||||
|
const winston = require('winston');
|
||||||
|
|
||||||
var user = require('./index');
|
const user = require('./index');
|
||||||
var utils = require('../utils');
|
const utils = require('../utils');
|
||||||
var plugins = require('../plugins');
|
const plugins = require('../plugins');
|
||||||
var db = require('../database');
|
const db = require('../database');
|
||||||
var meta = require('../meta');
|
const meta = require('../meta');
|
||||||
var emailer = require('../emailer');
|
const emailer = require('../emailer');
|
||||||
const groups = require('../groups');
|
const groups = require('../groups');
|
||||||
|
|
||||||
var UserEmail = module.exports;
|
const UserEmail = module.exports;
|
||||||
|
|
||||||
UserEmail.exists = async function (email) {
|
UserEmail.exists = async function (email) {
|
||||||
const uid = await user.getUidByEmail(email.toLowerCase());
|
const uid = await user.getUidByEmail(email.toLowerCase());
|
||||||
@@ -88,6 +89,13 @@ UserEmail.sendValidationEmail = async function (uid, options) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
UserEmail.confirm = async function (code) {
|
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);
|
const confirmObj = await db.getObject('confirm:' + code);
|
||||||
if (!confirmObj || !confirmObj.uid || !confirmObj.email) {
|
if (!confirmObj || !confirmObj.uid || !confirmObj.email) {
|
||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
@@ -96,10 +104,24 @@ UserEmail.confirm = async function (code) {
|
|||||||
if (!currentEmail || currentEmail.toLowerCase() !== confirmObj.email) {
|
if (!currentEmail || currentEmail.toLowerCase() !== confirmObj.email) {
|
||||||
throw new Error('[[error:invalid-email]]');
|
throw new Error('[[error:invalid-email]]');
|
||||||
}
|
}
|
||||||
await user.setUserField(confirmObj.uid, 'email:confirmed', 1);
|
await UserEmail.confirmByUid(confirmObj.uid);
|
||||||
await groups.join('verified-users', confirmObj.uid);
|
|
||||||
await groups.leave('unverified-users', confirmObj.uid);
|
|
||||||
await db.delete('confirm:' + code);
|
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 () {
|
describe('email confirm', function () {
|
||||||
it('should error with invalid code', function (done) {
|
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]]');
|
assert.equal(err.message, '[[error:invalid-data]]');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -2351,7 +2351,25 @@ describe('User', function () {
|
|||||||
const code = await User.email.sendValidationEmail(uid, email);
|
const code = await User.email.sendValidationEmail(uid, email);
|
||||||
const unverified = await groups.isMember(uid, 'unverified-users');
|
const unverified = await groups.isMember(uid, 'unverified-users');
|
||||||
assert.strictEqual(unverified, true);
|
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([
|
const [confirmed, isVerified] = await Promise.all([
|
||||||
db.getObjectField('user:' + uid, 'email:confirmed'),
|
db.getObjectField('user:' + uid, 'email:confirmed'),
|
||||||
groups.isMember(uid, 'verified-users', uid),
|
groups.isMember(uid, 'verified-users', uid),
|
||||||
|
|||||||
Reference in New Issue
Block a user