Federate unfollow activity in move_following properly

0: Use the CommonAPI unfollow function to make sure the
unfollow activity is federated.

1: Limit the follow and unfollow to local followers only,
while let the romote servers decide whether to move their followers.

Ref: emit-move
This commit is contained in:
Tusooa Zhu 2021-09-12 21:52:44 -04:00
parent e41eee5ed1
commit 4f44fd32ea
No known key found for this signature in database
GPG Key ID: 7B467EDE43A08224
2 changed files with 38 additions and 1 deletions

View File

@ -194,11 +194,12 @@ def move_following(origin, target) do
|> join(:inner, [r], f in assoc(r, :follower)) |> join(:inner, [r], f in assoc(r, :follower))
|> where(following_id: ^origin.id) |> where(following_id: ^origin.id)
|> where([r, f], f.allow_following_move == true) |> where([r, f], f.allow_following_move == true)
|> where([r, f], f.local == true)
|> limit(50) |> limit(50)
|> preload([:follower]) |> preload([:follower])
|> Repo.all() |> Repo.all()
|> Enum.map(fn following_relationship -> |> Enum.map(fn following_relationship ->
Repo.delete(following_relationship) Pleroma.Web.CommonAPI.unfollow(following_relationship.follower, origin)
Pleroma.Web.CommonAPI.follow(following_relationship.follower, target) Pleroma.Web.CommonAPI.follow(following_relationship.follower, target)
end) end)
|> case do |> case do

View File

@ -1775,6 +1775,42 @@ test "old user must be in the new user's `also_known_as` list" do
assert {:error, "Target account must have the origin in `alsoKnownAs`"} = assert {:error, "Target account must have the origin in `alsoKnownAs`"} =
ActivityPub.move(old_user, new_user) ActivityPub.move(old_user, new_user)
end end
test "do not move remote user following relationships" do
%{ap_id: old_ap_id} = old_user = insert(:user)
%{ap_id: new_ap_id} = new_user = insert(:user, also_known_as: [old_ap_id])
follower_remote = insert(:user, local: false)
User.follow(follower_remote, old_user)
assert User.following?(follower_remote, old_user)
assert {:ok, activity} = ActivityPub.move(old_user, new_user)
assert %Activity{
actor: ^old_ap_id,
data: %{
"actor" => ^old_ap_id,
"object" => ^old_ap_id,
"target" => ^new_ap_id,
"type" => "Move"
},
local: true
} = activity
params = %{
"op" => "move_following",
"origin_id" => old_user.id,
"target_id" => new_user.id
}
assert_enqueued(worker: Pleroma.Workers.BackgroundWorker, args: params)
Pleroma.Workers.BackgroundWorker.perform(%Oban.Job{args: params})
assert User.following?(follower_remote, old_user)
refute User.following?(follower_remote, new_user)
end
end end
test "doesn't retrieve replies activities with exclude_replies" do test "doesn't retrieve replies activities with exclude_replies" do