From d9f40b05b30dd735d0dc87f8268db842bf8ad1f0 Mon Sep 17 00:00:00 2001 From: Rin Toshaka Date: Sun, 30 Dec 2018 16:51:16 +0100 Subject: [PATCH] Added get_stripped_html_for_object. Renamed a few things --- lib/pleroma/web/common_api/utils.ex | 34 ++++++++++++++++--- .../web/mastodon_api/views/status_view.ex | 2 +- .../web/twitter_api/views/activity_view.ex | 5 ++- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index d4c169ad9..759bd62af 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -262,10 +262,13 @@ def emoji_from_profile(%{info: _info} = user) 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 @@ def get_scrubbed_html( {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 @@ def get_scrubbed_html( # Remove the entry if scrubber version is outdated {nil, nil} end + else + {entry, content} end end) @@ -297,15 +302,30 @@ def get_scrubbed_html( 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 @@ defp update_scrubber_cache(activity, scrubber_cache) 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 diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 8fa3798a6..05ed602d5 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -120,7 +120,7 @@ def render("status.json", %{activity: %{data: %{"object" => object}} = activity} 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), diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex index adac1dfe9..7d0dea8c2 100644 --- a/lib/pleroma/web/twitter_api/views/activity_view.ex +++ b/lib/pleroma/web/twitter_api/views/activity_view.ex @@ -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 @@ def render( 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//, "\n") - |> HTML.strip_tags() + |> Utils.get_stripped_html_for_object(activity) end reply_parent = Activity.get_in_reply_to_activity(activity)