Pipeline Ingestion: Note
[akkoma] / lib / pleroma / web / activity_pub / object_validators / common_fixes.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2021 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.Containment
8 alias Pleroma.User
9 alias Pleroma.Web.ActivityPub.Transmogrifier
10 alias Pleroma.Web.ActivityPub.Utils
11
12 def fix_object_defaults(data) do
13 %{data: %{"id" => context}, id: context_id} =
14 Utils.create_context(data["context"] || data["conversation"])
15
16 %User{follower_address: follower_collection} = User.get_cached_by_ap_id(data["attributedTo"])
17 {:ok, to} = ObjectValidators.Recipients.cast(data["to"] || [])
18 {:ok, cc} = ObjectValidators.Recipients.cast(data["cc"] || [])
19
20 data
21 |> Map.put("context", context)
22 |> Map.put("context_id", context_id)
23 |> Map.put("to", to)
24 |> Map.put("cc", cc)
25 |> Transmogrifier.fix_explicit_addressing(follower_collection)
26 |> Transmogrifier.fix_implicit_addressing(follower_collection)
27 end
28
29 defp fix_activity_recipients(activity, field, object) do
30 {:ok, data} = ObjectValidators.Recipients.cast(activity[field] || object[field])
31
32 Map.put(activity, field, data)
33 end
34
35 def fix_activity_defaults(activity, meta) do
36 object = meta[:object_data] || %{}
37
38 activity
39 |> fix_activity_recipients("to", object)
40 |> fix_activity_recipients("cc", object)
41 |> fix_activity_recipients("bto", object)
42 |> fix_activity_recipients("bcc", object)
43 end
44
45 def fix_actor(data) do
46 actor =
47 data
48 |> Map.put_new("actor", data["attributedTo"])
49 |> Containment.get_actor()
50
51 data
52 |> Map.put("actor", actor)
53 |> Map.put("attributedTo", actor)
54 end
55 end