projects
/
akkoma
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Pleroma.Web.ActivityPub.Transmogrifier: fix_url when not a string/empty
[akkoma]
/
lib
/
pleroma
/
web
/
activity_pub
/
transmogrifier.ex
diff --git
a/lib/pleroma/web/activity_pub/transmogrifier.ex
b/lib/pleroma/web/activity_pub/transmogrifier.ex
index a37c8477fdc111f55dbeb96049d809070035001d..56918342cd438b59bae703bdf35e1a1c8faf760b 100644
(file)
--- a/
lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/
lib/pleroma/web/activity_pub/transmogrifier.ex
@@
-21,18
+21,24
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
if is_binary(Enum.at(actor, 0)) do
Enum.at(actor, 0)
else
if is_binary(Enum.at(actor, 0)) do
Enum.at(actor, 0)
else
- Enum.find(actor, fn %{"type" => type} -> type
== "Person"
end)
+ Enum.find(actor, fn %{"type" => type} -> type
in ["Person", "Service", "Application"]
end)
|> Map.get("id")
end
end
|> Map.get("id")
end
end
- def get_actor(%{"actor" => actor}) when is_map(actor) do
- actor["id"]
+ def get_actor(%{"actor" => %{"id" => id}}) when is_bitstring(id) do
+ id
+ end
+
+ def get_actor(%{"actor" => nil, "attributedTo" => actor}) when not is_nil(actor) do
+ get_actor(%{"actor" => actor})
end
@doc """
Checks that an imported AP object's actor matches the domain it came from.
"""
end
@doc """
Checks that an imported AP object's actor matches the domain it came from.
"""
+ def contain_origin(id, %{"actor" => nil}), do: :error
+
def contain_origin(id, %{"actor" => actor} = params) do
id_uri = URI.parse(id)
actor_uri = URI.parse(get_actor(params))
def contain_origin(id, %{"actor" => actor} = params) do
id_uri = URI.parse(id)
actor_uri = URI.parse(get_actor(params))
@@
-51,6
+57,7
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
object
|> fix_actor
|> fix_attachments
object
|> fix_actor
|> fix_attachments
+ |> fix_url
|> fix_context
|> fix_in_reply_to
|> fix_emoji
|> fix_context
|> fix_in_reply_to
|> fix_emoji
@@
-99,15
+106,22
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object)
when not is_nil(in_reply_to) do
in_reply_to_id =
def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object)
when not is_nil(in_reply_to) do
in_reply_to_id =
- if is_bitstring(in_reply_to) do
- in_reply_to
- else
- if is_map(in_reply_to) && in_reply_to["id"] do
+ cond do
+ is_bitstring(in_reply_to) ->
+ in_reply_to
+
+ is_map(in_reply_to) && is_bitstring(in_reply_to["id"]) ->
in_reply_to["id"]
in_reply_to["id"]
- end
+
+ is_list(in_reply_to) && is_bitstring(Enum.at(in_reply_to, 0)) ->
+ Enum.at(in_reply_to, 0)
+
+ # Maybe I should output an error too?
+ true ->
+ ""
end
end
- case
ActivityPub.fetch_object_from_id
(in_reply_to_id) do
+ case
fetch_obj_helper
(in_reply_to_id) do
{:ok, replied_object} ->
with %Activity{} = activity <-
Activity.get_create_activity_by_object_ap_id(replied_object.data["id"]) do
{:ok, replied_object} ->
with %Activity{} = activity <-
Activity.get_create_activity_by_object_ap_id(replied_object.data["id"]) do
@@
-119,12
+133,12
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> Map.put("context", replied_object.data["context"] || object["conversation"])
else
e ->
|> Map.put("context", replied_object.data["context"] || object["conversation"])
else
e ->
- Logger.error("Couldn't fetch
#{object["inReplyTo"]}
#{inspect(e)}")
+ Logger.error("Couldn't fetch
\"#{inspect(in_reply_to_id)}\", error:
#{inspect(e)}")
object
end
e ->
object
end
e ->
- Logger.error("Couldn't fetch
#{object["inReplyTo"]}
#{inspect(e)}")
+ Logger.error("Couldn't fetch
\"#{inspect(in_reply_to_id)}\", error:
#{inspect(e)}")
object
end
end
object
end
end
@@
-152,18
+166,33
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
def fix_attachments(%{"attachment" => attachment} = object) when is_map(attachment) do
end
def fix_attachments(%{"attachment" => attachment} = object) when is_map(attachment) do
- attachment =
- Map.put(attachment, "url", [
- %{"type" => "Link", "mediaType" => attachment["mediaType"], "href" => attachment["url"]}
- ])
+ Map.put(object, "attachment", [attachment])
+ |> fix_attachments()
+ end
+
+ def fix_attachments(object), do: object
- Map.put(object, "attachment", attachment)
+ def fix_url(%{"url" => url} = object) when is_map(url) do
+ object
+ |> Map.put("url", url["href"])
end
end
- def fix_attachments(object) do
+ def fix_url(%{"url" => url} = object) when is_list(url) do
+ first_element = Enum.at(url, 0)
+
+ url_string =
+ cond do
+ is_bitstring(first_element) -> first_element
+ is_map(first_element) -> first_element["href"] || ""
+ true -> ""
+ end
+
object
object
+ |> Map.put("url", url_string)
end
end
+ def fix_url(object), do: object
+
def fix_emoji(%{"tag" => tags} = object) when is_list(tags) do
emoji = tags |> Enum.filter(fn data -> data["type"] == "Emoji" and data["icon"] end)
def fix_emoji(%{"tag" => tags} = object) when is_list(tags) do
emoji = tags |> Enum.filter(fn data -> data["type"] == "Emoji" and data["icon"] end)
@@
-190,22
+219,29
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> Map.put("emoji", emoji)
end
|> Map.put("emoji", emoji)
end
- def fix_emoji(object) do
- object
- end
+ def fix_emoji(object), do: object
- def fix_tag(
object
) do
+ def fix_tag(
%{"tag" => tag} = object) when is_list(tag
) do
tags =
tags =
- (object["tag"] || [])
+ tag
|> Enum.filter(fn data -> data["type"] == "Hashtag" and data["name"] end)
|> Enum.map(fn data -> String.slice(data["name"], 1..-1) end)
|> Enum.filter(fn data -> data["type"] == "Hashtag" and data["name"] end)
|> Enum.map(fn data -> String.slice(data["name"], 1..-1) end)
- combined =
(object["tag"] || [])
++ tags
+ combined =
tag
++ tags
object
|> Map.put("tag", combined)
end
object
|> Map.put("tag", combined)
end
+ def fix_tag(%{"tag" => %{"type" => "Hashtag", "name" => hashtag} = tag} = object) do
+ combined = [tag, String.slice(hashtag, 1..-1)]
+
+ object
+ |> Map.put("tag", combined)
+ end
+
+ def fix_tag(object), do: object
+
# content map usually only has one language so this will do for now.
def fix_content_map(%{"contentMap" => content_map} = object) do
content_groups = Map.to_list(content_map)
# content map usually only has one language so this will do for now.
def fix_content_map(%{"contentMap" => content_map} = object) do
content_groups = Map.to_list(content_map)
@@
-311,8
+347,10
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def handle_incoming(
%{"type" => "Accept", "object" => follow_object, "actor" => actor, "id" => id} = data
) do
def handle_incoming(
%{"type" => "Accept", "object" => follow_object, "actor" => actor, "id" => id} = data
) do
- with %User{} = followed <- User.get_or_fetch_by_ap_id(actor),
+ with actor <- get_actor(data),
+ %User{} = followed <- User.get_or_fetch_by_ap_id(actor),
{:ok, follow_activity} <- get_follow_activity(follow_object, followed),
{:ok, follow_activity} <- get_follow_activity(follow_object, followed),
+ {:ok, follow_activity} <- Utils.update_follow_state(follow_activity, "accept"),
%User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity.data["actor"]),
{:ok, activity} <-
ActivityPub.accept(%{
%User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity.data["actor"]),
{:ok, activity} <-
ActivityPub.accept(%{
@@
-335,8
+373,10
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def handle_incoming(
%{"type" => "Reject", "object" => follow_object, "actor" => actor, "id" => id} = data
) do
def handle_incoming(
%{"type" => "Reject", "object" => follow_object, "actor" => actor, "id" => id} = data
) do
- with %User{} = followed <- User.get_or_fetch_by_ap_id(actor),
+ with actor <- get_actor(data),
+ %User{} = followed <- User.get_or_fetch_by_ap_id(actor),
{:ok, follow_activity} <- get_follow_activity(follow_object, followed),
{:ok, follow_activity} <- get_follow_activity(follow_object, followed),
+ {:ok, follow_activity} <- Utils.update_follow_state(follow_activity, "reject"),
%User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity.data["actor"]),
{:ok, activity} <-
ActivityPub.accept(%{
%User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity.data["actor"]),
{:ok, activity} <-
ActivityPub.accept(%{
@@
-355,11
+395,11
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
def handle_incoming(
end
def handle_incoming(
- %{"type" => "Like", "object" => object_id, "actor" => actor, "id" => id} =
_
data
+ %{"type" => "Like", "object" => object_id, "actor" => actor, "id" => id} = data
) do
) do
- with
%User{} = actor <- User.get_or_fetch_by_ap_id(actor
),
- {:ok, object} <-
-
get_obj_helper(object_id) || ActivityPub.fetch_object_from_id
(object_id),
+ with
actor <- get_actor(data
),
+ %User{} = actor <- User.get_or_fetch_by_ap_id(actor),
+
{:ok, object} <- get_obj_helper(object_id) || fetch_obj_helper
(object_id),
{:ok, activity, _object} <- ActivityPub.like(actor, object, id, false) do
{:ok, activity}
else
{:ok, activity, _object} <- ActivityPub.like(actor, object, id, false) do
{:ok, activity}
else
@@
-368,11
+408,11
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
def handle_incoming(
end
def handle_incoming(
- %{"type" => "Announce", "object" => object_id, "actor" => actor, "id" => id} =
_
data
+ %{"type" => "Announce", "object" => object_id, "actor" => actor, "id" => id} = data
) do
) do
- with
%User{} = actor <- User.get_or_fetch_by_ap_id(actor
),
- {:ok, object} <-
-
get_obj_helper(object_id) || ActivityPub.fetch_object_from_id
(object_id),
+ with
actor <- get_actor(data
),
+ %User{} = actor <- User.get_or_fetch_by_ap_id(actor),
+
{:ok, object} <- get_obj_helper(object_id) || fetch_obj_helper
(object_id),
{:ok, activity, _object} <- ActivityPub.announce(actor, object, id, false) do
{:ok, activity}
else
{:ok, activity, _object} <- ActivityPub.announce(actor, object, id, false) do
{:ok, activity}
else
@@
-416,13
+456,13
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
# TODO: Make secure.
def handle_incoming(
# TODO: Make secure.
def handle_incoming(
- %{"type" => "Delete", "object" => object_id, "actor" => actor, "id" => _id} =
_
data
+ %{"type" => "Delete", "object" => object_id, "actor" => actor, "id" => _id} = data
) do
object_id = Utils.get_ap_id(object_id)
) do
object_id = Utils.get_ap_id(object_id)
- with
%User{} = _actor <- User.get_or_fetch_by_ap_id(actor
),
- {:ok, object} <-
-
get_obj_helper(object_id) || ActivityPub.fetch_object_from_id
(object_id),
+ with
actor <- get_actor(data
),
+ %User{} = _actor <- User.get_or_fetch_by_ap_id(actor),
+
{:ok, object} <- get_obj_helper(object_id) || fetch_obj_helper
(object_id),
{:ok, activity} <- ActivityPub.delete(object, false) do
{:ok, activity}
else
{:ok, activity} <- ActivityPub.delete(object, false) do
{:ok, activity}
else
@@
-436,11
+476,11
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
"object" => %{"type" => "Announce", "object" => object_id},
"actor" => actor,
"id" => id
"object" => %{"type" => "Announce", "object" => object_id},
"actor" => actor,
"id" => id
- } =
_
data
+ } = data
) do
) do
- with
%User{} = actor <- User.get_or_fetch_by_ap_id(actor
),
- {:ok, object} <-
-
get_obj_helper(object_id) || ActivityPub.fetch_object_from_id
(object_id),
+ with
actor <- get_actor(data
),
+ %User{} = actor <- User.get_or_fetch_by_ap_id(actor),
+
{:ok, object} <- get_obj_helper(object_id) || fetch_obj_helper
(object_id),
{:ok, activity, _} <- ActivityPub.unannounce(actor, object, id, false) do
{:ok, activity}
else
{:ok, activity, _} <- ActivityPub.unannounce(actor, object, id, false) do
{:ok, activity}
else
@@
-509,11
+549,11
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
"object" => %{"type" => "Like", "object" => object_id},
"actor" => actor,
"id" => id
"object" => %{"type" => "Like", "object" => object_id},
"actor" => actor,
"id" => id
- } =
_
data
+ } = data
) do
) do
- with
%User{} = actor <- User.get_or_fetch_by_ap_id(actor
),
- {:ok, object} <-
-
get_obj_helper(object_id) || ActivityPub.fetch_object_from_id
(object_id),
+ with
actor <- get_actor(data
),
+ %User{} = actor <- User.get_or_fetch_by_ap_id(actor),
+
{:ok, object} <- get_obj_helper(object_id) || fetch_obj_helper
(object_id),
{:ok, activity, _, _} <- ActivityPub.unlike(actor, object, id, false) do
{:ok, activity}
else
{:ok, activity, _, _} <- ActivityPub.unlike(actor, object, id, false) do
{:ok, activity}
else
@@
-523,6
+563,9
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def handle_incoming(_), do: :error
def handle_incoming(_), do: :error
+ def fetch_obj_helper(id) when is_bitstring(id), do: ActivityPub.fetch_object_from_id(id)
+ def fetch_obj_helper(obj) when is_map(obj), do: ActivityPub.fetch_object_from_id(obj["id"])
+
def get_obj_helper(id) do
if object = Object.normalize(id), do: {:ok, object}, else: nil
end
def get_obj_helper(id) do
if object = Object.normalize(id), do: {:ok, object}, else: nil
end
@@
-618,7
+661,7
@@
defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def maybe_fix_object_url(data) do
if is_binary(data["object"]) and not String.starts_with?(data["object"], "http") do
def maybe_fix_object_url(data) do
if is_binary(data["object"]) and not String.starts_with?(data["object"], "http") do
- case
ActivityPub.fetch_object_from_id
(data["object"]) do
+ case
fetch_obj_helper
(data["object"]) do
{:ok, relative_object} ->
if relative_object.data["external_url"] do
_data =
{:ok, relative_object} ->
if relative_object.data["external_url"] do
_data =