forked from AkkomaGang/akkoma
Merge branch 'fix/like-adressing' into 'develop'
Stop adresssing like activities to actor's follower collection on non-public posts See merge request pleroma/pleroma!896
This commit is contained in:
commit
ca5d894e68
2 changed files with 72 additions and 3 deletions
|
@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
|
||||||
alias Pleroma.Web
|
alias Pleroma.Web
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
|
alias Pleroma.Web.ActivityPub.Visibility
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Web.Router.Helpers
|
alias Pleroma.Web.Router.Helpers
|
||||||
|
@ -274,13 +275,31 @@ def get_object_likes(%{data: %{"id" => id}}) do
|
||||||
Repo.all(query)
|
Repo.all(query)
|
||||||
end
|
end
|
||||||
|
|
||||||
def make_like_data(%User{ap_id: ap_id} = actor, %{data: %{"id" => id}} = object, activity_id) do
|
def make_like_data(
|
||||||
|
%User{ap_id: ap_id} = actor,
|
||||||
|
%{data: %{"actor" => object_actor_id, "id" => id}} = object,
|
||||||
|
activity_id
|
||||||
|
) do
|
||||||
|
object_actor = User.get_cached_by_ap_id(object_actor_id)
|
||||||
|
|
||||||
|
to =
|
||||||
|
if Visibility.is_public?(object) do
|
||||||
|
[actor.follower_address, object.data["actor"]]
|
||||||
|
else
|
||||||
|
[object.data["actor"]]
|
||||||
|
end
|
||||||
|
|
||||||
|
cc =
|
||||||
|
(object.data["to"] ++ (object.data["cc"] || []))
|
||||||
|
|> List.delete(actor.ap_id)
|
||||||
|
|> List.delete(object_actor.follower_address)
|
||||||
|
|
||||||
data = %{
|
data = %{
|
||||||
"type" => "Like",
|
"type" => "Like",
|
||||||
"actor" => ap_id,
|
"actor" => ap_id,
|
||||||
"object" => id,
|
"object" => id,
|
||||||
"to" => [actor.follower_address, object.data["actor"]],
|
"to" => to,
|
||||||
"cc" => ["https://www.w3.org/ns/activitystreams#Public"],
|
"cc" => cc,
|
||||||
"context" => object.data["context"]
|
"context" => object.data["context"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
defmodule Pleroma.Web.ActivityPub.UtilsTest do
|
defmodule Pleroma.Web.ActivityPub.UtilsTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
|
alias Pleroma.Web.CommonAPI
|
||||||
alias Pleroma.Web.ActivityPub.Utils
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
|
|
||||||
|
import Pleroma.Factory
|
||||||
|
|
||||||
describe "determine_explicit_mentions()" do
|
describe "determine_explicit_mentions()" do
|
||||||
test "works with an object that has mentions" do
|
test "works with an object that has mentions" do
|
||||||
object = %{
|
object = %{
|
||||||
|
@ -54,4 +57,51 @@ test "works with an object that has only IR tags" do
|
||||||
assert Utils.determine_explicit_mentions(object) == []
|
assert Utils.determine_explicit_mentions(object) == []
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "make_like_data" do
|
||||||
|
setup do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
third_user = insert(:user)
|
||||||
|
[user: user, other_user: other_user, third_user: third_user]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "addresses actor's follower address if the activity is public", %{
|
||||||
|
user: user,
|
||||||
|
other_user: other_user,
|
||||||
|
third_user: third_user
|
||||||
|
} do
|
||||||
|
expected_to = Enum.sort([user.ap_id, other_user.follower_address])
|
||||||
|
expected_cc = Enum.sort(["https://www.w3.org/ns/activitystreams#Public", third_user.ap_id])
|
||||||
|
|
||||||
|
{:ok, activity} =
|
||||||
|
CommonAPI.post(user, %{
|
||||||
|
"status" =>
|
||||||
|
"hey @#{other_user.nickname}, @#{third_user.nickname} how about beering together this weekend?"
|
||||||
|
})
|
||||||
|
|
||||||
|
%{"to" => to, "cc" => cc} = Utils.make_like_data(other_user, activity, nil)
|
||||||
|
assert Enum.sort(to) == expected_to
|
||||||
|
assert Enum.sort(cc) == expected_cc
|
||||||
|
end
|
||||||
|
|
||||||
|
test "does not adress actor's follower address if the activity is not public", %{
|
||||||
|
user: user,
|
||||||
|
other_user: other_user,
|
||||||
|
third_user: third_user
|
||||||
|
} do
|
||||||
|
expected_to = Enum.sort([user.ap_id])
|
||||||
|
expected_cc = [third_user.ap_id]
|
||||||
|
|
||||||
|
{:ok, activity} =
|
||||||
|
CommonAPI.post(user, %{
|
||||||
|
"status" => "@#{other_user.nickname} @#{third_user.nickname} bought a new swimsuit!",
|
||||||
|
"visibility" => "private"
|
||||||
|
})
|
||||||
|
|
||||||
|
%{"to" => to, "cc" => cc} = Utils.make_like_data(other_user, activity, nil)
|
||||||
|
assert Enum.sort(to) == expected_to
|
||||||
|
assert Enum.sort(cc) == expected_cc
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue