aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web/common_api/utils.ex
diff options
context:
space:
mode:
authorRin Toshaka <rinpatch@sdf.org>2018-12-29 17:45:50 +0100
committerRin Toshaka <rinpatch@sdf.org>2018-12-29 17:45:50 +0100
commit19f9889fbe9d120acfaed2a5aedb4032d56eb217 (patch)
tree215c1bf029a01be19fbe40e5ce9b30a5f9361587 /lib/pleroma/web/common_api/utils.ex
parent922abcda61298a7bca48894cb9a51a52fdeab1ed (diff)
downloadpleroma-19f9889fbe9d120acfaed2a5aedb4032d56eb217.tar.gz
I am not sure what's going on anymore so I'll just commit and reset all the other files to HEAD
Diffstat (limited to 'lib/pleroma/web/common_api/utils.ex')
-rw-r--r--lib/pleroma/web/common_api/utils.ex61
1 files changed, 60 insertions, 1 deletions
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index b91cfc4bb..5c37fd671 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -5,7 +5,7 @@
defmodule Pleroma.Web.CommonAPI.Utils do
alias Calendar.Strftime
alias Comeonin.Pbkdf2
- alias Pleroma.{Activity, Formatter, Object, Repo}
+ alias Pleroma.{Activity, Formatter, Object, Repo, HTML}
alias Pleroma.User
alias Pleroma.Web
alias Pleroma.Web.ActivityPub.Utils
@@ -261,4 +261,63 @@ defmodule Pleroma.Web.CommonAPI.Utils do
}
end)
end
+
+ @doc """
+ Get sanitized HTML from cache, or scrub it and save to cache.
+ """
+ def get_scrubbed_html(
+ content,
+ scrubbers,
+ %{data: %{"object" => object}} = activity
+ ) do
+ scrubber_cache =
+ if object["scrubber_cache"] != nil and is_list(object["scrubber_cache"]) do
+ object["scrubber_cache"]
+ else
+ []
+ end
+
+ key = generate_scrubber_key(scrubbers)
+
+ {new_scrubber_cache, scrubbed_html} =
+ Enum.map_reduce(scrubber_cache, nil, fn %{
+ :scrubbers => current_key,
+ :content => current_content
+ },
+ _ ->
+ if Map.keys(current_key) == Map.keys(key) do
+ if scrubbers == key do
+ {current_key, current_content}
+ else
+ # Remove the entry if scrubber version is outdated
+ {nil, nil}
+ end
+ end
+ end)
+
+ new_scrubber_cache = Enum.reject(new_scrubber_cache, &is_nil/1)
+
+ if !(new_scrubber_cache == scrubber_cache) or scrubbed_html == nil do
+ scrubbed_html = HTML.filter_tags(content, scrubbers)
+ new_scrubber_cache = [%{:scrubbers => key, :content => scrubbed_html} | new_scrubber_cache]
+
+ activity =
+ Map.merge(activity, %{
+ data: %{"object" => %{"scrubber_cache" => new_scrubber_cache}}
+ })
+
+ cng = Ecto.Changeset.change(activity)
+ Repo.update(cng)
+ scrubbed_html
+ else
+ IO.puts("got the post from cache")
+ scrubbed_html
+ end
+ end
+
+ defp generate_scrubber_key(scrubbers) do
+ Enum.reduce(scrubbers, %{}, fn scrubber, acc ->
+ Map.put(acc, to_string(scrubber), scrubber.version)
+ end)
+ end
end