spc-pleroma/lib/pleroma/web/activity_pub/mrf/ensure_re_prepended.ex

48 lines
1.5 KiB
Elixir
Raw Permalink Normal View History

# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.ActivityPub.MRF.EnsureRePrepended do
2018-12-06 11:37:29 +00:00
alias Pleroma.Object
@moduledoc "Ensure a re: is prepended on replies to a post with a Subject"
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
@reply_prefix Regex.compile!("^re:[[:space:]]*", [:caseless])
2019-07-10 05:12:21 +00:00
2022-07-23 21:48:39 +00:00
def history_awareness, do: :auto
def filter_by_summary(
2019-07-10 05:12:21 +00:00
%{data: %{"summary" => parent_summary}} = _in_reply_to,
%{"summary" => child_summary} = child
)
2018-12-06 13:48:12 +00:00
when not is_nil(child_summary) and byte_size(child_summary) > 0 and
not is_nil(parent_summary) and byte_size(parent_summary) > 0 do
if (child_summary == parent_summary and not Regex.match?(@reply_prefix, child_summary)) or
(Regex.match?(@reply_prefix, parent_summary) &&
Regex.replace(@reply_prefix, parent_summary, "") == child_summary) do
Map.put(child, "summary", "re: " <> child_summary)
else
child
end
end
2019-07-10 05:12:21 +00:00
def filter_by_summary(_in_reply_to, child), do: child
2022-07-23 21:48:39 +00:00
def filter(%{"type" => type, "object" => child_object} = object)
when type in ["Create", "Update"] and is_map(child_object) do
child =
2019-07-10 05:12:21 +00:00
child_object["inReplyTo"]
|> Object.normalize(fetch: false)
2019-07-10 05:12:21 +00:00
|> filter_by_summary(child_object)
object = Map.put(object, "object", child)
{:ok, object}
end
def filter(object), do: {:ok, object}
2019-08-13 22:36:24 +00:00
def describe, do: {:ok, %{}}
end