From e3eb75bd234c8e21ff937d4f9b2a4a1328007e32 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Tue, 15 Jan 2019 07:40:00 +0100
Subject: [PATCH] Upload: Fix uploading with a ? in the filename

---
 lib/pleroma/upload.ex |  7 ++++++-
 test/upload_test.exs  | 15 +++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex
index 185ba25fa..1d8b073af 100644
--- a/lib/pleroma/upload.ex
+++ b/lib/pleroma/upload.ex
@@ -215,7 +215,12 @@ defmodule Pleroma.Upload do
   end
 
   defp url_from_spec(base_url, {:file, path}) do
-    [base_url, "media", URI.encode(path)]
+    path =
+      path
+      |> URI.encode()
+      |> String.replace("?", "%3F")
+
+    [base_url, "media", path]
     |> Path.join()
   end
 
diff --git a/test/upload_test.exs b/test/upload_test.exs
index bda503361..ffef74270 100644
--- a/test/upload_test.exs
+++ b/test/upload_test.exs
@@ -152,5 +152,20 @@ defmodule Pleroma.UploadTest do
 
       assert Path.basename(attachment_url["href"]) == "an%E2%80%A6%20image.jpg"
     end
+
+    test "replaces ? (question-mark) to %3f" do
+      File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
+
+      file = %Plug.Upload{
+        content_type: "image/jpg",
+        path: Path.absname("test/fixtures/image_tmp.jpg"),
+        filename: "an?image.jpg"
+      }
+
+      {:ok, data} = Upload.store(file)
+      [attachment_url | _] = data["url"]
+
+      assert Path.basename(attachment_url["href"]) == "an%3Fimage.jpg"
+    end
   end
 end
-- 
2.49.0