fix: if an unknown post is navigated to by a logged-in user, automatically assert the post and add it to their inbox

This commit is contained in:
Julian Lam
2024-05-06 15:54:45 -04:00
parent 807c3eac12
commit 4e7b12b925
2 changed files with 16 additions and 3 deletions

View File

@@ -76,7 +76,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => {
mainPid = utils.isNumber(mainPid) ? parseInt(mainPid, 10) : mainPid;
// Relation & privilege check for local categories
const hasRelation = options.skipChecks || options.cid || hasTid || await assertRelation(chain[0]);
const hasRelation = uid || options.skipChecks || options.cid || hasTid || await assertRelation(chain[0]);
const privilege = `topics:${tid ? 'reply' : 'create'}`;
const allowed = await privileges.categories.can(privilege, cid, activitypub._constants.uid);
if (!hasRelation || !allowed) {
@@ -168,7 +168,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => {
}
await Promise.all([
Notes.syncUserInboxes(tid),
Notes.syncUserInboxes(tid, uid),
unlock(id),
]);
@@ -282,7 +282,7 @@ Notes.getParentChain = async (uid, input) => {
return chain;
};
Notes.syncUserInboxes = async function (tid) {
Notes.syncUserInboxes = async function (tid, uid) {
const [pids, { cid, mainPid }] = await Promise.all([
db.getSortedSetMembers(`tid:${tid}:posts`),
topics.getTopicFields(tid, ['tid', 'cid', 'mainPid']),
@@ -291,6 +291,10 @@ Notes.syncUserInboxes = async function (tid) {
const recipients = await db.getSetsMembers(pids.map(id => `post:${id}:recipients`));
const uids = recipients.reduce((set, uids) => new Set([...set, ...uids.map(u => parseInt(u, 10))]), new Set());
if (uid) {
uids.add(parseInt(uid, 10));
}
const keys = Array.from(uids).map(uid => `uid:${uid}:inbox`);
const score = await db.sortedSetScore(`cid:${cid}:tids`, tid);

View File

@@ -6,6 +6,7 @@ const querystring = require('querystring');
const meta = require('../meta');
const posts = require('../posts');
const privileges = require('../privileges');
const activitypub = require('../activitypub');
const utils = require('../utils');
const helpers = require('./helpers');
@@ -18,6 +19,14 @@ postsController.redirectToPost = async function (req, res, next) {
return next();
}
// Kickstart note assertion if applicable
if (!utils.isNumber(pid) && req.uid) {
const exists = await posts.exists(pid);
if (!exists) {
await activitypub.notes.assert(req.uid, pid);
}
}
const [canRead, path] = await Promise.all([
privileges.posts.can('topics:read', pid, req.uid),
posts.generatePostPath(pid, req.uid),