Ignore duplicate create activities.
[akkoma] / lib / pleroma / web / activity_pub / activity_pub_controller.ex
1 defmodule Pleroma.Web.ActivityPub.ActivityPubController do
2 use Pleroma.Web, :controller
3 alias Pleroma.{User, Repo, Object, Activity}
4 alias Pleroma.Web.ActivityPub.{ObjectView, UserView, Transmogrifier}
5 alias Pleroma.Web.ActivityPub.ActivityPub
6
7 require Logger
8
9 action_fallback :errors
10
11 def user(conn, %{"nickname" => nickname}) do
12 with %User{} = user <- User.get_cached_by_nickname(nickname),
13 {:ok, user} <- Pleroma.Web.WebFinger.ensure_keys_present(user) do
14 json(conn, UserView.render("user.json", %{user: user}))
15 end
16 end
17
18 def object(conn, %{"uuid" => uuid}) do
19 with ap_id <- o_status_url(conn, :object, uuid),
20 %Object{} = object <- Object.get_cached_by_ap_id(ap_id) do
21 json(conn, ObjectView.render("object.json", %{object: object}))
22 end
23 end
24
25 # TODO: Ensure that this inbox is a recipient of the message
26 def inbox(%{assigns: %{valid_signature: true}} = conn, params) do
27 # File.write("/tmp/incoming.json", Poison.encode!(params))
28 # Logger.info(Poison.encode!(params, [pretty: 2]))
29 with {:ok, _user} <- ap_enabled_actor(params["actor"]),
30 nil <- Activity.get_by_ap_id(params["id"]),
31 {:ok, activity} <- Transmogrifier.handle_incoming(params) do
32 json(conn, "ok")
33 else
34 %Activity{} ->
35 Logger.info("Already had #{params["id"]}")
36 json(conn, "ok")
37 e ->
38 # Just drop those for now
39 Logger.info("Unhandled activity")
40 Logger.info(Poison.encode!(params, [pretty: 2]))
41 json(conn, "ok")
42 end
43 end
44
45 def inbox(conn, params) do
46 Logger.info("Signature error.")
47 Logger.info(inspect(conn.req_headers))
48 json(conn, "ok")
49 end
50
51 def ap_enabled_actor(id) do
52 user = User.get_by_ap_id(id)
53 if User.ap_enabled?(user) do
54 {:ok, user}
55 else
56 ActivityPub.make_user_from_ap_id(id)
57 end
58 end
59
60 def errors(conn, _e) do
61 conn
62 |> put_status(500)
63 |> json("error")
64 end
65 end