add license boilerplate to pleroma core
[akkoma] / lib / pleroma / web / activity_pub / mrf / ensure_re_prepended.ex
index 3f216010e570cfd1d92b3a2bc52b7dd85bb34f0c..ca3ee8a0d30c9563d8bc36ea046a8cd1c7e6d1e4 100644 (file)
@@ -1,30 +1,37 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Web.ActivityPub.MRF.EnsureRePrepended do
-  alias Pleroma.Activity
+  alias Pleroma.Object
 
   @behaviour Pleroma.Web.ActivityPub.MRF
 
+  @reply_prefix Regex.compile!("^re:[[:space:]]*", [:caseless])
   def filter_by_summary(
-        %{"summary" => parent_summary} = parent,
+        %{"summary" => parent_summary} = _parent,
         %{"summary" => child_summary} = child
       )
-      when not is_nil(child_summary) and child_summary == parent_summary and
-             byte_size(child_summary) > 1 do
-    if not String.starts_with?(child_summary, "re:") do
+      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
 
-  def filter_by_summary(parent, child), do: child
+  def filter_by_summary(_parent, child), do: child
 
   def filter(%{"type" => activity_type} = object) when activity_type == "Create" do
     child = object["object"]
-    in_reply_to = Activity.get_create_activity_by_object_ap_id(child["inReplyTo"])
+    in_reply_to = Object.normalize(child["inReplyTo"])
 
     child =
       if(in_reply_to,
-        do: filter_by_summary(in_reply_to.data["object"], child),
+        do: filter_by_summary(in_reply_to.data, child),
         else: child
       )