fix: #9177, handled multiple deleted users properly

v1.18.x
Barış Soner Uşaklı 4 years ago
parent 5cae95eb9f
commit eaf62d39fd

@ -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')) {

Loading…
Cancel
Save