| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-25 10:19:15 +02:00
										 |  |  | var async = require('async'); | 
					
						
							|  |  |  | var validator = require('validator'); | 
					
						
							| 
									
										
										
										
											2016-09-14 14:33:39 +03:00
										 |  |  | var winston = require('winston'); | 
					
						
							| 
									
										
										
										
											2017-04-26 14:57:49 -06:00
										 |  |  | var nconf = require('nconf'); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-25 10:19:15 +02:00
										 |  |  | var user = require('../../user'); | 
					
						
							|  |  |  | var groups = require('../../groups'); | 
					
						
							| 
									
										
										
										
											2016-10-13 11:42:29 +02:00
										 |  |  | var plugins = require('../../plugins'); | 
					
						
							| 
									
										
										
										
											2015-12-25 10:19:15 +02:00
										 |  |  | var meta = require('../../meta'); | 
					
						
							| 
									
										
										
										
											2017-04-08 20:22:21 -06:00
										 |  |  | var utils = require('../../utils'); | 
					
						
							| 
									
										
										
										
											2017-04-28 18:48:32 -04:00
										 |  |  | var privileges = require('../../privileges'); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-28 18:48:32 -04:00
										 |  |  | var helpers = module.exports; | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | helpers.getUserDataByUserSlug = function (userslug, callerUID, callback) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 	async.waterfall([ | 
					
						
							|  |  |  | 		function (next) { | 
					
						
							|  |  |  | 			user.getUidByUserslug(userslug, next); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		function (uid, next) { | 
					
						
							|  |  |  | 			if (!uid) { | 
					
						
							| 
									
										
										
										
											2015-09-25 18:51:27 -04:00
										 |  |  | 				return callback(null, null); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			async.parallel({ | 
					
						
							| 
									
										
										
										
											2016-11-15 12:45:00 +03:00
										 |  |  | 				userData: function (next) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 					user.getUserData(uid, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-11-15 12:45:00 +03:00
										 |  |  | 				isTargetAdmin: function (next) { | 
					
						
							|  |  |  | 					user.isAdministrator(uid, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 				userSettings: function (next) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 					user.getSettings(uid, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-11-15 12:45:00 +03:00
										 |  |  | 				isAdmin: function (next) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 					user.isAdministrator(callerUID, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 				isGlobalModerator: function (next) { | 
					
						
							| 
									
										
										
										
											2016-01-25 13:36:10 +02:00
										 |  |  | 					user.isGlobalModerator(callerUID, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-10-24 15:58:57 -04:00
										 |  |  | 				isModerator: function (next) { | 
					
						
							|  |  |  | 					user.isModeratorOfAnyCategory(callerUID, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 				isFollowing: function (next) { | 
					
						
							| 
									
										
										
										
											2016-09-14 14:33:39 +03:00
										 |  |  | 					user.isFollowing(callerUID, uid, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 				ips: function (next) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 					user.getIPs(uid, 4, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 				profile_links: function (next) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 					plugins.fireHook('filter:user.profileLinks', [], next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 				profile_menu: function (next) { | 
					
						
							| 
									
										
										
										
											2017-02-18 12:30:49 -07:00
										 |  |  | 					plugins.fireHook('filter:user.profileMenu', { uid: uid, callerUID: callerUID, links: [] }, next); | 
					
						
							| 
									
										
										
										
											2016-09-14 15:56:35 +03:00
										 |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 				groups: function (next) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 					groups.getUserGroups([uid], next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 				sso: function (next) { | 
					
						
							| 
									
										
										
										
											2017-02-18 12:30:49 -07:00
										 |  |  | 					plugins.fireHook('filter:auth.list', { uid: uid, associations: [] }, next); | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2017-04-28 18:48:32 -04:00
										 |  |  | 				canBanUser: function (next) { | 
					
						
							|  |  |  | 					privileges.users.canBanUser(callerUID, uid, next); | 
					
						
							|  |  |  | 				}, | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			}, next); | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		function (results, next) { | 
					
						
							|  |  |  | 			if (!results.userData) { | 
					
						
							|  |  |  | 				return callback(new Error('[[error:invalid-uid]]')); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			var userData = results.userData; | 
					
						
							|  |  |  | 			var userSettings = results.userSettings; | 
					
						
							|  |  |  | 			var isAdmin = results.isAdmin; | 
					
						
							| 
									
										
										
										
											2016-02-16 18:04:02 +02:00
										 |  |  | 			var isGlobalModerator = results.isGlobalModerator; | 
					
						
							| 
									
										
										
										
											2016-10-24 15:58:57 -04:00
										 |  |  | 			var isModerator = results.isModerator; | 
					
						
							| 
									
										
										
										
											2016-03-24 15:10:11 -04:00
										 |  |  | 			var isSelf = parseInt(callerUID, 10) === parseInt(userData.uid, 10); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-08 14:57:55 -05:00
										 |  |  | 			userData.joindateISO = utils.toISOString(userData.joindate); | 
					
						
							| 
									
										
										
										
											2015-11-05 12:54:15 -05:00
										 |  |  | 			userData.lastonlineISO = utils.toISOString(userData.lastonline || userData.joindate); | 
					
						
							| 
									
										
										
										
											2015-12-11 15:24:49 +02:00
										 |  |  | 			userData.age = Math.max(0, userData.birthday ? Math.floor((new Date().getTime() - new Date(userData.birthday).getTime()) / 31536000000) : 0); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-20 15:07:11 -05:00
										 |  |  | 			userData.emailClass = 'hide'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-26 14:32:53 -04:00
										 |  |  | 			if (!isAdmin && !isGlobalModerator && !isSelf && (!userSettings.showemail || parseInt(meta.config.hideEmail, 10) === 1)) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 				userData.email = ''; | 
					
						
							| 
									
										
										
										
											2016-03-20 15:07:11 -05:00
										 |  |  | 			} else if (!userSettings.showemail) { | 
					
						
							|  |  |  | 				userData.emailClass = ''; | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-26 14:32:53 -04:00
										 |  |  | 			if (!isAdmin && !isGlobalModerator && !isSelf && (!userSettings.showfullname || parseInt(meta.config.hideFullname, 10) === 1)) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 				userData.fullname = ''; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-15 12:45:00 +03:00
										 |  |  | 			if (isAdmin || isSelf || (isGlobalModerator && !results.isTargetAdmin)) { | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 				userData.ips = results.ips; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-24 15:58:57 -04:00
										 |  |  | 			if (!isAdmin && !isGlobalModerator && !isModerator) { | 
					
						
							| 
									
										
										
										
											2016-09-30 18:42:19 +03:00
										 |  |  | 				userData.moderationNote = undefined; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			userData.uid = userData.uid; | 
					
						
							|  |  |  | 			userData.yourid = callerUID; | 
					
						
							|  |  |  | 			userData.theirid = userData.uid; | 
					
						
							| 
									
										
										
										
											2016-11-15 12:45:00 +03:00
										 |  |  | 			userData.isTargetAdmin = results.isTargetAdmin; | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			userData.isAdmin = isAdmin; | 
					
						
							| 
									
										
										
										
											2016-02-16 18:04:02 +02:00
										 |  |  | 			userData.isGlobalModerator = isGlobalModerator; | 
					
						
							| 
									
										
										
										
											2016-10-24 15:58:57 -04:00
										 |  |  | 			userData.isModerator = isModerator; | 
					
						
							| 
									
										
										
										
											2016-09-21 12:55:44 +03:00
										 |  |  | 			userData.isAdminOrGlobalModerator = isAdmin || isGlobalModerator; | 
					
						
							| 
									
										
										
										
											2016-10-24 15:58:57 -04:00
										 |  |  | 			userData.isAdminOrGlobalModeratorOrModerator = isAdmin || isGlobalModerator || isModerator; | 
					
						
							| 
									
										
										
										
											2016-12-02 10:50:42 -05:00
										 |  |  | 			userData.isSelfOrAdminOrGlobalModerator = isSelf || isAdmin || isGlobalModerator; | 
					
						
							| 
									
										
										
										
											2016-11-15 12:45:00 +03:00
										 |  |  | 			userData.canEdit = isAdmin || (isGlobalModerator && !results.isTargetAdmin); | 
					
						
							| 
									
										
										
										
											2017-04-28 18:48:32 -04:00
										 |  |  | 			userData.canBan = results.canBanUser; | 
					
						
							| 
									
										
										
										
											2016-03-24 15:10:11 -04:00
										 |  |  | 			userData.canChangePassword = isAdmin || (isSelf && parseInt(meta.config['password:disableEdit'], 10) !== 1); | 
					
						
							|  |  |  | 			userData.isSelf = isSelf; | 
					
						
							| 
									
										
										
										
											2016-09-14 14:33:39 +03:00
										 |  |  | 			userData.isFollowing = results.isFollowing; | 
					
						
							| 
									
										
										
										
											2016-11-15 12:45:00 +03:00
										 |  |  | 			userData.showHidden = isSelf || isAdmin || (isGlobalModerator && !results.isTargetAdmin); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			userData.groups = Array.isArray(results.groups) && results.groups.length ? results.groups[0] : []; | 
					
						
							|  |  |  | 			userData.disableSignatures = meta.config.disableSignatures !== undefined && parseInt(meta.config.disableSignatures, 10) === 1; | 
					
						
							| 
									
										
										
										
											2016-03-02 15:15:11 +02:00
										 |  |  | 			userData['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; | 
					
						
							|  |  |  | 			userData['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); | 
					
						
							| 
									
										
										
										
											2017-01-11 15:06:28 -05:00
										 |  |  | 			userData.profile_links = filterLinks(results.profile_links.concat(results.profile_menu.links), { | 
					
						
							|  |  |  | 				self: isSelf, | 
					
						
							|  |  |  | 				other: !isSelf, | 
					
						
							|  |  |  | 				moderator: isModerator, | 
					
						
							|  |  |  | 				globalMod: isGlobalModerator, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 				admin: isAdmin, | 
					
						
							| 
									
										
										
										
											2017-01-11 15:06:28 -05:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2016-09-14 15:56:35 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			userData.sso = results.sso.associations; | 
					
						
							| 
									
										
										
										
											2015-11-05 12:34:39 -05:00
										 |  |  | 			userData.status = user.getStatus(userData); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			userData.banned = parseInt(userData.banned, 10) === 1; | 
					
						
							| 
									
										
										
										
											2016-08-27 15:45:15 +03:00
										 |  |  | 			userData.website = validator.escape(String(userData.website || '')); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			userData.websiteLink = !userData.website.startsWith('http') ? 'http://' + userData.website : userData.website; | 
					
						
							|  |  |  | 			userData.websiteName = userData.website.replace(validator.escape('http://'), '').replace(validator.escape('https://'), ''); | 
					
						
							|  |  |  | 			userData.followingCount = parseInt(userData.followingCount, 10) || 0; | 
					
						
							|  |  |  | 			userData.followerCount = parseInt(userData.followerCount, 10) || 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-27 15:45:15 +03:00
										 |  |  | 			userData.email = validator.escape(String(userData.email || '')); | 
					
						
							|  |  |  | 			userData.fullname = validator.escape(String(userData.fullname || '')); | 
					
						
							|  |  |  | 			userData.location = validator.escape(String(userData.location || '')); | 
					
						
							|  |  |  | 			userData.signature = validator.escape(String(userData.signature || '')); | 
					
						
							|  |  |  | 			userData.aboutme = validator.escape(String(userData.aboutme || '')); | 
					
						
							| 
									
										
										
										
											2016-09-26 17:09:26 +03:00
										 |  |  | 			userData.birthday = validator.escape(String(userData.birthday || '')); | 
					
						
							| 
									
										
										
										
											2016-09-30 18:42:19 +03:00
										 |  |  | 			userData.moderationNote = validator.escape(String(userData.moderationNote || '')); | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-06 20:45:58 +01:00
										 |  |  | 			if (userData['cover:url']) { | 
					
						
							| 
									
										
										
										
											2017-11-08 16:32:16 -05:00
										 |  |  | 				userData['cover:url'] = userData['cover:url'].startsWith('http') ? userData['cover:url'] : (nconf.get('relative_path') + userData['cover:url']); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:45:58 +01:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2017-11-08 16:32:16 -05:00
										 |  |  | 				userData['cover:url'] = require('../../coverPhoto').getDefaultProfileCover(userData.uid); | 
					
						
							| 
									
										
										
										
											2017-11-06 20:45:58 +01:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-11-08 16:32:16 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-17 16:00:39 +03:00
										 |  |  | 			userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%')); | 
					
						
							| 
									
										
										
										
											2015-12-25 10:19:15 +02:00
										 |  |  | 			userData['username:disableEdit'] = !userData.isAdmin && parseInt(meta.config['username:disableEdit'], 10) === 1; | 
					
						
							|  |  |  | 			userData['email:disableEdit'] = !userData.isAdmin && parseInt(meta.config['email:disableEdit'], 10) === 1; | 
					
						
							| 
									
										
										
										
											2015-10-29 15:56:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 			next(null, userData); | 
					
						
							| 
									
										
										
										
											2017-02-17 19:31:21 -07:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2015-09-25 01:52:41 -04:00
										 |  |  | 	], callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-25 13:11:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | helpers.getBaseUser = function (userslug, callerUID, callback) { | 
					
						
							| 
									
										
										
										
											2016-09-14 14:33:39 +03:00
										 |  |  | 	winston.warn('helpers.getBaseUser deprecated please use helpers.getUserDataByUserSlug'); | 
					
						
							|  |  |  | 	helpers.getUserDataByUserSlug(userslug, callerUID, callback); | 
					
						
							| 
									
										
										
										
											2015-09-25 13:11:11 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-11 15:06:28 -05:00
										 |  |  | function filterLinks(links, states) { | 
					
						
							|  |  |  | 	return links.filter(function (link, index) { | 
					
						
							|  |  |  | 		// "public" is the old property, if visibility is defined, discard `public`
 | 
					
						
							|  |  |  | 		if (link.hasOwnProperty('public') && !link.hasOwnProperty('visibility')) { | 
					
						
							|  |  |  | 			winston.warn('[account/profileMenu (' + link.id + ')] Use of the `.public` property is deprecated, use `visibility` now'); | 
					
						
							|  |  |  | 			return link && (link.public || states.self); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Default visibility
 | 
					
						
							|  |  |  | 		link.visibility = Object.assign({ | 
					
						
							|  |  |  | 			self: true, | 
					
						
							|  |  |  | 			other: true, | 
					
						
							|  |  |  | 			moderator: true, | 
					
						
							|  |  |  | 			globalMod: true, | 
					
						
							| 
									
										
										
										
											2017-02-24 12:47:46 -05:00
										 |  |  | 			admin: true, | 
					
						
							| 
									
										
										
										
											2017-01-11 15:06:28 -05:00
										 |  |  | 		}, link.visibility); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var permit = Object.keys(states).some(function (state) { | 
					
						
							| 
									
										
										
										
											2017-08-18 20:08:19 -04:00
										 |  |  | 			return states[state] && link.visibility[state]; | 
					
						
							| 
									
										
										
										
											2017-01-11 15:06:28 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		links[index].public = permit; | 
					
						
							|  |  |  | 		return permit; | 
					
						
							| 
									
										
										
										
											2015-11-05 21:03:01 -05:00
										 |  |  | 	}); | 
					
						
							|  |  |  | } |