From 3ff7719cd44f6e24f1050c579746e78829b27650 Mon Sep 17 00:00:00 2001 From: Steve Lacy Date: Wed, 15 Oct 2014 16:26:40 -0700 Subject: [PATCH] add hook: filter: user.updateProfile --- src/user/profile.js | 191 +++++++++++++++++++++++--------------------- 1 file changed, 100 insertions(+), 91 deletions(-) diff --git a/src/user/profile.js b/src/user/profile.js index 8b46f53994..1c872fb268 100644 --- a/src/user/profile.js +++ b/src/user/profile.js @@ -9,113 +9,122 @@ var async = require('async'), meta = require('../meta'), events = require('../events'), db = require('../database'), - Password = require('../password'); + Password = require('../password'), + plugins = require('./../plugins'); module.exports = function(User) { User.updateProfile = function(uid, data, callback) { - var fields = ['username', 'email', 'fullname', 'website', 'location', 'birthday', 'signature']; - function isSignatureValid(next) { - if (data.signature !== undefined && data.signature.length > meta.config.maximumSignatureLength) { - next(new Error('[[error:signature-too-long, ' + meta.config.maximumSignatureLength + ']]')); - } else { - next(); - } - } - - function isEmailAvailable(next) { - if (!data.email) { - return next(); - } - - if (!utils.isEmailValid(data.email)) { - return next(new Error('[[error:invalid-email]]')); - } - - User.getUserField(uid, 'email', function(err, email) { - if(email === data.email) { - return next(); - } - - User.email.available(data.email, function(err, available) { - if (err) { - return next(err); - } - - next(!available ? new Error('[[error:email-taken]]') : null); - }); - }); - } - - function isUsernameAvailable(next) { - User.getUserFields(uid, ['username', 'userslug'], function(err, userData) { - - var userslug = utils.slugify(data.username); - - if(userslug === userData.userslug) { - return next(); - } - - if (data.username.length < meta.config.minimumUsernameLength) { - return next(new Error('[[error:username-too-short]]')); - } - - if (data.username.length > meta.config.maximumUsernameLength) { - return next(new Error('[[error:username-too-long]]')); - } - - if(!utils.isUserNameValid(data.username) || !userslug) { - return next(new Error('[[error:invalid-username]]')); - } - - User.exists(userslug, function(err, exists) { - if(err) { - return next(err); - } - - next(exists ? new Error('[[error:username-taken]]') : null); - }); - }); - } - - async.series([isSignatureValid, isEmailAvailable, isUsernameAvailable], function(err, results) { - if (err) { + plugins.fireHook('filter:user.updateProfile', {uid: uid, settings: data.settings}, function(err, data) { + if(err) { return callback(err); } - async.each(fields, updateField, function(err) { + data = data.settings; + var fields = ['username', 'email', 'fullname', 'website', 'location', 'birthday', 'signature']; + + function isSignatureValid(next) { + if (data.signature !== undefined && data.signature.length > meta.config.maximumSignatureLength) { + next(new Error('[[error:signature-too-long, ' + meta.config.maximumSignatureLength + ']]')); + } else { + next(); + } + } + + function isEmailAvailable(next) { + if (!data.email) { + return next(); + } + + if (!utils.isEmailValid(data.email)) { + return next(new Error('[[error:invalid-email]]')); + } + + User.getUserField(uid, 'email', function(err, email) { + if(email === data.email) { + return next(); + } + + User.email.available(data.email, function(err, available) { + if (err) { + return next(err); + } + + next(!available ? new Error('[[error:email-taken]]') : null); + }); + }); + } + + function isUsernameAvailable(next) { + User.getUserFields(uid, ['username', 'userslug'], function(err, userData) { + + var userslug = utils.slugify(data.username); + + if(userslug === userData.userslug) { + return next(); + } + + if (data.username.length < meta.config.minimumUsernameLength) { + return next(new Error('[[error:username-too-short]]')); + } + + if (data.username.length > meta.config.maximumUsernameLength) { + return next(new Error('[[error:username-too-long]]')); + } + + if(!utils.isUserNameValid(data.username) || !userslug) { + return next(new Error('[[error:invalid-username]]')); + } + + User.exists(userslug, function(err, exists) { + if(err) { + return next(err); + } + + next(exists ? new Error('[[error:username-taken]]') : null); + }); + }); + } + + async.series([isSignatureValid, isEmailAvailable, isUsernameAvailable], function(err, results) { if (err) { return callback(err); } - User.getUserFields(uid, ['email', 'userslug', 'picture', 'gravatarpicture'], callback); + async.each(fields, updateField, function(err) { + if (err) { + return callback(err); + } + + User.getUserFields(uid, ['email', 'userslug', 'picture', 'gravatarpicture'], callback); + }); }); - }); - function updateField(field, next) { - if (!(data[field] !== undefined && typeof data[field] === 'string')) { - return next(); - } - - data[field] = data[field].trim(); - data[field] = validator.escape(data[field]); - - if (field === 'email') { - return updateEmail(uid, data.email, next); - } else if (field === 'username') { - return updateUsername(uid, data.username, next); - } else if (field === 'signature') { - data[field] = S(data[field]).stripTags().s; - } else if (field === 'website') { - if(data[field].substr(0, 7) !== 'http://' && data[field].substr(0, 8) !== 'https://') { - data[field] = 'http://' + data[field]; + function updateField(field, next) { + if (!(data[field] !== undefined && typeof data[field] === 'string')) { + return next(); } - } - User.setUserField(uid, field, data[field], next); - } - }; + data[field] = data[field].trim(); + data[field] = validator.escape(data[field]); + + if (field === 'email') { + return updateEmail(uid, data.email, next); + } else if (field === 'username') { + return updateUsername(uid, data.username, next); + } else if (field === 'signature') { + data[field] = S(data[field]).stripTags().s; + } else if (field === 'website') { + if(data[field].substr(0, 7) !== 'http://' && data[field].substr(0, 8) !== 'https://') { + data[field] = 'http://' + data[field]; + } + } + + User.setUserField(uid, field, data[field], next); + } + }); + }; function updateEmail(uid, newEmail, callback) { User.getUserFields(uid, ['email', 'picture', 'uploadedpicture'], function(err, userData) {