forked from AkkomaGang/akkoma
Merge branch 'bugfix/user-inbox-bcc' into 'develop'
activitypub: splice users into recipient lists when they receive messages at their personal inbox Closes #343 See merge request pleroma/pleroma!390
This commit is contained in:
commit
63556150e1
4 changed files with 74 additions and 3 deletions
|
@ -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("cc", [ap_id | cc_list])
|
||||||
|
else
|
||||||
|
params
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def make_json_ld_header do
|
def make_json_ld_header do
|
||||||
%{
|
%{
|
||||||
"@context" => [
|
"@context" => [
|
||||||
|
|
1
test/fixtures/mastodon-post-activity.json
vendored
1
test/fixtures/mastodon-post-activity.json
vendored
|
@ -21,7 +21,6 @@
|
||||||
"http://localtesting.pleroma.lol/users/lain"
|
"http://localtesting.pleroma.lol/users/lain"
|
||||||
],
|
],
|
||||||
"id": "http://mastodon.example.org/users/admin/statuses/99512778738411822/activity",
|
"id": "http://mastodon.example.org/users/admin/statuses/99512778738411822/activity",
|
||||||
"nickname": "lain",
|
|
||||||
"object": {
|
"object": {
|
||||||
"atomUri": "http://mastodon.example.org/users/admin/statuses/99512778738411822",
|
"atomUri": "http://mastodon.example.org/users/admin/statuses/99512778738411822",
|
||||||
"attachment": [],
|
"attachment": [],
|
||||||
|
|
|
@ -46,7 +46,7 @@ test "it returns 404 for non-public messages", %{conn: conn} do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "/users/:nickname/inbox" do
|
describe "/inbox" do
|
||||||
test "it inserts an incoming activity into the database", %{conn: conn} do
|
test "it inserts an incoming activity into the database", %{conn: conn} do
|
||||||
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
|
data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!()
|
||||||
|
|
||||||
|
@ -62,6 +62,27 @@ test "it inserts an incoming activity into the database", %{conn: conn} do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "/users/:nickname/inbox" do
|
||||||
|
test "it inserts an incoming activity into the database", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
data =
|
||||||
|
File.read!("test/fixtures/mastodon-post-activity.json")
|
||||||
|
|> Poison.decode!()
|
||||||
|
|> Map.put("bcc", [user.ap_id])
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:valid_signature, true)
|
||||||
|
|> put_req_header("content-type", "application/activity+json")
|
||||||
|
|> post("/users/#{user.nickname}/inbox", data)
|
||||||
|
|
||||||
|
assert "ok" == json_response(conn, 200)
|
||||||
|
:timer.sleep(500)
|
||||||
|
assert Activity.get_by_ap_id(data["id"])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "/users/:nickname/outbox" do
|
describe "/users/:nickname/outbox" do
|
||||||
test "it returns a note activity in a collection", %{conn: conn} do
|
test "it returns a note activity in a collection", %{conn: conn} do
|
||||||
note_activity = insert(:note_activity)
|
note_activity = insert(:note_activity)
|
||||||
|
|
Loading…
Reference in a new issue