make sure the url used by proxy is same as origin url
authorSachin Joshi <satchin.joshi@gmail.com>
Sun, 7 Jul 2019 08:28:40 +0000 (14:13 +0545)
committerSachin Joshi <satchin.joshi@gmail.com>
Sun, 7 Jul 2019 08:28:40 +0000 (14:13 +0545)
encoding or decoding it breaks some of the signed url

lib/pleroma/web/media_proxy/media_proxy.ex
test/media_proxy_test.exs

index cee6d8481a33942d1d41d51a0cb16ba6fb98ac0b..dd8888a021635357b4fe88c1bb2748517c7c6062 100644 (file)
@@ -33,20 +33,7 @@ defmodule Pleroma.Web.MediaProxy do
 
   def encode_url(url) do
     secret = Pleroma.Config.get([Pleroma.Web.Endpoint, :secret_key_base])
-
-    # Must preserve `%2F` for compatibility with S3
-    # https://git.pleroma.social/pleroma/pleroma/issues/580
-    replacement = get_replacement(url, ":2F:")
-
-    # The URL is url-decoded and encoded again to ensure it is correctly encoded and not twice.
-    base64 =
-      url
-      |> String.replace("%2F", replacement)
-      |> URI.decode()
-      |> URI.encode()
-      |> String.replace(replacement, "%2F")
-      |> Base.url_encode64(@base64_opts)
-
+    base64 = Base.url_encode64(url, @base64_opts)
     sig = :crypto.hmac(:sha, secret, base64)
     sig64 = sig |> Base.url_encode64(@base64_opts)
 
@@ -80,12 +67,4 @@ defmodule Pleroma.Web.MediaProxy do
     |> Enum.filter(fn value -> value end)
     |> Path.join()
   end
-
-  defp get_replacement(url, replacement) do
-    if String.contains?(url, replacement) do
-      get_replacement(url, replacement <> replacement)
-    else
-      replacement
-    end
-  end
 end
index b23aeb88be580c9642dd6675a55ded62d1af951a..cd1cbd202a89dfd2bd3a98d35e660407a8dd2bef 100644 (file)
@@ -70,9 +70,12 @@ defmodule Pleroma.MediaProxyTest do
       assert decode_result(encoded) == url
     end
 
-    test "ensures urls are url-encoded" do
+    # Some of the signed url expect the special character in the url to be same
+    # for the proxy to work.
+    # Issue https://git.pleroma.social/pleroma/pleroma/issues/1055
+    test "ensures urls are maintained (character are not encoded or decoded)" do
       assert decode_result(url("https://pleroma.social/Hello world.jpg")) ==
-               "https://pleroma.social/Hello%20world.jpg"
+               "https://pleroma.social/Hello world.jpg"
 
       assert decode_result(url("https://pleroma.social/Hello%20world.jpg")) ==
                "https://pleroma.social/Hello%20world.jpg"