Added get_stripped_html_for_object. Renamed a few things
authorRin Toshaka <rinpatch@sdf.org>
Sun, 30 Dec 2018 15:51:16 +0000 (16:51 +0100)
committerRin Toshaka <rinpatch@sdf.org>
Sun, 30 Dec 2018 15:51:16 +0000 (16:51 +0100)
lib/pleroma/web/common_api/utils.ex
lib/pleroma/web/mastodon_api/views/status_view.ex
lib/pleroma/web/twitter_api/views/activity_view.ex

index d4c169ad930bb6a9921500f77e994802bdee16ce..759bd62af8751aaae2bd32bbe01f027e35921ba3 100644 (file)
@@ -262,10 +262,13 @@ defmodule Pleroma.Web.CommonAPI.Utils do
     end)
   end
 
+  def get_scrubbed_html_for_object(content, scrubber, activity) when is_atom(scrubber) do
+    get_scrubbed_html_for_object(content, [scrubber], activity)
+  end
   @doc """
   Get sanitized HTML from cache, or scrub it and save to cache.
   """
-  def get_scrubbed_html(
+  def get_scrubbed_html_for_object(
         content,
         scrubbers,
         %{data: %{"object" => object}} = activity
@@ -281,7 +284,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do
 
     {new_scrubber_cache, scrubbed_html} =
       Enum.map_reduce(scrubber_cache, nil, fn
-        entry, _content ->
+        entry, content ->
           if Map.keys(entry["scrubbers"]) == Map.keys(signature) do
             if entry["scrubbers"] == signature do
               {entry, entry["content"]}
@@ -289,6 +292,8 @@ defmodule Pleroma.Web.CommonAPI.Utils do
               # Remove the entry if scrubber version is outdated
               {nil, nil}
             end
+          else
+            {entry, content}
           end
       end)
 
@@ -297,15 +302,30 @@ defmodule Pleroma.Web.CommonAPI.Utils do
 
     if scrubbed_html == nil or new_scrubber_cache != scrubber_cache do
       scrubbed_html = HTML.filter_tags(content, scrubbers)
-      new_scrubber_cache = [%{:scrubbers => signature, :content => scrubbed_html} | new_scrubber_cache]
+
+      new_scrubber_cache = [
+        %{:scrubbers => signature, :content => scrubbed_html} | new_scrubber_cache
+      ]
+
       update_scrubber_cache(activity, new_scrubber_cache)
+      scrubbed_html
+    else
+      scrubbed_html
     end
-    scrubbed_html
   end
 
   defp generate_scrubber_signature(scrubbers) do
     Enum.reduce(scrubbers, %{}, fn scrubber, signature ->
-      Map.put(signature, to_string(scrubber), scrubber.version)
+      Map.put(
+        signature,
+        to_string(scrubber),
+        # If a scrubber does not have a version(e.g HtmlSanitizeEx.Scrubber) it is assumed it is always 0)
+        if Kernel.function_exported?(scrubber, :version, 0) do
+          scrubber.version
+        else
+          0
+        end
+      )
     end)
   end
 
@@ -317,4 +337,8 @@ defmodule Pleroma.Web.CommonAPI.Utils do
 
     {:ok, _struct} = Repo.update(cng)
   end
+
+  def get_stripped_html_for_object(content, activity) do
+    get_scrubbed_html_for_object(content, [HtmlSanitizeEx.Scrubber.StripTags], activity)
+  end
 end
index 8fa3798a68b01b15df59d8b5001ebd4c41865a61..05ed602d595728f48af862152c8bb07cd65a4b49 100644 (file)
@@ -120,7 +120,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
     content =
       object
       |> render_content()
-      |> Utils.get_scrubbed_html(User.html_filter_policy(opts[:for]), activity)
+      |> Utils.get_scrubbed_html_for_object(User.html_filter_policy(opts[:for]), activity)
 
     %{
       id: to_string(activity.id),
index adac1dfe9fe5761e31f4cfc7e20e603878b2b226..7d0dea8c256c97dfaa3e3d66d1ead9ebc4c89eb4 100644 (file)
@@ -15,7 +15,6 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
   alias Pleroma.User
   alias Pleroma.Repo
   alias Pleroma.Formatter
-  alias Pleroma.HTML
 
   import Ecto.Query
   require Logger
@@ -245,14 +244,14 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
 
     html =
       content
-      |> Utils.get_scrubbed_html(User.html_filter_policy(opts[:for]), activity)
+      |> Utils.get_scrubbed_html_for_object(User.html_filter_policy(opts[:for]), activity)
       |> Formatter.emojify(object["emoji"])
 
     text =
       if content do
         content
         |> String.replace(~r/<br\s?\/?>/, "\n")
-        |> HTML.strip_tags()
+        |> Utils.get_stripped_html_for_object(activity)
       end
 
     reply_parent = Activity.get_in_reply_to_activity(activity)