1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× | 'use strict'; var async = require('async'); var validator = require('validator'); var user = require('../../user'); var groups = require('../../groups'); var plugins =require('../../plugins'); var meta = require('../../meta'); var utils = require('../../../public/src/utils'); var helpers = {}; helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { async.waterfall([ function (next) { user.getUidByUserslug(userslug, next); }, function (uid, next) { if (!uid) { return callback(null, null); } async.parallel({ userData : function(next) { user.getUserData(uid, next); }, userSettings : function(next) { user.getSettings(uid, next); }, isAdmin : function(next) { user.isAdministrator(callerUID, next); }, isGlobalModerator: function(next) { user.isGlobalModerator(callerUID, next); }, ips: function(next) { user.getIPs(uid, 4, next); }, profile_links: function(next) { plugins.fireHook('filter:user.profileLinks', [], next); }, groups: function(next) { groups.getUserGroups([uid], next); }, sso: function(next) { plugins.fireHook('filter:auth.list', {uid: uid, associations: []}, next); } }, 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; var isGlobalModerator = results.isGlobalModerator; var isSelf = parseInt(callerUID, 10) === parseInt(userData.uid, 10); userData.joindateISO = utils.toISOString(userData.joindate); userData.lastonlineISO = utils.toISOString(userData.lastonline || userData.joindate); userData.age = Math.max(0, userData.birthday ? Math.floor((new Date().getTime() - new Date(userData.birthday).getTime()) / 31536000000) : 0); userData.emailClass = 'hide'; if (!(isAdmin || isGlobalModerator || isSelf || (userData.email && userSettings.showemail))) { userData.email = ''; } else if (!userSettings.showemail) { userData.emailClass = ''; } if (!isAdmin && !isGlobalModerator && !isSelf && !userSettings.showfullname) { userData.fullname = ''; } if (isAdmin || isGlobalModerator || isSelf) { userData.ips = results.ips; } userData.uid = userData.uid; userData.yourid = callerUID; userData.theirid = userData.uid; userData.isAdmin = isAdmin; userData.isGlobalModerator = isGlobalModerator; userData.canBan = isAdmin || isGlobalModerator; userData.canChangePassword = isAdmin || (isSelf && parseInt(meta.config['password:disableEdit'], 10) !== 1); userData.isSelf = isSelf; userData.showHidden = isSelf || isAdmin || isGlobalModerator; userData.groups = Array.isArray(results.groups) && results.groups.length ? results.groups[0] : []; userData.disableSignatures = meta.config.disableSignatures !== undefined && parseInt(meta.config.disableSignatures, 10) === 1; userData['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; userData['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; userData['email:confirmed'] = !!parseInt(userData['email:confirmed'], 10); userData.profile_links = filterLinks(results.profile_links, isSelf); userData.sso = results.sso.associations; userData.status = user.getStatus(userData); userData.banned = parseInt(userData.banned, 10) === 1; userData.website = validator.escape(userData.website || ''); 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; userData.email = validator.escape(userData.email || ''); userData.fullname = validator.escape(userData.fullname || ''); userData.location = validator.escape(userData.location || ''); userData.signature = validator.escape(userData.signature || ''); userData.aboutme = validator.escape(userData.aboutme || ''); userData['cover:url'] = userData['cover:url'] || require('../../coverPhoto').getDefaultProfileCover(userData.uid); userData['cover:position'] = userData['cover:position'] || '50% 50%'; userData['username:disableEdit'] = !userData.isAdmin && parseInt(meta.config['username:disableEdit'], 10) === 1; userData['email:disableEdit'] = !userData.isAdmin && parseInt(meta.config['email:disableEdit'], 10) === 1; next(null, userData); } ], callback); }; helpers.getBaseUser = function(userslug, callerUID, callback) { async.waterfall([ function (next) { user.getUidByUserslug(userslug, next); }, function (uid, next) { if (!uid) { return callback(null, null); } async.parallel({ user: function(next) { user.getUserFields(uid, ['uid', 'username', 'userslug', 'picture', 'cover:url', 'cover:position', 'status', 'lastonline', 'groupTitle'], next); }, isAdmin: function(next) { user.isAdministrator(callerUID, next); }, isGlobalModerator: function(next) { user.isGlobalModerator(callerUID, next); }, profile_links: function(next) { plugins.fireHook('filter:user.profileLinks', [], next); } }, next); }, function (results, next) { if (!results.user) { return callback(); } results.user.yourid = callerUID; results.user.theirid = results.user.uid; results.user.status = user.getStatus(results.user); results.user.isSelf = parseInt(callerUID, 10) === parseInt(results.user.uid, 10); results.user.showHidden = results.user.isSelf || results.isAdmin || results.isGlobalModerator; results.user.profile_links = filterLinks(results.profile_links, results.user.isSelf); results.user['reputation:disabled'] = parseInt(meta.config['reputation:disabled'], 10) === 1; results.user['downvote:disabled'] = parseInt(meta.config['downvote:disabled'], 10) === 1; results.user['cover:url'] = results.user['cover:url'] || require('../../coverPhoto').getDefaultProfileCover(results.user.uid); results.user['cover:position'] = results.user['cover:position'] || '50% 50%'; next(null, results.user); } ], callback); }; function filterLinks(links, self) { return links.filter(function(link) { return link && (link.public || self); }); } module.exports = helpers; |