From 297a2c7d3f2f4e79d05ed799e7bb20ed27b35a9c Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 19 Feb 2018 17:37:45 +0100 Subject: [PATCH] Ignore duplicate create activities. --- .../web/activity_pub/activity_pub_controller.ex | 2 +- lib/pleroma/web/activity_pub/transmogrifier.ex | 4 +++- test/web/activity_pub/transmogrifier_test.exs | 12 ++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index 1a6d7ec7a..835e8bd9d 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -25,7 +25,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do # TODO: Ensure that this inbox is a recipient of the message def inbox(%{assigns: %{valid_signature: true}} = conn, params) do # File.write("/tmp/incoming.json", Poison.encode!(params)) - Logger.info(Poison.encode!(params, [pretty: 2])) + # Logger.info(Poison.encode!(params, [pretty: 2])) with {:ok, _user} <- ap_enabled_actor(params["actor"]), nil <- Activity.get_by_ap_id(params["id"]), {:ok, activity} <- Transmogrifier.handle_incoming(params) do diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 075250aa5..e53957fbf 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -37,7 +37,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do # - tags # - emoji def handle_incoming(%{"type" => "Create", "object" => %{"type" => "Note"} = object} = data) do - with %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do + with nil <- Activity.get_create_activity_by_object_ap_id(object["id"]), + %User{} = user <- User.get_or_fetch_by_ap_id(data["actor"]) do object = fix_object(data["object"]) params = %{ to: data["to"], @@ -54,6 +55,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do ActivityPub.create(params) else + %Activity{} = activity -> {:ok, activity} _e -> :error end end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 45e284157..11c6bbe1c 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -10,6 +10,18 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do alias Pleroma.Web.CommonAPI describe "handle_incoming" do + test "it ignores an incoming notice if we already have it" do + activity = insert(:note_activity) + + data = File.read!("test/fixtures/mastodon-post-activity.json") + |> Poison.decode! + |> Map.put("object", activity.data["object"]) + + {:ok, returned_activity} = Transmogrifier.handle_incoming(data) + + assert activity == returned_activity + end + test "it works for incoming notices" do data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!