Merge fixes.
This commit is contained in:
parent
cda410adfd
commit
788b7e7bbd
|
@ -1557,16 +1557,13 @@ def delete_user_activities(%User{ap_id: ap_id} = user) do
|
||||||
defp delete_activity(%{data: %{"type" => "Create", "object" => object}}, user) do
|
defp delete_activity(%{data: %{"type" => "Create", "object" => object}}, user) do
|
||||||
{:ok, delete_data, _} = Builder.delete(user, object)
|
{:ok, delete_data, _} = Builder.delete(user, object)
|
||||||
|
|
||||||
Pipeline.common_pipeline(delete_data, local: true)
|
Pipeline.common_pipeline(delete_data, local: user.local)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp delete_activity(%{data: %{"type" => type}} = activity) when type in ["Like", "Announce"] do
|
defp delete_activity(%{data: %{"type" => type}} = activity, user)
|
||||||
actor =
|
when type in ["Like", "Announce"] do
|
||||||
activity.actor
|
{:ok, undo, _} = Builder.undo(user, activity)
|
||||||
|> get_cached_by_ap_id()
|
Pipeline.common_pipeline(undo, local: user.local)
|
||||||
|
|
||||||
{:ok, undo, _} = Builder.undo(actor, activity)
|
|
||||||
Pipeline.common_pipeline(undo, local: true)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp delete_activity(_activity, _user), do: "Doing nothing"
|
defp delete_activity(_activity, _user), do: "Doing nothing"
|
||||||
|
|
|
@ -21,8 +21,10 @@ def validate(object, meta)
|
||||||
|
|
||||||
def validate(%{"type" => "Undo"} = object, meta) do
|
def validate(%{"type" => "Undo"} = object, meta) do
|
||||||
with {:ok, object} <-
|
with {:ok, object} <-
|
||||||
object |> UndoValidator.cast_and_validate() |> Ecto.Changeset.apply_action(:insert) do
|
object
|
||||||
object = stringify_keys(object |> Map.from_struct())
|
|> UndoValidator.cast_and_validate()
|
||||||
|
|> Ecto.Changeset.apply_action(:insert) do
|
||||||
|
object = stringify_keys(object)
|
||||||
{:ok, object, meta}
|
{:ok, object, meta}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -48,7 +48,7 @@ def validate_object_presence(cng, options \\ []) do
|
||||||
|
|
||||||
cng
|
cng
|
||||||
|> validate_change(field_name, fn field_name, object_id ->
|
|> validate_change(field_name, fn field_name, object_id ->
|
||||||
object = Object.get_cached_by_ap_id(object_id) || Activity.get_by_ap_id(object)
|
object = Object.get_cached_by_ap_id(object_id) || Activity.get_by_ap_id(object_id)
|
||||||
|
|
||||||
cond do
|
cond do
|
||||||
!object ->
|
!object ->
|
||||||
|
|
|
@ -107,7 +107,6 @@ test "it's invalid if the object doesn't exist", %{valid_post_delete: valid_post
|
||||||
{:error, cng} = ObjectValidator.validate(missing_object, [])
|
{:error, cng} = ObjectValidator.validate(missing_object, [])
|
||||||
|
|
||||||
assert {:object, {"can't find object", []}} in cng.errors
|
assert {:object, {"can't find object", []}} in cng.errors
|
||||||
assert length(cng.errors) == 1
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it's invalid if the actor of the object and the actor of delete are from different domains",
|
test "it's invalid if the actor of the object and the actor of delete are from different domains",
|
||||||
|
|
|
@ -685,113 +685,6 @@ test "it works for incoming update activities which lock the account" do
|
||||||
assert user.locked == true
|
assert user.locked == true
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it works for incoming deletes" do
|
|
||||||
activity = insert(:note_activity)
|
|
||||||
deleting_user = insert(:user)
|
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-delete.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|
|
||||||
object =
|
|
||||||
data["object"]
|
|
||||||
|> Map.put("id", activity.data["object"])
|
|
||||||
|
|
||||||
data =
|
|
||||||
data
|
|
||||||
|> Map.put("object", object)
|
|
||||||
|> Map.put("actor", deleting_user.ap_id)
|
|
||||||
|
|
||||||
{:ok, %Activity{actor: actor, local: false, data: %{"id" => id}}} =
|
|
||||||
Transmogrifier.handle_incoming(data)
|
|
||||||
|
|
||||||
assert id == data["id"]
|
|
||||||
refute Activity.get_by_id(activity.id)
|
|
||||||
assert actor == deleting_user.ap_id
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it fails for incoming deletes with spoofed origin" do
|
|
||||||
activity = insert(:note_activity)
|
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-delete.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|
|
||||||
object =
|
|
||||||
data["object"]
|
|
||||||
|> Map.put("id", activity.data["object"])
|
|
||||||
|
|
||||||
data =
|
|
||||||
data
|
|
||||||
|> Map.put("object", object)
|
|
||||||
|
|
||||||
assert capture_log(fn ->
|
|
||||||
:error = Transmogrifier.handle_incoming(data)
|
|
||||||
end) =~
|
|
||||||
"[error] Could not decode user at fetch http://mastodon.example.org/users/gargron, {:error, :nxdomain}"
|
|
||||||
|
|
||||||
assert Activity.get_by_id(activity.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
@tag capture_log: true
|
|
||||||
test "it works for incoming user deletes" do
|
|
||||||
%{ap_id: ap_id} =
|
|
||||||
insert(:user, ap_id: "http://mastodon.example.org/users/admin", local: false)
|
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-delete-user.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|
|
||||||
{:ok, _} = Transmogrifier.handle_incoming(data)
|
|
||||||
ObanHelpers.perform_all()
|
|
||||||
|
|
||||||
refute User.get_cached_by_ap_id(ap_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it fails for incoming user deletes with spoofed origin" do
|
|
||||||
%{ap_id: ap_id} = insert(:user)
|
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-delete-user.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|> Map.put("actor", ap_id)
|
|
||||||
|
|
||||||
assert capture_log(fn ->
|
|
||||||
assert :error == Transmogrifier.handle_incoming(data)
|
|
||||||
end) =~ "Object containment failed"
|
|
||||||
|
|
||||||
assert User.get_cached_by_ap_id(ap_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it works for incoming unannounces with an existing notice" do
|
|
||||||
user = insert(:user)
|
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey"})
|
|
||||||
|
|
||||||
announce_data =
|
|
||||||
File.read!("test/fixtures/mastodon-announce.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|> Map.put("object", activity.data["object"])
|
|
||||||
|
|
||||||
{:ok, %Activity{data: announce_data, local: false}} =
|
|
||||||
Transmogrifier.handle_incoming(announce_data)
|
|
||||||
|
|
||||||
data =
|
|
||||||
File.read!("test/fixtures/mastodon-undo-announce.json")
|
|
||||||
|> Poison.decode!()
|
|
||||||
|> Map.put("object", announce_data)
|
|
||||||
|> Map.put("actor", announce_data["actor"])
|
|
||||||
|
|
||||||
{:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data)
|
|
||||||
|
|
||||||
assert data["type"] == "Undo"
|
|
||||||
assert object_data = data["object"]
|
|
||||||
assert object_data["type"] == "Announce"
|
|
||||||
assert object_data["object"] == activity.data["object"]
|
|
||||||
|
|
||||||
assert object_data["id"] ==
|
|
||||||
"http://mastodon.example.org/users/admin/statuses/99542391527669785/activity"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "it works for incomming unfollows with an existing follow" do
|
test "it works for incomming unfollows with an existing follow" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue