commit: 4f5b5ac81157792875ce444b5e74ee70e175a7b5
parent 212bcf8d00e40c70728a5479b0bf6421a0809cd6
Author: lain <lain@soykaf.club>
Date: Thu, 3 Sep 2020 17:13:04 +0200
Federator: Add option do save failed activities
Diffstat:
3 files changed, 43 insertions(+), 1 deletion(-)
diff --git a/config/config.exs b/config/config.exs
@@ -838,6 +838,10 @@ config :pleroma, Pleroma.User.Backup,
limit_days: 7,
dir: nil
+config :pleroma, :debug_failed_activities,
+ enabled: false,
+ folder: "failed_activities"
+
config :pleroma, ConcurrentLimiter, [
{Pleroma.Web.RichMedia.Helpers, [max_running: 5, max_waiting: 5]},
{Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy, [max_running: 5, max_waiting: 5]}
diff --git a/lib/pleroma/web/federator.ex b/lib/pleroma/web/federator.ex
@@ -102,12 +102,29 @@ defmodule Pleroma.Web.Federator do
e
e ->
- # Just drop those for now
+ if Pleroma.Config.get([:debug_failed_activities, :enabled]) do
+ save_failed_activity(params)
+ end
+
Logger.debug(fn -> "Unhandled activity\n" <> Jason.encode!(params, pretty: true) end)
{: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/pleroma/web/federator_test.exs b/test/pleroma/web/federator_test.exs
@@ -136,6 +136,27 @@ defmodule Pleroma.Web.FederatorTest 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",