From 94dcd29e6395fa103f12ddfaacde5aeea245a249 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 7 Feb 2024 00:14:29 -0500 Subject: [PATCH] feat: handle Announce(Note) when Note is a piece of remote content --- src/activitypub/inbox.js | 50 ++++++++++++++++++++++------------------ src/activitypub/index.js | 12 ---------- 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/src/activitypub/inbox.js b/src/activitypub/inbox.js index 939f9abe7e..5627f67e83 100644 --- a/src/activitypub/inbox.js +++ b/src/activitypub/inbox.js @@ -1,6 +1,7 @@ 'use strict'; const winston = require('winston'); +const nconf = require('nconf'); const db = require('../database'); const user = require('../user'); @@ -75,35 +76,40 @@ inbox.announce = async (req) => { // ok to fail } - const { type, id } = await activitypub.helpers.resolveLocalId(object); - if (type !== 'post' || !(await posts.exists(id))) { - throw new Error('[[error:activitypub.invalid-id]]'); - } - const assertion = await activitypub.actors.assert(actor); if (!assertion) { throw new Error('[[error:activitypub.invalid-id]]'); } - const tid = await posts.getPostField(id, 'tid'); + if (String(object).startsWith(nconf.get('url'))) { + const { type, id } = await activitypub.helpers.resolveLocalId(object); + if (type !== 'post' || !(await posts.exists(id))) { + throw new Error('[[error:activitypub.invalid-id]]'); + } - // No double-announce allowed - const existing = await topics.events.find(tid, { - type: 'announce', - uid: actor, - pid: id, - }); - if (existing.length) { - await topics.events.purge(tid, existing); + const tid = await posts.getPostField(id, 'tid'); + + // No double-announce allowed + const existing = await topics.events.find(tid, { + type: 'announce', + uid: actor, + pid: id, + }); + if (existing.length) { + await topics.events.purge(tid, existing); + } + + await topics.events.log(tid, { + type: 'announce', + uid: actor, + href: `/post/${id}`, + pid: id, + timestamp, + }); + } else { + const tid = await activitypub.notes.assertTopic(0, object); + await topics.updateLastPostTime(tid, timestamp); } - - await topics.events.log(tid, { - type: 'announce', - uid: actor, - href: `/post/${id}`, - pid: id, - timestamp, - }); }; inbox.follow = async (req) => { diff --git a/src/activitypub/index.js b/src/activitypub/index.js index 15a9e4c225..0c7fb0b777 100644 --- a/src/activitypub/index.js +++ b/src/activitypub/index.js @@ -237,15 +237,3 @@ ActivityPub.send = async (type, id, targets, payload) => { } })); }; - -setTimeout(async () => { - await ActivityPub.send('uid', 1, 'https://localhost/uid/1', { - // type: 'Undo', - // object: { - type: 'Announce', - actor: `https://localhost/uid/1`, - object: 'https://localhost/post/1', - published: new Date().toISOString(), - // }, - }); -}, 2000);