Files
NodeBB/src/controllers/accounts/helpers.js

224 lines
7.9 KiB
JavaScript
Raw Normal View History

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');
var winston = require('winston');
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');
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
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);
},
isGlobalModerator: function (next) {
2016-01-25 13:36:10 +02:00
user.isGlobalModerator(callerUID, next);
},
isModerator: function (next) {
user.isModeratorOfAnyCategory(callerUID, next);
},
isFollowing: function (next) {
user.isFollowing(callerUID, uid, next);
},
ips: function (next) {
2015-09-25 01:52:41 -04:00
user.getIPs(uid, 4, next);
},
profile_menu: function (next) {
plugins.fireHook('filter:user.profileMenu', {
uid: uid,
callerUID: callerUID,
links: [{
id: 'info',
route: 'info',
name: '[[user:account_info]]',
visibility: {
self: false,
other: false,
moderator: true,
globalMod: true,
admin: true,
},
}, {
id: 'consent',
route: 'consent',
name: '[[user:consent.title]]',
visibility: {
self: true,
other: false,
moderator: false,
globalMod: false,
admin: false,
},
}],
}, next);
2016-09-14 15:56:35 +03:00
},
groups: function (next) {
2015-09-25 01:52:41 -04:00
groups.getUserGroups([uid], next);
},
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
},
2018-01-22 15:01:10 -05:00
canEdit: function (next) {
privileges.users.canEdit(callerUID, uid, next);
},
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;
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
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 = '';
} 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 = '';
}
if (isAdmin || isSelf || ((isGlobalModerator || isModerator) && !results.isTargetAdmin)) {
2015-09-25 01:52:41 -04:00
userData.ips = results.ips;
}
if (!isAdmin && !isGlobalModerator && !isModerator) {
userData.moderationNote = undefined;
}
2015-09-25 01:52:41 -04:00
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;
userData.isModerator = isModerator;
userData.isAdminOrGlobalModerator = isAdmin || isGlobalModerator;
userData.isAdminOrGlobalModeratorOrModerator = isAdmin || isGlobalModerator || isModerator;
userData.isSelfOrAdminOrGlobalModerator = isSelf || isAdmin || isGlobalModerator;
2018-01-22 15:01:10 -05:00
userData.canEdit = results.canEdit;
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;
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);
2018-06-03 14:46:23 -04:00
userData.profile_links = filterLinks(results.profile_menu.links, {
self: isSelf,
other: !isSelf,
moderator: isModerator,
globalMod: isGlobalModerator,
2017-02-24 12:47:46 -05:00
admin: isAdmin,
});
2016-09-14 15:56:35 +03:00
2015-09-25 01:52:41 -04:00
userData.sso = results.sso.associations;
userData.status = user.getStatus(userData);
2015-09-25 01:52:41 -04:00
userData.banned = parseInt(userData.banned, 10) === 1;
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;
2018-04-27 12:51:04 -04:00
userData.blocksCount = parseInt(userData.blocksCount, 10) || 0;
2015-09-25 01:52:41 -04: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 || ''));
userData.moderationNote = validator.escape(String(userData.moderationNote || ''));
2015-09-25 01:52:41 -04: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']);
} else {
2017-11-08 16:32:16 -05:00
userData['cover:url'] = require('../../coverPhoto').getDefaultProfileCover(userData.uid);
}
2017-11-08 16:32:16 -05: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-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);
};
helpers.getBaseUser = function (userslug, callerUID, callback) {
winston.warn('helpers.getBaseUser deprecated please use helpers.getUserDataByUserSlug');
helpers.getUserDataByUserSlug(userslug, callerUID, callback);
};
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,
}, link.visibility);
var permit = Object.keys(states).some(function (state) {
2017-08-18 20:08:19 -04:00
return states[state] && link.visibility[state];
});
links[index].public = permit;
return permit;
2015-11-05 21:03:01 -05:00
});
}