diff --git a/src/user/data.js b/src/user/data.js index f5fa8ba8a3..fc2835e2d3 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -50,13 +50,22 @@ module.exports = function (User) { return []; } - uids = uids.map(uid => (isNaN(uid) ? 0 : parseInt(uid, 10))); + uids = uids.map((uid) => { + if (isFinite(uid)) { + return parseInt(uid, 10); + } else if (activitypub.helpers.isUri(uid)) { + return uid; + } + + return 0; + }); const fieldsToRemove = []; fields = fields.slice(); ensureRequiredFields(fields, fieldsToRemove); - const uniqueUids = _.uniq(uids).filter(uid => uid > 0); + const uniqueUids = _.uniq(uids).filter(uid => isFinite(uid) && uid > 0); + const remoteIds = _.uniq(uids).filter(uid => !isFinite(uid)); const results = await plugins.hooks.fire('filter:user.whitelistFields', { uids: uids, @@ -69,7 +78,10 @@ module.exports = function (User) { fields = fields.filter(value => value !== 'password'); } - const users = await db.getObjectsFields(uniqueUids.map(uid => `user:${uid}`), fields); + const users = [ + ...await db.getObjectsFields(uniqueUids.map(uid => `user:${uid}`), fields), + ...await activitypub.mockProfile(remoteIds, 0, fields), + ]; const result = await plugins.hooks.fire('filter:user.getFields', { uids: uniqueUids, users: users, @@ -81,7 +93,7 @@ module.exports = function (User) { } }); await modifyUserData(result.users, fields, fieldsToRemove); - return uidsToUsers(uids, uniqueUids, result.users); + return uidsToUsers(uids, [...uniqueUids, ...remoteIds], result.users); }; function ensureRequiredFields(fields, fieldsToRemove) { @@ -117,7 +129,7 @@ module.exports = function (User) { const uidToUser = _.zipObject(uniqueUids, usersData); const users = uids.map((uid) => { const user = uidToUser[uid] || { ...User.guestData }; - if (!parseInt(user.uid, 10)) { + if (!parseInt(user.uid, 10) && !activitypub.helpers.isUri(user.uid)) { user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former-user]]' : '[[global:guest]]'; user.displayname = user.username; } @@ -192,6 +204,9 @@ module.exports = function (User) { return; } + if (activitypub.helpers.isUri(String(user.uid))) { + intFields.splice(intFields.indexOf('uid'), 1); + } db.parseIntFields(user, intFields, requestedFields); if (user.hasOwnProperty('username')) { @@ -203,7 +218,7 @@ module.exports = function (User) { user.email = validator.escape(user.email ? user.email.toString() : ''); } - if (!parseInt(user.uid, 10)) { + if (!parseInt(user.uid, 10) && !activitypub.helpers.isUri(user.uid)) { for (const [key, value] of Object.entries(User.guestData)) { user[key] = value; } diff --git a/src/user/follow.js b/src/user/follow.js index 149e6d1151..592bbee12b 100644 --- a/src/user/follow.js +++ b/src/user/follow.js @@ -73,7 +73,15 @@ module.exports = function (User) { if (parseInt(uid, 10) <= 0) { return []; } - const uids = await db.getSortedSetRevRange(`${type}:${uid}`, start, stop); + const uids = await db.getSortedSetRevUnion({ + sets: [ + `${type}:${uid}`, + `${type}Remote:${uid}`, + ], + start, + stop, + }); + const data = await plugins.hooks.fire(`filter:user.${type}`, { uids: uids, uid: uid,