transmogrifier: use User.delete() instead of handrolled user deletion code for remote users
Closes #1104
This commit is contained in:
parent
2b38961bf6
commit
f685e887b3
@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- Migrations: fix a sporadic migration failure
|
- Migrations: fix a sporadic migration failure
|
||||||
- Metadata rendering errors resulting in the entire page being inaccessible
|
- Metadata rendering errors resulting in the entire page being inaccessible
|
||||||
- Federation/MediaProxy not working with instances that have wrong certificate order
|
- Federation/MediaProxy not working with instances that have wrong certificate order
|
||||||
|
- ActivityPub S2S: remote user deletions now work the same as local user deletions.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Configuration: OpenGraph and TwitterCard providers enabled by default
|
- Configuration: OpenGraph and TwitterCard providers enabled by default
|
||||||
|
@ -614,7 +614,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
|||||||
# an error or a tombstone. This would allow us to verify that a deletion actually took
|
# an error or a tombstone. This would allow us to verify that a deletion actually took
|
||||||
# place.
|
# place.
|
||||||
def handle_incoming(
|
def handle_incoming(
|
||||||
%{"type" => "Delete", "object" => object_id, "actor" => _actor, "id" => _id} = data
|
%{"type" => "Delete", "object" => object_id, "actor" => actor, "id" => _id} = data
|
||||||
) do
|
) do
|
||||||
object_id = Utils.get_ap_id(object_id)
|
object_id = Utils.get_ap_id(object_id)
|
||||||
|
|
||||||
@ -625,7 +625,17 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
|||||||
{:ok, activity} <- ActivityPub.delete(object, false) do
|
{:ok, activity} <- ActivityPub.delete(object, false) do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
else
|
else
|
||||||
_e -> :error
|
nil ->
|
||||||
|
case User.get_cached_by_ap_id(object_id) do
|
||||||
|
%User{ap_id: ^actor} = user ->
|
||||||
|
User.delete(user)
|
||||||
|
|
||||||
|
nil ->
|
||||||
|
:error
|
||||||
|
end
|
||||||
|
|
||||||
|
_e ->
|
||||||
|
:error
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -531,5 +531,63 @@ defmodule Pleroma.NotificationTest do
|
|||||||
|
|
||||||
assert Enum.empty?(Notification.for_user(user))
|
assert Enum.empty?(Notification.for_user(user))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "notifications are deleted if a local user is deleted" do
|
||||||
|
user = insert(:user)
|
||||||
|
other_user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _activity} =
|
||||||
|
CommonAPI.post(user, %{"status" => "hi @#{other_user.nickname}", "visibility" => "direct"})
|
||||||
|
|
||||||
|
refute Enum.empty?(Notification.for_user(other_user))
|
||||||
|
|
||||||
|
User.delete(user)
|
||||||
|
|
||||||
|
assert Enum.empty?(Notification.for_user(other_user))
|
||||||
|
end
|
||||||
|
|
||||||
|
test "notifications are deleted if a remote user is deleted" do
|
||||||
|
remote_user = insert(:user)
|
||||||
|
local_user = insert(:user)
|
||||||
|
|
||||||
|
dm_message = %{
|
||||||
|
"@context" => "https://www.w3.org/ns/activitystreams",
|
||||||
|
"type" => "Create",
|
||||||
|
"actor" => remote_user.ap_id,
|
||||||
|
"id" => remote_user.ap_id <> "/activities/test",
|
||||||
|
"to" => [local_user.ap_id],
|
||||||
|
"cc" => [],
|
||||||
|
"object" => %{
|
||||||
|
"type" => "Note",
|
||||||
|
"content" => "Hello!",
|
||||||
|
"tag" => [
|
||||||
|
%{
|
||||||
|
"type" => "Mention",
|
||||||
|
"href" => local_user.ap_id,
|
||||||
|
"name" => "@#{local_user.nickname}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"to" => [local_user.ap_id],
|
||||||
|
"cc" => [],
|
||||||
|
"attributedTo" => remote_user.ap_id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, _dm_activity} = Transmogrifier.handle_incoming(dm_message)
|
||||||
|
|
||||||
|
refute Enum.empty?(Notification.for_user(local_user))
|
||||||
|
|
||||||
|
delete_user_message = %{
|
||||||
|
"@context" => "https://www.w3.org/ns/activitystreams",
|
||||||
|
"id" => remote_user.ap_id <> "/activities/delete",
|
||||||
|
"actor" => remote_user.ap_id,
|
||||||
|
"type" => "Delete",
|
||||||
|
"object" => remote_user.ap_id
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, _delete_activity} = Transmogrifier.handle_incoming(delete_user_message)
|
||||||
|
|
||||||
|
assert Enum.empty?(Notification.for_user(local_user))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user