move to 2.5.5
[anni] / lib / pleroma / web / activity_pub / object_validators / common_fixes.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do
6   alias Pleroma.EctoType.ActivityPub.ObjectValidators
7   alias Pleroma.Object
8   alias Pleroma.Object.Containment
9   alias Pleroma.User
10   alias Pleroma.Web.ActivityPub.Transmogrifier
11   alias Pleroma.Web.ActivityPub.Utils
12
13   def cast_and_filter_recipients(message, field, follower_collection, field_fallback \\ []) do
14     {:ok, data} = ObjectValidators.Recipients.cast(message[field] || field_fallback)
15
16     data =
17       Enum.reject(data, fn x ->
18         String.ends_with?(x, "/followers") and x != follower_collection
19       end)
20
21     Map.put(message, field, data)
22   end
23
24   def fix_object_defaults(data) do
25     context =
26       Utils.maybe_create_context(
27         data["context"] || data["conversation"] || data["inReplyTo"] || data["id"]
28       )
29
30     %User{follower_address: follower_collection} = User.get_cached_by_ap_id(data["attributedTo"])
31
32     data
33     |> Map.put("context", context)
34     |> cast_and_filter_recipients("to", follower_collection)
35     |> cast_and_filter_recipients("cc", follower_collection)
36     |> cast_and_filter_recipients("bto", follower_collection)
37     |> cast_and_filter_recipients("bcc", follower_collection)
38     |> Transmogrifier.fix_implicit_addressing(follower_collection)
39   end
40
41   def fix_activity_addressing(activity) do
42     %User{follower_address: follower_collection} = User.get_cached_by_ap_id(activity["actor"])
43
44     activity
45     |> cast_and_filter_recipients("to", follower_collection)
46     |> cast_and_filter_recipients("cc", follower_collection)
47     |> cast_and_filter_recipients("bto", follower_collection)
48     |> cast_and_filter_recipients("bcc", follower_collection)
49     |> Transmogrifier.fix_implicit_addressing(follower_collection)
50   end
51
52   def fix_actor(data) do
53     actor =
54       data
55       |> Map.put_new("actor", data["attributedTo"])
56       |> Containment.get_actor()
57
58     data
59     |> Map.put("actor", actor)
60     |> Map.put("attributedTo", actor)
61   end
62
63   def fix_activity_context(data, %Object{data: %{"context" => object_context}}) do
64     data
65     |> Map.put("context", object_context)
66   end
67
68   def fix_object_action_recipients(%{"actor" => actor} = data, %Object{data: %{"actor" => actor}}) do
69     to = ((data["to"] || []) -- [actor]) |> Enum.uniq()
70
71     Map.put(data, "to", to)
72   end
73
74   def fix_object_action_recipients(data, %Object{data: %{"actor" => actor}}) do
75     to = ((data["to"] || []) ++ [actor]) |> Enum.uniq()
76
77     Map.put(data, "to", to)
78   end
79 end