commit: f9fe7e5c3a39151047b93117259eae7136376790
parent 2b2055b3ace9a696f55e9d14f3b7b45b6d83d2dd
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
@@ -832,6 +832,10 @@ config :pleroma, Pleroma.User.Backup,
limit_days: 7,
dir: nil
+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.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",