mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-30 18:46:01 +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