From 47a67f1c8f4b87fb13092e1005f8c9f1f46a2c7a Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 3 Sep 2020 17:13:04 +0200 Subject: Federator: Add option do save failed activities --- config/config.exs | 4 ++++ lib/pleroma/web/federator/federator.ex | 19 ++++++++++++++++++- test/web/federator_test.exs | 21 +++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/config/config.exs b/config/config.exs index ed37b93c0..ec1f8f078 100644 --- a/config/config.exs +++ b/config/config.exs @@ -798,6 +798,10 @@ config :pleroma, Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.PleromaAuthenticator +config :pleroma, :debug_failed_activities, + enabled: false, + folder: "failed_activities" + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index f5803578d..632388238 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -86,13 +86,30 @@ def perform(:incoming_ap_doc, params) do {:error, :already_present} e -> - # Just drop those for now + if Pleroma.Config.get([:debug_failed_activities, :enabled]) do + save_failed_activity(params) + end + Logger.debug("Unhandled activity") Logger.debug(Jason.encode!(params, pretty: true)) {:error, e} end end + defp save_failed_activity(params) do + folder = Pleroma.Config.get([:debug_failed_activities, :folder], "failed_activities") + File.mkdir_p!(folder) + filename = URI.encode_www_form(params["id"] || Ecto.UUID.generate()) + + case File.write(Path.join([folder, filename]), Jason.encode!(params)) do + {:error, e} -> + Logger.debug("Can't write failed activity, reason: #{inspect(e)}") + + _ -> + nil + end + end + def ap_enabled_actor(id) do user = User.get_cached_by_ap_id(id) diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index 592fdccd1..efd2112a9 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -135,6 +135,27 @@ test "successfully processes incoming AP docs with correct origin" do assert {:error, :already_present} = ObanHelpers.perform(job) end + test "rejects unknown activities" do + params = %{ + "@context" => "https://www.w3.org/ns/activitystreams", + "actor" => "http://mastodon.example.org/users/admin", + "type" => "Frobnicate", + "id" => "http://mastodon.example.org/users/admin/activities/1" + } + + assert {:ok, job} = Federator.incoming_ap_doc(params) + assert {:error, _activity} = ObanHelpers.perform(job) + + clear_config([:debug_failed_activities, :enabled], true) + + assert {:ok, job} = Federator.incoming_ap_doc(params) + assert {:error, _activity} = ObanHelpers.perform(job) + + debug_folder = Pleroma.Config.get([:debug_failed_activities, :folder]) + + assert File.exists?(Path.join(debug_folder, URI.encode_www_form(params["id"]))) + end + test "rejects incoming AP docs with incorrect origin" do params = %{ "@context" => "https://www.w3.org/ns/activitystreams", -- cgit v1.2.3