logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://anongit.hacktivis.me/git/pleroma.git/
commit: 6ed9d681b902f6d5be3c2e37f5bc2704501bb5f5
parent a893c69d203498b43b4eaeb101447e08901c32c4
Author: Mint <mint@plagu.ee>
Date:   Fri,  7 Nov 2025 14:53:16 +0300

Transmogrifier: convert "as:Public" to full w3 URL

Diffstat:

Achangelog.d/transmogrifier-aspublic.fix1+
Mlib/pleroma/web/activity_pub/object_validators/common_fixes.ex6++++++
Mlib/pleroma/web/activity_pub/transmogrifier.ex20++++++++++++++++++++
Atest/fixtures/bovine-bogus-public-note.json34++++++++++++++++++++++++++++++++++
Mtest/pleroma/web/activity_pub/transmogrifier_test.exs23+++++++++++++++++++++++
5 files changed, 84 insertions(+), 0 deletions(-)

diff --git a/changelog.d/transmogrifier-aspublic.fix b/changelog.d/transmogrifier-aspublic.fix @@ -0,0 +1 @@ +Transmogrifier: convert "as:Public" to full w3 URL diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex @@ -20,6 +20,12 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do require Pleroma.Constants def cast_and_filter_recipients(message, field, follower_collection, field_fallback \\ []) do + # calling this here since we need to fix as:Public address before ObjectID cast throws it out + message = + message + |> Transmogrifier.fix_addressing_list(field) + |> Transmogrifier.fix_addressing_public(field) + {:ok, data} = ObjectValidators.Recipients.cast(message[field] || field_fallback) data = diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -104,6 +104,22 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do end end + @doc """ + Bovine compatibility + https://codeberg.org/bovine/bovine/issues/53 + """ + def fix_addressing_public(map, field) do + Map.put( + map, + field, + Enum.map(Map.get(map, field), fn + "Public" -> Pleroma.Constants.as_public() + "as:Public" -> Pleroma.Constants.as_public() + x -> x + end) + ) + end + # if directMessage flag is set to true, leave the addressing alone def fix_explicit_addressing(%{"directMessage" => true} = object, _follower_collection), do: object @@ -161,6 +177,10 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do |> fix_addressing_list("cc") |> fix_addressing_list("bto") |> fix_addressing_list("bcc") + |> fix_addressing_public("to") + |> fix_addressing_public("cc") + |> fix_addressing_public("bto") + |> fix_addressing_public("bcc") |> fix_explicit_addressing(follower_collection) |> fix_implicit_addressing(follower_collection) end diff --git a/test/fixtures/bovine-bogus-public-note.json b/test/fixtures/bovine-bogus-public-note.json @@ -0,0 +1,34 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + "https://www.w3.org/ns/did/v1", + "https://w3id.org/security/multikey/v1", + { + "Hashtag": "as:Hashtag" + } + ], + "attributedTo": "https://mymath.rocks/endpoints/SYn3cl_N4HAPfPHgo2x37XunLEmhV9LnxCggcYwyec0", + "cc": [ + "https://mymath.rocks/endpoints/30zoCe7haKBEFolH4rbAmKj-t9_bG0c2X2kMQkJk5qY", + "https://mastodon.social/users/nikclayton" + ], + "content": "<blockquote class=\"h-quote\">\n<p>I note that mymath.rocks does not provide this information.</p>\n</blockquote>\n<p>I&#39;m a big believer in &quot;Do as I say, not as I <strong>did</strong>&quot;.</p>\n<p>I could give a long list of technical reasons, which boil down to: nodeinfo is pretty nonsensical with the way I write stuff.</p>\n<p>I think the above statement also addresses a main failure of the Fediverse. People, e.g. me, would love to fix stuff. Unfortunately, we lack the focus to address a lot of issues, e.g. nodeinfo sucks. So stuff gets done in a broken way.</p>\n<p>I think the main challenge the Fediverse has faced, and failed at, is avoiding the above situation. To continue the example, there is no way for somebody to say: Let&#39;s fix nodeinfo and people will follow their ideas.</p>\n", + "id": "https://mymath.rocks/objects/2b89e564-30cf-4eeb-97ca-7e638a154026", + "inReplyTo": "https://mastodon.social/users/nikclayton/statuses/115496665258618127", + "likes": "https://mymath.rocks/objects/2b89e564-30cf-4eeb-97ca-7e638a154026/likes", + "published": "2025-11-06T08:21:17.790Z", + "replies": "https://mymath.rocks/objects/2b89e564-30cf-4eeb-97ca-7e638a154026/replies", + "shares": "https://mymath.rocks/objects/2b89e564-30cf-4eeb-97ca-7e638a154026/shares", + "source": { + "content": "> I note that mymath.rocks does not provide this information.\n\nI'm a big believer in \"Do as I say, not as I __did__\".\n\nI could give a long list of technical reasons, which boil down to: nodeinfo is pretty nonsensical with the way I write stuff.\n\nI think the above statement also addresses a main failure of the Fediverse. People, e.g. me, would love to fix stuff. Unfortunately, we lack the focus to address a lot of issues, e.g. nodeinfo sucks. So stuff gets done in a broken way.\n\nI think the main challenge the Fediverse has faced, and failed at, is avoiding the above situation. To continue the example, there is no way for somebody to say: Let's fix nodeinfo and people will follow their ideas.", + "mediaType": "text/markdown" + }, + "tag": { + "href": "https://mastodon.social/users/nikclayton", + "name": "https://mastodon.social/users/nikclayton", + "type": "Mention" + }, + "to": "as:Public", + "type": "Note" +} diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs @@ -123,6 +123,29 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do assert activity.data["context"] == object.data["context"] end + test "it fixes the public scope addressing" do + insert(:user, + ap_id: "https://mymath.rocks/endpoints/SYn3cl_N4HAPfPHgo2x37XunLEmhV9LnxCggcYwyec0" + ) + + object = + "test/fixtures/bovine-bogus-public-note.json" + |> File.read!() + |> Jason.decode!() + + message = %{ + "@context" => "https://www.w3.org/ns/activitystreams", + "type" => "Create", + "actor" => "https://mymath.rocks/endpoints/SYn3cl_N4HAPfPHgo2x37XunLEmhV9LnxCggcYwyec0", + "object" => object + } + + assert {:ok, activity} = Transmogrifier.handle_incoming(message) + + object = Object.normalize(activity, fetch: false) + assert "https://www.w3.org/ns/activitystreams#Public" in object.data["to"] + end + test "it keeps link tags" do insert(:user, ap_id: "https://example.org/users/alice")