mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-20 23:40:38 +01:00
feat: #7743 account/posts controller
This commit is contained in:
@@ -1,234 +1,191 @@
|
||||
'use strict';
|
||||
|
||||
const validator = require('validator');
|
||||
const winston = require('winston');
|
||||
const nconf = require('nconf');
|
||||
|
||||
var async = require('async');
|
||||
var validator = require('validator');
|
||||
var winston = require('winston');
|
||||
var nconf = require('nconf');
|
||||
|
||||
var user = require('../../user');
|
||||
var groups = require('../../groups');
|
||||
var plugins = require('../../plugins');
|
||||
var meta = require('../../meta');
|
||||
var utils = require('../../utils');
|
||||
var privileges = require('../../privileges');
|
||||
const user = require('../../user');
|
||||
const groups = require('../../groups');
|
||||
const plugins = require('../../plugins');
|
||||
const meta = require('../../meta');
|
||||
const utils = require('../../utils');
|
||||
const privileges = require('../../privileges');
|
||||
const translator = require('../../translator');
|
||||
|
||||
var helpers = module.exports;
|
||||
const helpers = module.exports;
|
||||
|
||||
helpers.getUserDataByUserSlug = function (userslug, callerUID, callback) {
|
||||
let results;
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
user.getUidByUserslug(userslug, next);
|
||||
},
|
||||
function (uid, next) {
|
||||
if (!uid) {
|
||||
return callback(null, null);
|
||||
}
|
||||
helpers.getUserDataByUserSlug = async function (userslug, callerUID) {
|
||||
const uid = await user.getUidByUserslug(userslug);
|
||||
if (!uid) {
|
||||
return null;
|
||||
}
|
||||
|
||||
async.parallel({
|
||||
userData: function (next) {
|
||||
user.getUserData(uid, next);
|
||||
},
|
||||
isTargetAdmin: function (next) {
|
||||
user.isAdministrator(uid, next);
|
||||
},
|
||||
userSettings: function (next) {
|
||||
user.getSettings(uid, next);
|
||||
},
|
||||
isAdmin: function (next) {
|
||||
user.isAdministrator(callerUID, next);
|
||||
},
|
||||
isGlobalModerator: function (next) {
|
||||
user.isGlobalModerator(callerUID, next);
|
||||
},
|
||||
isModerator: function (next) {
|
||||
user.isModeratorOfAnyCategory(callerUID, next);
|
||||
},
|
||||
isFollowing: function (next) {
|
||||
user.isFollowing(callerUID, uid, next);
|
||||
},
|
||||
ips: function (next) {
|
||||
user.getIPs(uid, 4, next);
|
||||
},
|
||||
profile_menu: function (next) {
|
||||
const links = [{
|
||||
id: 'info',
|
||||
route: 'info',
|
||||
name: '[[user:account_info]]',
|
||||
visibility: {
|
||||
self: false,
|
||||
other: false,
|
||||
moderator: true,
|
||||
globalMod: true,
|
||||
admin: true,
|
||||
},
|
||||
}, {
|
||||
id: 'sessions',
|
||||
route: 'sessions',
|
||||
name: '[[pages:account/sessions]]',
|
||||
visibility: {
|
||||
self: true,
|
||||
other: false,
|
||||
moderator: false,
|
||||
globalMod: false,
|
||||
admin: false,
|
||||
},
|
||||
}];
|
||||
const results = await getAllData(uid, callerUID);
|
||||
if (!results.userData) {
|
||||
throw new Error('[[error:invalid-uid]]');
|
||||
}
|
||||
await parseAboutMe(results.userData);
|
||||
|
||||
if (meta.config.gdpr_enabled) {
|
||||
links.push({
|
||||
id: 'consent',
|
||||
route: 'consent',
|
||||
name: '[[user:consent.title]]',
|
||||
visibility: {
|
||||
self: true,
|
||||
other: false,
|
||||
moderator: false,
|
||||
globalMod: false,
|
||||
admin: false,
|
||||
},
|
||||
});
|
||||
}
|
||||
const userData = results.userData;
|
||||
const userSettings = results.userSettings;
|
||||
const isAdmin = results.isAdmin;
|
||||
const isGlobalModerator = results.isGlobalModerator;
|
||||
const isModerator = results.isModerator;
|
||||
const isSelf = parseInt(callerUID, 10) === parseInt(userData.uid, 10);
|
||||
|
||||
plugins.fireHook('filter:user.profileMenu', {
|
||||
uid: uid,
|
||||
callerUID: callerUID,
|
||||
links: links,
|
||||
}, next);
|
||||
},
|
||||
groups: function (next) {
|
||||
groups.getUserGroups([uid], next);
|
||||
},
|
||||
sso: function (next) {
|
||||
plugins.fireHook('filter:auth.list', { uid: uid, associations: [] }, next);
|
||||
},
|
||||
canEdit: function (next) {
|
||||
privileges.users.canEdit(callerUID, uid, next);
|
||||
},
|
||||
canBanUser: function (next) {
|
||||
privileges.users.canBanUser(callerUID, uid, next);
|
||||
},
|
||||
isBlocked: function (next) {
|
||||
user.blocks.is(uid, callerUID, next);
|
||||
},
|
||||
}, next);
|
||||
},
|
||||
function (_results, next) {
|
||||
results = _results;
|
||||
if (!results.userData) {
|
||||
return callback(new Error('[[error:invalid-uid]]'));
|
||||
}
|
||||
parseAboutMe(results.userData, next);
|
||||
},
|
||||
function (next) {
|
||||
var userData = results.userData;
|
||||
var userSettings = results.userSettings;
|
||||
var isAdmin = results.isAdmin;
|
||||
var isGlobalModerator = results.isGlobalModerator;
|
||||
var isModerator = results.isModerator;
|
||||
var isSelf = parseInt(callerUID, 10) === parseInt(userData.uid, 10);
|
||||
userData.age = Math.max(0, userData.birthday ? Math.floor((new Date().getTime() - new Date(userData.birthday).getTime()) / 31536000000) : 0);
|
||||
|
||||
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';
|
||||
|
||||
userData.emailClass = 'hide';
|
||||
if (!isAdmin && !isGlobalModerator && !isSelf && (!userSettings.showemail || meta.config.hideEmail)) {
|
||||
userData.email = '';
|
||||
} else if (!userSettings.showemail) {
|
||||
userData.emailClass = '';
|
||||
}
|
||||
|
||||
if (!isAdmin && !isGlobalModerator && !isSelf && (!userSettings.showemail || meta.config.hideEmail)) {
|
||||
userData.email = '';
|
||||
} else if (!userSettings.showemail) {
|
||||
userData.emailClass = '';
|
||||
}
|
||||
if (!isAdmin && !isGlobalModerator && !isSelf && (!userSettings.showfullname || meta.config.hideFullname)) {
|
||||
userData.fullname = '';
|
||||
}
|
||||
|
||||
if (!isAdmin && !isGlobalModerator && !isSelf && (!userSettings.showfullname || meta.config.hideFullname)) {
|
||||
userData.fullname = '';
|
||||
}
|
||||
if (isAdmin || isSelf || ((isGlobalModerator || isModerator) && !results.isTargetAdmin)) {
|
||||
userData.ips = results.ips;
|
||||
}
|
||||
|
||||
if (isAdmin || isSelf || ((isGlobalModerator || isModerator) && !results.isTargetAdmin)) {
|
||||
userData.ips = results.ips;
|
||||
}
|
||||
if (!isAdmin && !isGlobalModerator && !isModerator) {
|
||||
userData.moderationNote = undefined;
|
||||
}
|
||||
|
||||
if (!isAdmin && !isGlobalModerator && !isModerator) {
|
||||
userData.moderationNote = undefined;
|
||||
}
|
||||
userData.isBlocked = results.isBlocked;
|
||||
if (isAdmin || isSelf) {
|
||||
userData.blocksCount = parseInt(userData.blocksCount, 10) || 0;
|
||||
}
|
||||
|
||||
userData.isBlocked = results.isBlocked;
|
||||
if (isAdmin || isSelf) {
|
||||
userData.blocksCount = parseInt(userData.blocksCount, 10) || 0;
|
||||
}
|
||||
userData.yourid = callerUID;
|
||||
userData.theirid = userData.uid;
|
||||
userData.isTargetAdmin = results.isTargetAdmin;
|
||||
userData.isAdmin = isAdmin;
|
||||
userData.isGlobalModerator = isGlobalModerator;
|
||||
userData.isModerator = isModerator;
|
||||
userData.isAdminOrGlobalModerator = isAdmin || isGlobalModerator;
|
||||
userData.isAdminOrGlobalModeratorOrModerator = isAdmin || isGlobalModerator || isModerator;
|
||||
userData.isSelfOrAdminOrGlobalModerator = isSelf || isAdmin || isGlobalModerator;
|
||||
userData.canEdit = results.canEdit;
|
||||
userData.canBan = results.canBanUser;
|
||||
userData.canChangePassword = isAdmin || (isSelf && !meta.config['password:disableEdit']);
|
||||
userData.isSelf = isSelf;
|
||||
userData.isFollowing = results.isFollowing;
|
||||
userData.showHidden = isSelf || isAdmin || (isGlobalModerator && !results.isTargetAdmin);
|
||||
userData.groups = Array.isArray(results.groups) && results.groups.length ? results.groups[0] : [];
|
||||
userData.disableSignatures = meta.config.disableSignatures === 1;
|
||||
userData['reputation:disabled'] = meta.config['reputation:disabled'] === 1;
|
||||
userData['downvote:disabled'] = meta.config['downvote:disabled'] === 1;
|
||||
userData['email:confirmed'] = !!userData['email:confirmed'];
|
||||
userData.profile_links = filterLinks(results.profile_menu.links, {
|
||||
self: isSelf,
|
||||
other: !isSelf,
|
||||
moderator: isModerator,
|
||||
globalMod: isGlobalModerator,
|
||||
admin: isAdmin,
|
||||
});
|
||||
|
||||
userData.yourid = callerUID;
|
||||
userData.theirid = userData.uid;
|
||||
userData.isTargetAdmin = results.isTargetAdmin;
|
||||
userData.isAdmin = isAdmin;
|
||||
userData.isGlobalModerator = isGlobalModerator;
|
||||
userData.isModerator = isModerator;
|
||||
userData.isAdminOrGlobalModerator = isAdmin || isGlobalModerator;
|
||||
userData.isAdminOrGlobalModeratorOrModerator = isAdmin || isGlobalModerator || isModerator;
|
||||
userData.isSelfOrAdminOrGlobalModerator = isSelf || isAdmin || isGlobalModerator;
|
||||
userData.canEdit = results.canEdit;
|
||||
userData.canBan = results.canBanUser;
|
||||
userData.canChangePassword = isAdmin || (isSelf && !meta.config['password:disableEdit']);
|
||||
userData.isSelf = isSelf;
|
||||
userData.isFollowing = results.isFollowing;
|
||||
userData.showHidden = isSelf || isAdmin || (isGlobalModerator && !results.isTargetAdmin);
|
||||
userData.groups = Array.isArray(results.groups) && results.groups.length ? results.groups[0] : [];
|
||||
userData.disableSignatures = meta.config.disableSignatures === 1;
|
||||
userData['reputation:disabled'] = meta.config['reputation:disabled'] === 1;
|
||||
userData['downvote:disabled'] = meta.config['downvote:disabled'] === 1;
|
||||
userData['email:confirmed'] = !!userData['email:confirmed'];
|
||||
userData.profile_links = filterLinks(results.profile_menu.links, {
|
||||
self: isSelf,
|
||||
other: !isSelf,
|
||||
moderator: isModerator,
|
||||
globalMod: isGlobalModerator,
|
||||
admin: isAdmin,
|
||||
});
|
||||
userData.sso = results.sso.associations;
|
||||
userData.banned = userData.banned === 1;
|
||||
userData.website = validator.escape(String(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.sso = results.sso.associations;
|
||||
userData.status = user.getStatus(userData);
|
||||
userData.banned = userData.banned === 1;
|
||||
userData.website = validator.escape(String(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.fullname = validator.escape(String(userData.fullname || ''));
|
||||
userData.location = validator.escape(String(userData.location || ''));
|
||||
userData.signature = validator.escape(String(userData.signature || ''));
|
||||
userData.birthday = validator.escape(String(userData.birthday || ''));
|
||||
userData.moderationNote = validator.escape(String(userData.moderationNote || ''));
|
||||
|
||||
userData.fullname = validator.escape(String(userData.fullname || ''));
|
||||
userData.location = validator.escape(String(userData.location || ''));
|
||||
userData.signature = validator.escape(String(userData.signature || ''));
|
||||
userData.birthday = validator.escape(String(userData.birthday || ''));
|
||||
userData.moderationNote = validator.escape(String(userData.moderationNote || ''));
|
||||
if (userData['cover:url']) {
|
||||
userData['cover:url'] = userData['cover:url'].startsWith('http') ? userData['cover:url'] : (nconf.get('relative_path') + userData['cover:url']);
|
||||
} else {
|
||||
userData['cover:url'] = require('../../coverPhoto').getDefaultProfileCover(userData.uid);
|
||||
}
|
||||
|
||||
if (userData['cover:url']) {
|
||||
userData['cover:url'] = userData['cover:url'].startsWith('http') ? userData['cover:url'] : (nconf.get('relative_path') + userData['cover:url']);
|
||||
} else {
|
||||
userData['cover:url'] = require('../../coverPhoto').getDefaultProfileCover(userData.uid);
|
||||
}
|
||||
userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%'));
|
||||
userData['username:disableEdit'] = !userData.isAdmin && meta.config['username:disableEdit'];
|
||||
userData['email:disableEdit'] = !userData.isAdmin && meta.config['email:disableEdit'];
|
||||
|
||||
userData['cover:position'] = validator.escape(String(userData['cover:position'] || '50% 50%'));
|
||||
userData['username:disableEdit'] = !userData.isAdmin && meta.config['username:disableEdit'];
|
||||
userData['email:disableEdit'] = !userData.isAdmin && meta.config['email:disableEdit'];
|
||||
|
||||
next(null, userData);
|
||||
},
|
||||
], callback);
|
||||
return userData;
|
||||
};
|
||||
|
||||
function parseAboutMe(userData, callback) {
|
||||
async function getAllData(uid, callerUID) {
|
||||
return await utils.promiseParallel({
|
||||
userData: user.getUserData(uid),
|
||||
isTargetAdmin: user.isAdministrator(uid),
|
||||
userSettings: user.getSettings(uid),
|
||||
isAdmin: user.isAdministrator(callerUID),
|
||||
isGlobalModerator: user.isGlobalModerator(callerUID),
|
||||
isModerator: user.isModeratorOfAnyCategory(callerUID),
|
||||
isFollowing: user.isFollowing(callerUID, uid),
|
||||
ips: user.getIPs(uid, 4),
|
||||
profile_menu: getProfileMenu(uid, callerUID),
|
||||
groups: groups.getUserGroups([uid]),
|
||||
sso: plugins.fireHook('filter:auth.list', { uid: uid, associations: [] }),
|
||||
canEdit: privileges.users.canEdit(callerUID, uid),
|
||||
canBanUser: privileges.users.canBanUser(callerUID, uid),
|
||||
isBlocked: user.blocks.is(uid, callerUID),
|
||||
});
|
||||
}
|
||||
|
||||
async function getProfileMenu(uid, callerUID) {
|
||||
const links = [{
|
||||
id: 'info',
|
||||
route: 'info',
|
||||
name: '[[user:account_info]]',
|
||||
visibility: {
|
||||
self: false,
|
||||
other: false,
|
||||
moderator: true,
|
||||
globalMod: true,
|
||||
admin: true,
|
||||
},
|
||||
}, {
|
||||
id: 'sessions',
|
||||
route: 'sessions',
|
||||
name: '[[pages:account/sessions]]',
|
||||
visibility: {
|
||||
self: true,
|
||||
other: false,
|
||||
moderator: false,
|
||||
globalMod: false,
|
||||
admin: false,
|
||||
},
|
||||
}];
|
||||
|
||||
if (meta.config.gdpr_enabled) {
|
||||
links.push({
|
||||
id: 'consent',
|
||||
route: 'consent',
|
||||
name: '[[user:consent.title]]',
|
||||
visibility: {
|
||||
self: true,
|
||||
other: false,
|
||||
moderator: false,
|
||||
globalMod: false,
|
||||
admin: false,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
return await plugins.fireHook('filter:user.profileMenu', {
|
||||
uid: uid,
|
||||
callerUID: callerUID,
|
||||
links: links,
|
||||
});
|
||||
}
|
||||
|
||||
async function parseAboutMe(userData) {
|
||||
if (!userData.aboutme) {
|
||||
return callback();
|
||||
return;
|
||||
}
|
||||
userData.aboutme = validator.escape(String(userData.aboutme || ''));
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
plugins.fireHook('filter:parse.aboutme', userData.aboutme, next);
|
||||
},
|
||||
function (aboutme, next) {
|
||||
userData.aboutmeParsed = translator.escape(aboutme);
|
||||
next();
|
||||
},
|
||||
], callback);
|
||||
const parsed = await plugins.fireHook('filter:parse.aboutme', userData.aboutme);
|
||||
userData.aboutmeParsed = translator.escape(parsed);
|
||||
}
|
||||
|
||||
function filterLinks(links, states) {
|
||||
@@ -256,3 +213,5 @@ function filterLinks(links, states) {
|
||||
return permit;
|
||||
});
|
||||
}
|
||||
|
||||
require('../../promisify')(helpers);
|
||||
|
||||
Reference in New Issue
Block a user