logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://anongit.hacktivis.me/git/pleroma.git/
commit: bde52824d32168a9d68107661587fefd50477d75
parent d24e6eaf391157a1c465d53924189d6cf4bc22e6
Author: Lain Soykaf <lain@lain.com>
Date:   Mon, 21 Jul 2025 16:36:52 +0400

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

Diffstat:

Mlib/pleroma/moderation_log.ex6++++++
Mtest/pleroma/moderation_log_test.exs33+++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 0 deletions(-)

diff --git 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 @@ -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