mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-09 15:35:47 +01:00
fix: #9177, handled multiple deleted users properly
This commit is contained in:
@@ -37,12 +37,14 @@ module.exports = function (User) {
|
||||
User.guestData = {
|
||||
uid: 0,
|
||||
username: '[[global:guest]]',
|
||||
displayname: '[[global:guest]]',
|
||||
userslug: '',
|
||||
fullname: '[[global:guest]]',
|
||||
email: '',
|
||||
'icon:text': '?',
|
||||
'icon:bgColor': '#aaa',
|
||||
groupTitle: '',
|
||||
groupTitleArray: [],
|
||||
status: 'offline',
|
||||
reputation: 0,
|
||||
'email:confirmed': 0,
|
||||
@@ -68,14 +70,19 @@ module.exports = function (User) {
|
||||
fields = fields.filter(value => value !== 'password');
|
||||
}
|
||||
|
||||
let users = await db.getObjectsFields(uniqueUids.map(uid => 'user:' + uid), fields);
|
||||
const users = await db.getObjectsFields(uniqueUids.map(uid => 'user:' + uid), fields);
|
||||
const result = await plugins.hooks.fire('filter:user.getFields', {
|
||||
uids: uniqueUids,
|
||||
users: users,
|
||||
fields: fields,
|
||||
});
|
||||
users = uidsToUsers(uids, uniqueUids, result.users);
|
||||
return await modifyUserData(users, fields, fieldsToRemove);
|
||||
result.users.forEach((user, index) => {
|
||||
if (uniqueUids[index] > 0 && !user.uid) {
|
||||
user.oldUid = uniqueUids[index];
|
||||
}
|
||||
});
|
||||
await modifyUserData(result.users, fields, fieldsToRemove);
|
||||
return uidsToUsers(uids, uniqueUids, result.users);
|
||||
};
|
||||
|
||||
function ensureRequiredFields(fields, fieldsToRemove) {
|
||||
@@ -110,12 +117,13 @@ module.exports = function (User) {
|
||||
function uidsToUsers(uids, uniqueUids, usersData) {
|
||||
const uidToUser = _.zipObject(uniqueUids, usersData);
|
||||
const users = uids.map(function (uid) {
|
||||
const returnPayload = uidToUser[uid] || { ...User.guestData };
|
||||
if (uid > 0 && !returnPayload.uid) {
|
||||
returnPayload.oldUid = parseInt(uid, 10);
|
||||
const user = uidToUser[uid] || { ...User.guestData };
|
||||
if (!parseInt(user.uid, 10)) {
|
||||
user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former_user]]' : '[[global:guest]]';
|
||||
user.displayname = user.username;
|
||||
}
|
||||
|
||||
return returnPayload;
|
||||
return user;
|
||||
});
|
||||
return users;
|
||||
}
|
||||
@@ -142,19 +150,14 @@ module.exports = function (User) {
|
||||
async function modifyUserData(users, requestedFields, fieldsToRemove) {
|
||||
let uidToSettings = {};
|
||||
if (meta.config.showFullnameAsDisplayName) {
|
||||
const uids = _.uniq(users.map(user => user.uid));
|
||||
const uids = users.map(user => user.uid);
|
||||
uidToSettings = _.zipObject(uids, await db.getObjectsFields(
|
||||
uids.map(uid => 'user:' + uid + ':settings'),
|
||||
['showfullname']
|
||||
));
|
||||
}
|
||||
const uidToUser = {};
|
||||
users.forEach(function (user) {
|
||||
uidToUser[user.uid] = user;
|
||||
});
|
||||
|
||||
await Promise.all(Object.keys(uidToUser).map(async function (uid) {
|
||||
const user = uidToUser[uid];
|
||||
await Promise.all(users.map(async function (user) {
|
||||
if (!user) {
|
||||
return;
|
||||
}
|
||||
@@ -171,14 +174,10 @@ module.exports = function (User) {
|
||||
}
|
||||
|
||||
if (!parseInt(user.uid, 10)) {
|
||||
user.uid = 0;
|
||||
user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former_user]]' : '[[global:guest]]';
|
||||
user.displayname = user.username;
|
||||
user.userslug = '';
|
||||
for (const [key, value] of Object.entries(User.guestData)) {
|
||||
user[key] = value;
|
||||
}
|
||||
user.picture = User.getDefaultAvatar();
|
||||
user['icon:text'] = '?';
|
||||
user['icon:bgColor'] = '#aaa';
|
||||
user.groupTitle = '';
|
||||
}
|
||||
|
||||
if (user.hasOwnProperty('groupTitle')) {
|
||||
|
||||
Reference in New Issue
Block a user