From 5cd6894a66aa8e7f8a7406cfc840aa4ee8403205 Mon Sep 17 00:00:00 2001 From: Oneric Date: Mon, 14 Apr 2025 00:26:10 +0200 Subject: [PATCH] mediaproxy: proxy network-path references Discovered-by: snow Fixes: https://akkoma.dev/AkkomaGang/akkoma/issues/900 (cherry picked from commit bbf974adc82d09a2099fb1234729131929307911) --- lib/pleroma/web/media_proxy.ex | 6 ++- priv/scrubbers/media_proxy.ex | 4 ++ .../mastodon_api/views/status_view_test.exs | 40 +++++++++++++++++++ test/pleroma/web/media_proxy_test.exs | 14 +++++++ 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/media_proxy.ex b/lib/pleroma/web/media_proxy.ex index f9376b508..82a070767 100644 --- a/lib/pleroma/web/media_proxy.ex +++ b/lib/pleroma/web/media_proxy.ex @@ -41,6 +41,7 @@ defmodule Pleroma.Web.MediaProxy do end def url(url) when is_nil(url) or url == "", do: nil + def url("//" <> _ = url), do: url("https:" <> url) def url("/" <> _ = url), do: url def url(url) do @@ -56,7 +57,10 @@ defmodule Pleroma.Web.MediaProxy do not local?(url) and not whitelisted?(url) end - def preview_url(url, preview_params \\ []) do + def preview_url(url, preview_params \\ []) + def preview_url("//" <> _ = url, pparams), do: preview_url("https:" <> url, pparams) + + def preview_url(url, preview_params) do if preview_enabled?() do encode_preview_url(url, preview_params) else diff --git a/priv/scrubbers/media_proxy.ex b/priv/scrubbers/media_proxy.ex index 9935b3829..8a73e8d9b 100644 --- a/priv/scrubbers/media_proxy.ex +++ b/priv/scrubbers/media_proxy.ex @@ -17,6 +17,10 @@ defmodule Pleroma.HTML.Transform.MediaProxy do {"src", media_url} end + def scrub_attribute(:img, {"src", "//" <> target}) do + scrub_attribute(:img, {"src", "https://" <> target}) + end + def scrub_attribute(_tag, attribute), do: attribute def scrub({:img, attributes, children}) do diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs index f7b815ed7..ca40f4946 100644 --- a/test/pleroma/web/mastodon_api/views/status_view_test.exs +++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs @@ -559,6 +559,46 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do assert mention.url == recipient_ap_id end + test "inlined images are media proxied" do + ConfigMock |> stub_with(Pleroma.Test.StaticConfig) + clear_config([:media_proxy, :enabled], true) + user = insert(:user) + + {:ok, activity} = + CommonAPI.post(user, %{ + content_type: "text/html", + status: "hii " + }) + + activity = Repo.get(Activity, activity.id) + status = StatusView.render("show.json", activity: activity) + + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) + + assert status[:content] =~ + ~r/^hii stub_with(Pleroma.Test.StaticConfig) + clear_config([:media_proxy, :enabled], true) + user = insert(:user) + + {:ok, activity} = + CommonAPI.post(user, %{ + content_type: "text/html", + status: "hii " + }) + + activity = Repo.get(Activity, activity.id) + status = StatusView.render("show.json", activity: activity) + + assert_schema(status, "Status", Pleroma.Web.ApiSpec.spec()) + + assert status[:content] =~ + ~r/^hii Enum.map(& &1.ap_id) diff --git a/test/pleroma/web/media_proxy_test.exs b/test/pleroma/web/media_proxy_test.exs index 86d30c04c..ab707a061 100644 --- a/test/pleroma/web/media_proxy_test.exs +++ b/test/pleroma/web/media_proxy_test.exs @@ -59,6 +59,20 @@ defmodule Pleroma.Web.MediaProxyTest do assert decode_result(encoded) == url end + test "encodes and decodes a network-path reference URL as HTTPS" do + url = "//example.org/static/logo.png" + encoded = MediaProxy.url(url) + + assert String.starts_with?( + encoded, + Config.get([:media_proxy, :base_url], Pleroma.Web.Endpoint.url()) + ) + + assert String.ends_with?(encoded, "/logo.png") + + assert decode_result(encoded) == "https:" <> url + end + test "encodes and decodes URL without a path" do url = "https://pleroma.soykaf.com" encoded = MediaProxy.url(url)