commit: 80db6f1328212a0b00e26f548f02aa5d6a3c1715
parent 0a8423fdf726e6c1d9d6bf781e14d610bb917ed9
Author: Phantasm <phantasm@centrum.cz>
Date: Fri, 29 Aug 2025 15:04:02 +0200
Fix character escaping test for Pleroma.Upload
Diffstat:
4 files changed, 40 insertions(+), 20 deletions(-)
diff --git a/lib/pleroma/http.ex b/lib/pleroma/http.ex
@@ -174,10 +174,14 @@ defmodule Pleroma.HTTP do
path
|> URI.encode(fn byte ->
- URI.char_unreserved?(byte) || Enum.any?(
- Pleroma.Constants.uri_path_allowed_reserved_chars, fn char ->
- char == byte end)
- end)
+ URI.char_unreserved?(byte) ||
+ Enum.any?(
+ Pleroma.Constants.uri_path_allowed_reserved_chars(),
+ fn char ->
+ char == byte
+ end
+ )
+ end)
end
defp encode_query(nil), do: nil
diff --git a/test/pleroma/http_test.exs b/test/pleroma/http_test.exs
@@ -107,4 +107,24 @@ defmodule Pleroma.HTTPTest do
assert result.status == 200
end
+
+ test "decodes URL first by default" do
+ clear_config(:test_url_encoding, true)
+
+ normal_url = "https://example.com/media/file%20with%20space.jpg?name=a+space.jpg"
+
+ result = HTTP.encode_url(normal_url)
+
+ assert result == "https://example.com/media/file%20with%20space.jpg?name=a+space.jpg"
+ end
+
+ test "doesn't decode URL first when specified" do
+ clear_config(:test_url_encoding, true)
+
+ normal_url = "https://example.com/media/file%20with%20space.jpg"
+
+ result = HTTP.encode_url(normal_url, bypass_decode: true)
+
+ assert result == "https://example.com/media/file%2520with%2520space.jpg"
+ end
end
diff --git a/test/pleroma/reverse_proxy_test.exs b/test/pleroma/reverse_proxy_test.exs
@@ -404,24 +404,20 @@ defmodule Pleroma.ReverseProxyTest do
ClientMock
|> expect(:request, fn
:get,
- "https://example.com/emoji/Pack%201/koronebless.png?foo=bar+baz",
- _headers,
- _body,
- _opts ->
+ "https://example.com/emoji/Pack%201/koronebless.png?foo=bar+baz",
+ _headers,
+ _body,
+ _opts ->
{:ok, 200, [{"content-type", "image/png"}], "It works!"}
:get,
- "https://example.com/media/foo/bar%20!$&'()*+,;=/:%20@a%20%5Bbaz%5D.mp4",
- _headers,
- _body,
- _opts ->
+ "https://example.com/media/foo/bar%20!$&'()*+,;=/:%20@a%20%5Bbaz%5D.mp4",
+ _headers,
+ _body,
+ _opts ->
{:ok, 200, [{"content-type", "video/mp4"}], "Allowed reserved chars."}
- :get,
- "https://example.com/media/unicode%20%F0%9F%99%82%20.gif",
- _headers,
- _body,
- _opts ->
+ :get, "https://example.com/media/unicode%20%F0%9F%99%82%20.gif", _headers, _body, _opts ->
{:ok, 200, [{"content-type", "image/gif"}], "Unicode emoji in path"}
end)
|> stub(:stream_body, fn _ -> :done end)
diff --git a/test/pleroma/upload_test.exs b/test/pleroma/upload_test.exs
@@ -227,20 +227,20 @@ defmodule Pleroma.UploadTest do
assert Path.basename(attachment_url["href"]) == "an%E2%80%A6%20image.jpg"
end
- test "escapes reserved uri characters" do
+ test "escapes disallowed reserved characters in uri path" do
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
file = %Plug.Upload{
content_type: "image/jpeg",
path: Path.absname("test/fixtures/image_tmp.jpg"),
- filename: ":?#[]@!$&\\'()*+,;=.jpg"
+ filename: ":?#[]@!$&'()*+,;=.jpg"
}
{:ok, data} = Upload.store(file)
[attachment_url | _] = data["url"]
assert Path.basename(attachment_url["href"]) ==
- "%3A%3F%23%5B%5D%40%21%24%26%5C%27%28%29%2A%2B%2C%3B%3D.jpg"
+ ":%3F%23%5B%5D@!$&'()*+,;=.jpg"
end
test "double %-encodes filename" do