Add some tests
authorrinpatch <rinpatch@sdf.org>
Thu, 14 Mar 2019 19:02:48 +0000 (22:02 +0300)
committerrinpatch <rinpatch@sdf.org>
Thu, 14 Mar 2019 19:02:48 +0000 (22:02 +0300)
config/config.exs
config/test.exs
docs/config.md
lib/pleroma/plugs/uploaded_media.ex
lib/pleroma/upload.ex
test/plugs/uploaded_media_plug_test.exs [new file with mode: 0644]
test/upload_test.exs

index cd4c8e5627235b31bb17479aaf3a648a6086ebfc..f889e3259f4568384982a460afcbfd54f4aa5e4c 100644 (file)
@@ -35,6 +35,7 @@ config :pleroma, Pleroma.Captcha.Kocaptcha, endpoint: "https://captcha.kotobank.
 config :pleroma, Pleroma.Upload,
   uploader: Pleroma.Uploaders.Local,
   filters: [],
+  link_name: true,
   proxy_remote: false,
   proxy_opts: [
     redirect_on_failure: false,
index 6dfa698c834e86a35b37c5df899e69c1ba129f08..a3f36c9e169ff142ca00e14a588de81e8eb27712 100644 (file)
@@ -17,6 +17,8 @@ config :pleroma, Pleroma.Captcha,
 # Print only warnings and errors during test
 config :logger, level: :warn
 
+config :pleroma, Pleroma.Upload, link_name: false
+
 config :pleroma, Pleroma.Uploaders.Local, uploads: "test/uploads"
 
 config :pleroma, Pleroma.Mailer, adapter: Swoosh.Adapters.Test
index a09ea95f3def569fffa666e27f30c95e84b4e98d..e34ffe980442cfe14fe267ba26714474e23e9f32 100644 (file)
@@ -6,6 +6,7 @@ If you run Pleroma with ``MIX_ENV=prod`` the file is ``prod.secret.exs``, otherw
 ## Pleroma.Upload
 * `uploader`: Select which `Pleroma.Uploaders` to use
 * `filters`: List of `Pleroma.Upload.Filter` to use.
+* `link_name`: When enabled Pleroma will add a `name` parameter to the url of the upload, for example `https://instance.tld/media/corndog.png?name=corndog.png`. This is needed to provide the correct filename in Content-Disposition headers when using filters like `Pleroma.Upload.Filter.Dedupe`
 * `base_url`: The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host.
 * `proxy_remote`: If you\'re using a remote uploader, Pleroma will proxy media requests instead of redirecting to it.
 * `proxy_opts`: Proxy options, see `Pleroma.ReverseProxy` documentation.
index bc913f4087e8ddc61ca74ed4b0f4a15c0b2fa48f..fd77b8d8f30500dac7ee7c868bc69be3924c28b0 100644 (file)
@@ -30,7 +30,7 @@ defmodule Pleroma.Plugs.UploadedMedia do
           name = String.replace(name, "\"", "\\\"")
 
           conn
-          |> put_resp_header("Content-Disposition", "filename=\"#{name}\"")
+          |> put_resp_header("content-disposition", "filename=\"#{name}\"")
 
         conn ->
           conn
index ae461d434532e099976d6c28f724181adc017a93..f7233493024259489c44a78826985442f111a19c 100644 (file)
@@ -70,7 +70,7 @@ defmodule Pleroma.Upload do
            %{
              "type" => "Link",
              "mediaType" => upload.content_type,
-             "href" => url_from_spec(opts.base_url, url_spec, upload.name)
+             "href" => url_from_spec(upload, opts.base_url, url_spec)
            }
          ],
          "name" => Map.get(opts, :description) || upload.name
@@ -219,12 +219,18 @@ defmodule Pleroma.Upload do
     tmp_path
   end
 
-  defp url_from_spec(base_url, {:file, path}, name) do
-    path = URI.encode(path, &char_unescaped?/1) <> "?name=#{URI.encode(name, &char_unescaped?/1)}"
+  defp url_from_spec(%__MODULE__{name: name}, base_url, {:file, path}) do
+    path =
+      URI.encode(path, &char_unescaped?/1) <>
+        if Pleroma.Config.get([__MODULE__, :link_name], false) do
+          "?name=#{URI.encode(name, &char_unescaped?/1)}"
+        else
+          ""
+        end
 
     [base_url, "media", path]
     |> Path.join()
   end
 
-  defp url_from_spec(_base_url, {:url, url}, _name), do: url
+  defp url_from_spec(_upload, _base_url, {:url, url}), do: url
 end
diff --git a/test/plugs/uploaded_media_plug_test.exs b/test/plugs/uploaded_media_plug_test.exs
new file mode 100644 (file)
index 0000000..414cf91
--- /dev/null
@@ -0,0 +1,40 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.UploadedMediaPlugTest do
+  use Pleroma.Web.ConnCase
+  alias Pleroma.Upload
+
+  setup_all 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: "nice_tf.jpg"
+    }
+
+    {:ok, data} = Upload.store(file)
+    [%{"href" => attachment_url} | _] = data["url"]
+    [attachment_url: attachment_url]
+  end
+
+  test "does not send Content-Disposition header when name param is not set", %{
+    attachment_url: attachment_url
+  } do
+    conn = get(build_conn(), attachment_url)
+    refute Enum.any?(conn.resp_headers, &(elem(&1, 0) == "content-disposition"))
+  end
+
+  test "sends Content-Disposition header when name param is set", %{
+    attachment_url: attachment_url
+  } do
+    conn = get(build_conn(), attachment_url <> "?name=\"cofe\".gif")
+
+    assert Enum.any?(
+             conn.resp_headers,
+             &(&1 == {"content-disposition", "filename=\"\\\"cofe\\\".gif\""})
+           )
+  end
+end
index c38280d4c85c72443800c5e9dd07c5e94df852b8..770226478d18b4b799b2404cc3878e6d8f03ed5d 100644 (file)
@@ -56,7 +56,7 @@ defmodule Pleroma.UploadTest do
 
       assert List.first(data["url"])["href"] ==
                Pleroma.Web.base_url() <>
-                 "/media/e7a6d0cf595bff76f14c9a98b6c199539559e8b844e02e51e5efcfd1f614a2df.jpg?name=an%20%5Bimage.jpg"
+                 "/media/e7a6d0cf595bff76f14c9a98b6c199539559e8b844e02e51e5efcfd1f614a2df.jpg"
     end
 
     test "copies the file to the configured folder without deduping" do
@@ -151,7 +151,7 @@ defmodule Pleroma.UploadTest do
       [attachment_url | _] = data["url"]
 
       assert Path.basename(attachment_url["href"]) ==
-               "an%E2%80%A6%20image.jpg?name=an%E2%80%A6%20image.jpg"
+               "an%E2%80%A6%20image.jpg"
     end
 
     test "escapes reserved uri characters" do
@@ -167,7 +167,7 @@ defmodule Pleroma.UploadTest do
       [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?name=%3A%3F%23%5B%5D%40%21%24%26%5C%27%28%29%2A%2B%2C%3B%3D.jpg"
+               "%3A%3F%23%5B%5D%40%21%24%26%5C%27%28%29%2A%2B%2C%3B%3D.jpg"
     end
   end
 end