diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 48ed0393e6..ea0378c180 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -140,7 +140,7 @@ authenticationController.registerComplete = function (req, res, next) { plugins.hooks.fire('filter:register.interstitial', { userData: req.session.registration, interstitials: [], - }, function (err, data) { + }, async (err, data) => { if (err) { return next(err); } @@ -148,12 +148,7 @@ authenticationController.registerComplete = function (req, res, next) { var callbacks = data.interstitials.reduce(function (memo, cur) { if (cur.hasOwnProperty('callback') && typeof cur.callback === 'function') { req.body.files = req.files; - memo.push(function (next) { - cur.callback(req.session.registration, req.body, function (err) { - // Pass error as second argument so all callbacks are executed - next(null, err); - }); - }); + memo.push(cur.callback && cur.callback.constructor && cur.callback.constructor.name === 'AsyncFunction' ? cur.callback : util.promisify(cur.callback)); } return memo; @@ -168,6 +163,7 @@ authenticationController.registerComplete = function (req, res, next) { if (!err && data && data.message) { return res.redirect(nconf.get('relative_path') + '/?register=' + encodeURIComponent(data.message)); } + if (req.session.returnTo) { res.redirect(nconf.get('relative_path') + req.session.returnTo); } else { @@ -175,36 +171,34 @@ authenticationController.registerComplete = function (req, res, next) { } }; - async.parallel(callbacks, async function (_blank, err) { - if (err.length) { - err = err.filter(Boolean).map(err => err.message); - } - - if (err.length) { - req.flash('errors', err); - return res.redirect(nconf.get('relative_path') + '/register/complete'); - } + const results = await Promise.allSettled(callbacks.map(async (cb) => { + await cb(req.session.registration, req.body); + })); + const errors = results.map(result => result.reason && result.reason.message).filter(Boolean); + if (errors.length) { + req.flash('errors', errors); + return res.redirect(nconf.get('relative_path') + '/register/complete'); + } - if (req.session.registration.register === true) { - res.locals.processLogin = true; - registerAndLoginUserCallback(req, res, req.session.registration, done); - } else { - // Update user hash, clear registration data in session - const payload = req.session.registration; - const uid = payload.uid; - delete payload.uid; - delete payload.returnTo; - - Object.keys(payload).forEach((prop) => { - if (typeof payload[prop] === 'boolean') { - payload[prop] = payload[prop] ? 1 : 0; - } - }); + if (req.session.registration.register === true) { + res.locals.processLogin = true; + registerAndLoginUserCallback(req, res, req.session.registration, done); + } else { + // Update user hash, clear registration data in session + const payload = req.session.registration; + const uid = payload.uid; + delete payload.uid; + delete payload.returnTo; + + Object.keys(payload).forEach((prop) => { + if (typeof payload[prop] === 'boolean') { + payload[prop] = payload[prop] ? 1 : 0; + } + }); - await user.setUserFields(uid, payload); - done(); - } - }); + await user.setUserFields(uid, payload); + done(); + } }); };