forked from AkkomaGang/akkoma
Merge branch 'bugfix/activitypub-reserialization' into 'develop'
activitypub transmogrifier: fix reserialization edge cases See merge request pleroma/pleroma!826
This commit is contained in:
commit
ea2698beb7
2 changed files with 67 additions and 7 deletions
|
@ -649,7 +649,7 @@ def get_obj_helper(id) do
|
||||||
if object = Object.normalize(id), do: {:ok, object}, else: nil
|
if object = Object.normalize(id), do: {:ok, object}, else: nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_reply_to_uri(%{"inReplyTo" => inReplyTo} = object) do
|
def set_reply_to_uri(%{"inReplyTo" => inReplyTo} = object) when is_binary(inReplyTo) do
|
||||||
with false <- String.starts_with?(inReplyTo, "http"),
|
with false <- String.starts_with?(inReplyTo, "http"),
|
||||||
{:ok, %{data: replied_to_object}} <- get_obj_helper(inReplyTo) do
|
{:ok, %{data: replied_to_object}} <- get_obj_helper(inReplyTo) do
|
||||||
Map.put(object, "inReplyTo", replied_to_object["external_url"] || inReplyTo)
|
Map.put(object, "inReplyTo", replied_to_object["external_url"] || inReplyTo)
|
||||||
|
@ -765,12 +765,18 @@ def maybe_fix_object_url(data) do
|
||||||
def add_hashtags(object) do
|
def add_hashtags(object) do
|
||||||
tags =
|
tags =
|
||||||
(object["tag"] || [])
|
(object["tag"] || [])
|
||||||
|> Enum.map(fn tag ->
|
|> Enum.map(fn
|
||||||
|
# Expand internal representation tags into AS2 tags.
|
||||||
|
tag when is_binary(tag) ->
|
||||||
%{
|
%{
|
||||||
"href" => Pleroma.Web.Endpoint.url() <> "/tags/#{tag}",
|
"href" => Pleroma.Web.Endpoint.url() <> "/tags/#{tag}",
|
||||||
"name" => "##{tag}",
|
"name" => "##{tag}",
|
||||||
"type" => "Hashtag"
|
"type" => "Hashtag"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Do not process tags which are already AS2 tag objects.
|
||||||
|
tag when is_map(tag) ->
|
||||||
|
tag
|
||||||
end)
|
end)
|
||||||
|
|
||||||
object
|
object
|
||||||
|
|
|
@ -1128,4 +1128,58 @@ test "all objects with fake directions are rejected by the object fetcher" do
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "reserialization" do
|
||||||
|
test "successfully reserializes a message with inReplyTo == nil" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"@context" => "https://www.w3.org/ns/activitystreams",
|
||||||
|
"to" => ["https://www.w3.org/ns/activitystreams#Public"],
|
||||||
|
"cc" => [],
|
||||||
|
"type" => "Create",
|
||||||
|
"object" => %{
|
||||||
|
"to" => ["https://www.w3.org/ns/activitystreams#Public"],
|
||||||
|
"cc" => [],
|
||||||
|
"type" => "Note",
|
||||||
|
"content" => "Hi",
|
||||||
|
"inReplyTo" => nil,
|
||||||
|
"attributedTo" => user.ap_id
|
||||||
|
},
|
||||||
|
"actor" => user.ap_id
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, activity} = Transmogrifier.handle_incoming(message)
|
||||||
|
|
||||||
|
{:ok, _} = Transmogrifier.prepare_outgoing(activity.data)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "successfully reserializes a message with AS2 objects in IR" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"@context" => "https://www.w3.org/ns/activitystreams",
|
||||||
|
"to" => ["https://www.w3.org/ns/activitystreams#Public"],
|
||||||
|
"cc" => [],
|
||||||
|
"type" => "Create",
|
||||||
|
"object" => %{
|
||||||
|
"to" => ["https://www.w3.org/ns/activitystreams#Public"],
|
||||||
|
"cc" => [],
|
||||||
|
"type" => "Note",
|
||||||
|
"content" => "Hi",
|
||||||
|
"inReplyTo" => nil,
|
||||||
|
"attributedTo" => user.ap_id,
|
||||||
|
"tag" => [
|
||||||
|
%{"name" => "#2hu", "href" => "http://example.com/2hu", "type" => "Hashtag"},
|
||||||
|
%{"name" => "Bob", "href" => "http://example.com/bob", "type" => "Mention"}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"actor" => user.ap_id
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, activity} = Transmogrifier.handle_incoming(message)
|
||||||
|
|
||||||
|
{:ok, _} = Transmogrifier.prepare_outgoing(activity.data)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue