From 542f8b2aef34a1a3cade2d7e3e52ef0c80e3889c Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Sat, 31 Oct 2026 15:37:42 +0400 Subject: [PATCH] fix(media_proxy): do not proxy data: URLs Ported from Akkoma 7632765b4. Co-authored-by: nopjmp --- changelog.d/media-proxy-data-urls.fix | 1 + lib/pleroma/web/media_proxy.ex | 6 ++++-- test/pleroma/web/media_proxy_test.exs | 12 ++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 changelog.d/media-proxy-data-urls.fix diff --git a/changelog.d/media-proxy-data-urls.fix b/changelog.d/media-proxy-data-urls.fix new file mode 100644 index 000000000..a83b8ef29 --- /dev/null +++ b/changelog.d/media-proxy-data-urls.fix @@ -0,0 +1 @@ +MediaProxy: Do not proxy data: URLs diff --git a/lib/pleroma/web/media_proxy.ex b/lib/pleroma/web/media_proxy.ex index 82a070767..a318ab10f 100644 --- a/lib/pleroma/web/media_proxy.ex +++ b/lib/pleroma/web/media_proxy.ex @@ -45,7 +45,7 @@ defmodule Pleroma.Web.MediaProxy do def url("/" <> _ = url), do: url def url(url) do - if enabled?() and url_proxiable?(url) do + if enabled?() and not data_url?(url) and url_proxiable?(url) do encode_url(url) else url @@ -61,7 +61,7 @@ defmodule Pleroma.Web.MediaProxy do def preview_url("//" <> _ = url, pparams), do: preview_url("https:" <> url, pparams) def preview_url(url, preview_params) do - if preview_enabled?() do + if preview_enabled?() and not data_url?(url) do encode_preview_url(url, preview_params) else url(url) @@ -74,6 +74,8 @@ defmodule Pleroma.Web.MediaProxy do # non-local non-whitelisted URLs through it and be sure that body size constraint is preserved. def preview_enabled?, do: enabled?() and !!Config.get([:media_preview_proxy, :enabled]) + defp data_url?(url), do: url |> String.slice(0, 5) |> String.downcase() == "data:" + def local?(url), do: String.starts_with?(url, Endpoint.url()) def whitelisted?(url) do diff --git a/test/pleroma/web/media_proxy_test.exs b/test/pleroma/web/media_proxy_test.exs index ab707a061..433a0fe95 100644 --- a/test/pleroma/web/media_proxy_test.exs +++ b/test/pleroma/web/media_proxy_test.exs @@ -45,6 +45,18 @@ defmodule Pleroma.Web.MediaProxyTest do assert MediaProxy.url(local_root) == local_root end + test "ignores data url" do + assert MediaProxy.url("data:image/png;base64,AAAA") == "data:image/png;base64,AAAA" + assert MediaProxy.url("DATA:image/png;base64,AAAA") == "DATA:image/png;base64,AAAA" + end + + test "preview_url ignores data url" do + clear_config([:media_preview_proxy, :enabled], true) + + assert MediaProxy.preview_url("data:image/png;base64,AAAA") == + "data:image/png;base64,AAAA" + end + test "encodes and decodes URL" do url = "https://pleroma.soykaf.com/static/logo.png" encoded = MediaProxy.url(url)