From 85a802282e193333cca700a4ea46243c33057767 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Fri, 24 Jul 2026 20:08:04 +0400 Subject: [PATCH] fix(feed): hide sensitive media previews --- lib/pleroma/web/feed/feed_view.ex | 39 ++++++++++--------- .../web/templates/feed/feed/_activity.rss.eex | 2 +- .../templates/feed/feed/_tag_activity.xml.eex | 2 +- test/pleroma/web/feed/feed_view_test.exs | 24 ++++++++++++ 4 files changed, 47 insertions(+), 20 deletions(-) diff --git a/lib/pleroma/web/feed/feed_view.ex b/lib/pleroma/web/feed/feed_view.ex index 9724cc7f9..f8bc94504 100644 --- a/lib/pleroma/web/feed/feed_view.ex +++ b/lib/pleroma/web/feed/feed_view.ex @@ -117,10 +117,14 @@ defmodule Pleroma.Web.Feed.FeedView do end attachments_html = - (data["attachment"] || []) - |> Enum.map(&rss_attachment_preview/1) - |> Enum.reject(&(&1 == "")) - |> Enum.join("

") + if data["sensitive"] do + "" + else + (data["attachment"] || []) + |> Enum.map(&rss_attachment_preview/1) + |> Enum.reject(&(&1 == "")) + |> Enum.join("

") + end [base_content, attachments_html] |> Enum.reject(&(&1 == "")) @@ -223,7 +227,9 @@ defmodule Pleroma.Web.Feed.FeedView do attachment["name"] || "" end - def media_content_xml(attachment) do + def media_content_xml(_attachment, true), do: "" + + def media_content_xml(attachment, _sensitive) do href = escape(attachment_href(attachment) || "") type = escape(attachment_type(attachment) || "application/octet-stream") medium = escape(attachment_medium(attachment)) @@ -234,20 +240,17 @@ defmodule Pleroma.Web.Feed.FeedView do _ -> "" end - description_xml = - case attachment_description(attachment) do - "" -> - "" + case attachment_description(attachment) do + "" -> + ~s(\n) - description -> - ~s(\n #{escape(description)}) - end - - """ - - nonadult#{description_xml} - - """ + description -> + """ + + #{escape(description)} + + """ + end end defp attachment_url_data(attachment) do diff --git a/lib/pleroma/web/templates/feed/feed/_activity.rss.eex b/lib/pleroma/web/templates/feed/feed/_activity.rss.eex index a8c2aa342..e2708543f 100644 --- a/lib/pleroma/web/templates/feed/feed/_activity.rss.eex +++ b/lib/pleroma/web/templates/feed/feed/_activity.rss.eex @@ -23,7 +23,7 @@ <%= unless attachment_previewable?(attachment) do %> <% end %> - <%= media_content_xml(attachment) %> + <%= media_content_xml(attachment, @data["sensitive"]) %> <% end %> <%= if @data["inReplyTo"] do %> diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex index 6ae3c5a55..9b857ee5e 100644 --- a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex +++ b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex @@ -11,7 +11,7 @@ <%= unless attachment_previewable?(attachment) do %> <% end %> - <%= media_content_xml(attachment) %> + <%= media_content_xml(attachment, @data["sensitive"]) %> <% end %> <%= for tag <- Pleroma.Object.hashtags(@object) do %> diff --git a/test/pleroma/web/feed/feed_view_test.exs b/test/pleroma/web/feed/feed_view_test.exs index 3ff3b9bae..45ed3c3ff 100644 --- a/test/pleroma/web/feed/feed_view_test.exs +++ b/test/pleroma/web/feed/feed_view_test.exs @@ -19,4 +19,28 @@ defmodule Pleroma.Web.Feed.FeedViewTest do assert FeedView.atom_content_encoded(data) == expected assert FeedView.rss_content_encoded(data) == expected end + + test "does not preview or classify sensitive attachments" do + attachment = %{ + "name" => "spoiler", + "url" => [%{"href" => "https://example.com/spoiler.png", "mediaType" => "image/png"}] + } + + data = %{ + "attachment" => [attachment], + "content" => "content warning", + "sensitive" => true + } + + assert FeedView.atom_content_encoded(data) == "content warning" + assert FeedView.rss_content_encoded(data) == "content warning" + assert FeedView.media_content_xml(attachment, true) == "" + + media_content = FeedView.media_content_xml(attachment, false) + assert media_content =~ "spoiler" + refute media_content =~ "media:rating" + + assert FeedView.media_content_xml(Map.delete(attachment, "name"), false) == + ~s(\n) + end end