<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Catodon federating deletes of objects it doesn&#x27;t own]]></title><description><![CDATA[<p dir="auto">Hey <a href="https://activitypub.space/user/panos%40catodon.rocks" target="_blank" rel="noopener noreferrer nofollow ugc">@panos@catodon.rocks</a>, now that I'm tracking errors encountered, I've got a bit more visibility into things that normally would've just been caught and ignored.</p>
<p dir="auto">Today I received a <code>Delete(Object)</code> from Catodon associated with a user from <code>catodon.rocks</code>.</p>
<p dir="auto">Two things:</p>
<ol>
<li>
<p dir="auto">Its <code>object</code> referenced an item outside of <code>catodon.rocks</code>, and so it failed NodeBB's actor-object match check. Normally people can't delete other peoples' posts, so I think this might be a mistake?</p>
</li>
<li>
<p dir="auto">The activity's <code>audience</code> matches the activity's <code>attributedTo</code>. While you're certainly allowed to put anything you want in there, threadiverse software uses it to point to a group actor. Wondering if this was intentional.</p>
</li>
</ol>
<p dir="auto">Thanks!</p>
]]></description><link>https://citiverse.it/topic/4144f4a9-1739-44d6-ad13-4454e44943a3/catodon-federating-deletes-of-objects-it-doesn-t-own</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 14:40:20 GMT</lastBuildDate><atom:link href="https://citiverse.it/topic/4144f4a9-1739-44d6-ad13-4454e44943a3.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Apr 2026 17:16:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Fri, 24 Apr 2026 15:06:01 GMT]]></title><description><![CDATA[<p dir="auto"><a href="https://activitypub.space/user/panos%40catodon.rocks" target="_blank" rel="noopener noreferrer nofollow ugc">@panos@catodon.rocks</a> Thanks.</p>
<ol>
<li>Fixed</li>
<li>Defer, not sure how to handle at the moment.</li>
<li>N/A, when an <code>Announce(Create)</code> arrives, NodeBB makes a call out to retrieve the object again, so if a Create arrives after a Delete, it won't be added.
<ul>
<li>We call the low level delete because it's an internal deletion. We don't need to call the api delete because that federates activities out. I don't expect your LLM to know this.</li>
</ul>
</li>
<li>Fixed.</li>
<li>Fixed.</li>
<li>Fixed.</li>
</ol>
]]></description><link>https://citiverse.it/post/https://activitypub.space/post/1794</link><guid isPermaLink="true">https://citiverse.it/post/https://activitypub.space/post/1794</guid><dc:creator><![CDATA[julian@activitypub.space]]></dc:creator><pubDate>Fri, 24 Apr 2026 15:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Fri, 24 Apr 2026 09:19:30 GMT]]></title><description><![CDATA[<p><a href="/user/julian%40activitypub.space">@julian@activitypub.space</a><span> could you please take a look at these issues on NodeBB's side, too? Perhaps some are a misjudgment on my part, but I think that at least some are legit:<br /><br />1. Outgoing Dislike is sent incorrectly<br /><br />In src/activitypub/out.js, Out.dislike.note is missing await:<br /><br />const payload = activitypub.mocks.activities.dislike(pid, uid);<br /><br />mocks.activities.dislike() is async, so NodeBB sends a Promise instead of a valid Dislike activity. That means Catodon does not receive NodeBB downvotes correctly.<br /><br />Suggested fix:<br /><br />const payload = await activitypub.mocks.activities.dislike(pid, uid);<br /><br />(this would mirror NodeBB's behaviour for outgoing Likes)<br /><br />2. Primary links on federated forum posts are not displayed in NodeBB<br /><br />Catodon sends forum root posts as Page objects with:<br /><br />-url set to the primary link<br />-a link attachment with mediaType: "text/html"<br /><br />NodeBB appears to preserve the URL into postData.url, but the post UI does not render it in the post body, it only shows up in the post menu as “View original post”.<br />Also, src/activitypub/notes.js only appends image attachments inline, so Link attachments are ignored visually.<br /><br />Suggestion: NodeBB should render AP primary links for Page / forum-root posts, either from post.url or from the Link attachment.<br /><br />3. Announce(Delete) handling can lose fresh deletes<br /><br />Two issues with the Announce(Delete) handling:<br /><br />In src/activitypub/inbox.js, the Announce(Delete) branch ignores unknown objects:<br /><br />if (!exists) {<br />  ... Doing nothing.<br />  break;<br />}<br /><br />If Delete arrives before Create, NodeBB ignores the Delete, then later creates the post. That leaves a deleted remote post visible.<br /><br />Suggestion: NodeBB should remember unknown deletes, tombstone pending IDs, or otherwise suppress/retry later Creates that arrive after a Delete.<br /><br />Also, the Announce(Delete) path calls low-level posts.delete(id, uid) instead of the normal API delete path. For a topic OP, especially a single-post topic, that does not behave like NodeBB’s normal delete flow and may not delete the topic or emit the usual delete events.<br /><br />Suggestion: use the API-level delete path where appropriate, similar to direct Delete handling.<br /><br />4. Undo(Dislike) is not handled inbound<br /><br />src/activitypub/inbox.js handles Undo(Like), but there is no Dislike case in inbox.undo, which results in remote Undo(Dislike) activities being silently ignored, so remote downvotes can become permanent from NodeBB’s perspective.<br /><br />Suggestion: add an Undo(Dislike) case mirroring Undo(Like), and unvote the post accordingly.<br /><br />5. NodeBB does not federate downvote removal correctly<br /><br />src/activitypub/out.js has Out.undo.like but no Out.undo.dislike, and src/api/helpers.js always calls activitypub.out.undo.like(...) for any unvote, even when the removed vote was a downvote.<br /><br />Suggestion:<br />-add Out.undo.dislike<br />-make the unvote path choose Undo(Like) or Undo(Dislike) based on the previous vote state<br /><br />6. Minor log typo<br /><br />In src/activitypub/inbox.js, inside inbox.dislike, the log message says [activitypub/inbox.like] - you probably want it to say [activitypub/inbox.dislike]<br /><br />These issues (if confirmed on your side) affect downvotes, downvote removal, primary-link display, and reliable deletion of federated forum/group posts.</span></p>]]></description><link>https://citiverse.it/post/https://catodon.rocks/notes/alg9jtm97de9003n</link><guid isPermaLink="true">https://citiverse.it/post/https://catodon.rocks/notes/alg9jtm97de9003n</guid><dc:creator><![CDATA[panos@catodon.rocks]]></dc:creator><pubDate>Fri, 24 Apr 2026 09:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Fri, 24 Apr 2026 01:05:07 GMT]]></title><description><![CDATA[<p><a href="/user/julian%40activitypub.space">@julian@activitypub.space</a> Thanks! This <i>should</i> work but it still doesn't for me, but it could very well be something on our end, I'd suggest testing with Lemmy or Piefed. It's 4am here so I will continue tomorrow (and update you if needed). BTW the thing I've been stuck on for days now is how to make forum posts with no content, just title and primary link, display the link in NodeBB... it worked from the first attempt with Lemmy and Piefed, but I haven't managed to make it work with NodeBB. The only time I succeeded was when I added the primary link's url in the content, but that was not a proper solution, and it made the url appear on lemmy and piefed too, which wasn't needed. And I'm pretty sure I've seen lemmy posts with just a primary link be displayed correctly on nodebb, and I can't figure out what I'm doing wrong...</p>]]></description><link>https://citiverse.it/post/https://catodon.rocks/notes/alfrw1twkwq500p3</link><guid isPermaLink="true">https://citiverse.it/post/https://catodon.rocks/notes/alfrw1twkwq500p3</guid><dc:creator><![CDATA[panos@catodon.rocks]]></dc:creator><pubDate>Fri, 24 Apr 2026 01:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Thu, 23 Apr 2026 18:59:37 GMT]]></title><description><![CDATA[<p dir="auto"><a href="https://activitypub.space/user/panos%40catodon.rocks" target="_blank" rel="noopener noreferrer nofollow ugc">@panos@catodon.rocks</a> handling of <code>Announce(Delete)</code> is merged (but untested across real 1b12 generators)... do you mind doing a quick test?</p>
]]></description><link>https://citiverse.it/post/https://activitypub.space/post/1791</link><guid isPermaLink="true">https://citiverse.it/post/https://activitypub.space/post/1791</guid><dc:creator><![CDATA[julian@activitypub.space]]></dc:creator><pubDate>Thu, 23 Apr 2026 18:59:37 GMT</pubDate></item><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Thu, 23 Apr 2026 02:10:20 GMT]]></title><description><![CDATA[<p dir="auto"><a href="https://activitypub.space/user/panos%40catodon.rocks" target="_blank" rel="noopener noreferrer nofollow ugc">@panos@catodon.rocks</a> sure thing. I thought we did handle it but it's been awhile. I'll take a look!</p>
]]></description><link>https://citiverse.it/post/https://activitypub.space/post/1784</link><guid isPermaLink="true">https://citiverse.it/post/https://activitypub.space/post/1784</guid><dc:creator><![CDATA[julian@activitypub.space]]></dc:creator><pubDate>Thu, 23 Apr 2026 02:10:20 GMT</pubDate></item><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Wed, 22 Apr 2026 18:30:54 GMT]]></title><description><![CDATA[<p><a href="/user/julian%40activitypub.space">@julian@activitypub.space</a><span> You were right, it was a bug in catodon’s forum delete path: for forum posts, it could emit a plain top-level Delete fallback even when the deleted post was remote-authored, which made it look like our forum actor was deleting an object it didn’t own. I changed it so that:<br /><br />1. The direct top-level Delete fallback is only sent when the author is local and we can legitimately sign it as that author.<br />2. For remote-authored forum posts, we no longer emit that invalid fallback.<br />3. Forum-scoped activities now use the forum actor as </span><code>audience</code>, rather than conflating <code>audience</code><span> with the author/deleter.<br /><br />So this should resolve the two issues you pointed out on the Catodon side - if you see it again, or anything else that looks off, please lmk!<br /><br />One request from our side:  Would you consider handling Announce(Delete)? In forum/communities federation, that’s how a group passes along deletion of a post that came from another server, without making it look like the group owns that post. In practice, the remaining issue is with remote-authored posts in catodon forums: when the original author is on another server and deletes the post, catodon can remove it locally and forward that deletion, and it is accepted by Lemmy and Piefed, but NodeBB servers currently keep showing the post because they ignore </span><code>Announce(Delete)</code>.</p>]]></description><link>https://citiverse.it/post/https://catodon.rocks/notes/aldyd8ek9pho000k</link><guid isPermaLink="true">https://citiverse.it/post/https://catodon.rocks/notes/aldyd8ek9pho000k</guid><dc:creator><![CDATA[panos@catodon.rocks]]></dc:creator><pubDate>Wed, 22 Apr 2026 18:30:54 GMT</pubDate></item><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Wed, 22 Apr 2026 17:26:20 GMT]]></title><description><![CDATA[<p dir="auto"><a href="https://activitypub.space/user/panos%40catodon.rocks" target="_blank" rel="noopener noreferrer nofollow ugc">@panos@catodon.rocks</a> I was wondering if maybe there was some group-actor shenanigans going on <img src="https://citiverse.it/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=ca0be3f3a3d" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title=":)" alt="🙂" /></p>
]]></description><link>https://citiverse.it/post/https://activitypub.space/post/1783</link><guid isPermaLink="true">https://citiverse.it/post/https://activitypub.space/post/1783</guid><dc:creator><![CDATA[julian@activitypub.space]]></dc:creator><pubDate>Wed, 22 Apr 2026 17:26:20 GMT</pubDate></item><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Wed, 22 Apr 2026 17:25:51 GMT]]></title><description><![CDATA[<p><a href="/user/julian%40activitypub.space">@julian@activitypub.space</a> fwiw, I'm running the develop version on catodon.rocks, not stable, I'm still working on group actors implementation, and it's obviously not ready yet.</p>]]></description><link>https://citiverse.it/post/https://catodon.rocks/notes/aldw1ke79xyb074u</link><guid isPermaLink="true">https://citiverse.it/post/https://catodon.rocks/notes/aldw1ke79xyb074u</guid><dc:creator><![CDATA[panos@catodon.rocks]]></dc:creator><pubDate>Wed, 22 Apr 2026 17:25:51 GMT</pubDate></item><item><title><![CDATA[Reply to Catodon federating deletes of objects it doesn&#x27;t own on Wed, 22 Apr 2026 17:19:01 GMT]]></title><description><![CDATA[<p><a href="/user/julian%40activitypub.space">@julian@activitypub.space</a> whoa, really sorry about that, looking into it. Thanks for reporting.</p>]]></description><link>https://citiverse.it/post/https://catodon.rocks/notes/aldvsrzt9xyb071z</link><guid isPermaLink="true">https://citiverse.it/post/https://catodon.rocks/notes/aldvsrzt9xyb071z</guid><dc:creator><![CDATA[panos@catodon.rocks]]></dc:creator><pubDate>Wed, 22 Apr 2026 17:19:01 GMT</pubDate></item></channel></rss>