From bde52824d32168a9d68107661587fefd50477d75 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Mon, 21 Jul 2025 16:36:52 +0400 Subject: [PATCH 1/2] Fix ModerationLog FunctionClauseError for unknown actions Add catchall clause to handle log entries with unknown actions or malformed data. Prevents HTTP 500 errors in admin moderation log view. Fixes #3385 --- lib/pleroma/moderation_log.ex | 6 +++++ test/pleroma/moderation_log_test.exs | 33 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/pleroma/moderation_log.ex b/lib/pleroma/moderation_log.ex index 5c3ca58b0..52a71bc2d 100644 --- a/lib/pleroma/moderation_log.ex +++ b/lib/pleroma/moderation_log.ex @@ -575,6 +575,12 @@ defmodule Pleroma.ModerationLog do "@#{actor_nickname} requested account backup for @#{user_nickname}" end + def get_log_entry_message(%ModerationLog{data: data}) do + actor_name = get_in(data, ["actor", "nickname"]) || "unknown" + action = data["action"] || "unknown" + "@#{actor_name} performed action #{action}" + end + defp nicknames_to_string(nicknames) do nicknames |> Enum.map(&"@#{&1}") diff --git a/test/pleroma/moderation_log_test.exs b/test/pleroma/moderation_log_test.exs index 584b8708b..45fb3b8e1 100644 --- a/test/pleroma/moderation_log_test.exs +++ b/test/pleroma/moderation_log_test.exs @@ -308,4 +308,37 @@ defmodule Pleroma.ModerationLogTest do assert log.data["message"] == "@#{moderator.nickname} deleted status ##{note.id}" end end + + describe "get_log_entry_message/1" do + setup do + moderator = insert(:user, is_moderator: true) + [moderator: moderator] + end + + test "handles unknown action types gracefully", %{moderator: moderator} do + log_entry = %ModerationLog{ + data: %{ + "actor" => %{"nickname" => moderator.nickname}, + "action" => "unknown_action", + "some_data" => "test_value" + } + } + + assert ModerationLog.get_log_entry_message(log_entry) =~ moderator.nickname + assert ModerationLog.get_log_entry_message(log_entry) =~ "unknown_action" + end + + test "handles malformed log entries gracefully" do + log_entry = %ModerationLog{ + data: %{ + "action" => "force_password_reset" + # Missing "actor" and "subject" fields + } + } + + message = ModerationLog.get_log_entry_message(log_entry) + assert is_binary(message) + assert message =~ "force_password_reset" + end + end end From 3a1581c94554a487587a3a11f37ee3f723b99404 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Wed, 23 Jul 2025 11:18:46 +0400 Subject: [PATCH 2/2] add changelog --- changelog.d/moderation-log-unknown-actions.fix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/moderation-log-unknown-actions.fix diff --git a/changelog.d/moderation-log-unknown-actions.fix b/changelog.d/moderation-log-unknown-actions.fix new file mode 100644 index 000000000..8940e8d34 --- /dev/null +++ b/changelog.d/moderation-log-unknown-actions.fix @@ -0,0 +1 @@ +Fix ModerationLog FunctionClauseError for unknown actions \ No newline at end of file