diff --git a/lib/controllers.js b/lib/controllers.js index a9c81fc..7dacad1 100644 --- a/lib/controllers.js +++ b/lib/controllers.js @@ -74,7 +74,7 @@ Controllers.editStrategy = async (req, res) => { payload.enabled = !!req.body.enabled; - const checkboxes = ['forceUsernameViaEmail', 'usernameViaEmail', 'trustEmailVerified', 'syncFullname', 'syncPicture']; + const checkboxes = ['forceUsernameViaEmail', 'usernameViaEmail', 'trustEmailVerified', 'skipEmailVerification', 'syncFullname', 'syncPicture']; checkboxes.forEach((prop) => { payload[prop] = payload.hasOwnProperty(prop) && payload[prop] === 'on' ? 1 : 0; }); diff --git a/library.js b/library.js index 961bb15..dc456bf 100644 --- a/library.js +++ b/library.js @@ -211,22 +211,53 @@ OAuth.getAssociations = async () => { })); }; +OAuth.isEmailVerifiedByProvider = (strategy, payload) => ( + !!parseInt(strategy.trustEmailVerified, 10) && + (payload.email_verified || payload.email_verified === true) +); + +OAuth.isEmailTrusted = (strategy, payload) => { + if (parseInt(strategy.skipEmailVerification, 10)) { + return true; + } + + return OAuth.isEmailVerifiedByProvider(strategy, payload); +}; + +OAuth.confirmEmailIfTrusted = async (payload, uid) => { + const strategy = await OAuth.getStrategy(payload.name); + if (!payload.email || !OAuth.isEmailTrusted(strategy, payload)) { + return; + } + + const { email, 'email:confirmed': confirmed } = await user.getUserFields(uid, ['email', 'email:confirmed']); + if (parseInt(confirmed, 10) === 1 || (email && email.toLowerCase() !== payload.email.toLowerCase())) { + return; + } + + if (!email) { + await user.setUserField(uid, 'email', payload.email); + } + + await user.email.confirmByUid(uid); + winston.verbose(`[plugin/sso-oauth2-multiple] Confirmed email for uid ${uid} via ${payload.name}`); +}; + OAuth.login = async (payload) => { let uid = await OAuth.getUidByOAuthid(payload.name, payload.oAuthid); if (uid !== null) { // Existing User + await OAuth.confirmEmailIfTrusted(payload, uid); return ({ uid }); } - const { trustEmailVerified } = await OAuth.getStrategy(payload.name); + const strategy = await OAuth.getStrategy(payload.name); const { email } = payload; - const email_verified = - parseInt(trustEmailVerified, 10) && - (payload.email_verified || payload.email_verified === true); + const email_verified = OAuth.isEmailTrusted(strategy, payload); // Check for user via email fallback - if (email && email_verified) { + if (email && OAuth.isEmailVerifiedByProvider(strategy, payload)) { uid = await user.getUidByEmail(payload.email); } diff --git a/static/templates/partials/edit-oauth2-strategy.tpl b/static/templates/partials/edit-oauth2-strategy.tpl index dcc4f65..50f9f6b 100644 --- a/static/templates/partials/edit-oauth2-strategy.tpl +++ b/static/templates/partials/edit-oauth2-strategy.tpl @@ -121,6 +121,11 @@ +