activitypub: splice users into recipient lists when they receive messages at their personal inbox
closes #343
This commit is contained in:
parent
9e9b1bd5ea
commit
2f1f1a4f30
|
@ -4,6 +4,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
||||||
alias Pleroma.Web.ActivityPub.{ObjectView, UserView}
|
alias Pleroma.Web.ActivityPub.{ObjectView, UserView}
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
alias Pleroma.Web.ActivityPub.Relay
|
alias Pleroma.Web.ActivityPub.Relay
|
||||||
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
alias Pleroma.Web.Federator
|
alias Pleroma.Web.Federator
|
||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
@ -87,7 +88,15 @@ def outbox(conn, %{"nickname" => nickname}) do
|
||||||
outbox(conn, %{"nickname" => nickname, "max_id" => nil})
|
outbox(conn, %{"nickname" => nickname, "max_id" => nil})
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: Ensure that this inbox is a recipient of the message
|
def inbox(%{assigns: %{valid_signature: true}} = conn, %{"nickname" => nickname} = params) do
|
||||||
|
with %User{} = user <- User.get_cached_by_nickname(nickname),
|
||||||
|
true <- Utils.recipient_in_message(user.ap_id, params),
|
||||||
|
params <- Utils.maybe_splice_recipient(user.ap_id, params) do
|
||||||
|
Federator.enqueue(:incoming_ap_doc, params)
|
||||||
|
json(conn, "ok")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def inbox(%{assigns: %{valid_signature: true}} = conn, params) do
|
def inbox(%{assigns: %{valid_signature: true}} = conn, params) do
|
||||||
Federator.enqueue(:incoming_ap_doc, params)
|
Federator.enqueue(:incoming_ap_doc, params)
|
||||||
json(conn, "ok")
|
json(conn, "ok")
|
||||||
|
|
|
@ -19,6 +19,48 @@ def normalize_params(params) do
|
||||||
Map.put(params, "actor", get_ap_id(params["actor"]))
|
Map.put(params, "actor", get_ap_id(params["actor"]))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp recipient_in_collection(ap_id, coll) when is_binary(coll), do: ap_id == coll
|
||||||
|
defp recipient_in_collection(ap_id, coll) when is_list(coll), do: ap_id in coll
|
||||||
|
defp recipient_in_collection(_, _), do: false
|
||||||
|
|
||||||
|
def recipient_in_message(ap_id, params) do
|
||||||
|
cond do
|
||||||
|
recipient_in_collection(ap_id, params["to"]) ->
|
||||||
|
true
|
||||||
|
|
||||||
|
recipient_in_collection(ap_id, params["cc"]) ->
|
||||||
|
true
|
||||||
|
|
||||||
|
recipient_in_collection(ap_id, params["bto"]) ->
|
||||||
|
true
|
||||||
|
|
||||||
|
recipient_in_collection(ap_id, params["bcc"]) ->
|
||||||
|
true
|
||||||
|
|
||||||
|
true ->
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp extract_list(target) when is_binary(target), do: [target]
|
||||||
|
defp extract_list(lst) when is_list(lst), do: lst
|
||||||
|
defp extract_list(_), do: []
|
||||||
|
|
||||||
|
def maybe_splice_recipient(ap_id, params) do
|
||||||
|
need_splice =
|
||||||
|
!recipient_in_collection(ap_id, params["to"]) &&
|
||||||
|
!recipient_in_collection(ap_id, params["cc"])
|
||||||
|
|
||||||
|
cc_list = extract_list(params["cc"])
|
||||||
|
|
||||||
|
if need_splice do
|
||||||
|
params
|
||||||
|
|> Map.put(params, "cc", [ap_id | cc_list])
|
||||||
|
else
|
||||||
|
params
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def make_json_ld_header do
|
def make_json_ld_header do
|
||||||
%{
|
%{
|
||||||
"@context" => [
|
"@context" => [
|
||||||
|
|
Loading…
Reference in a new issue