Merge branch 'fix/filename-mangling' into 'develop'
Stop mangling filenames and enable dedupe by default Closes #715 See merge request pleroma/pleroma!927
This commit is contained in:
commit
7ecc201029
|
@ -35,6 +35,7 @@
|
||||||
config :pleroma, Pleroma.Upload,
|
config :pleroma, Pleroma.Upload,
|
||||||
uploader: Pleroma.Uploaders.Local,
|
uploader: Pleroma.Uploaders.Local,
|
||||||
filters: [],
|
filters: [],
|
||||||
|
link_name: true,
|
||||||
proxy_remote: false,
|
proxy_remote: false,
|
||||||
proxy_opts: [
|
proxy_opts: [
|
||||||
redirect_on_failure: false,
|
redirect_on_failure: false,
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
# Print only warnings and errors during test
|
# Print only warnings and errors during test
|
||||||
config :logger, level: :warn
|
config :logger, level: :warn
|
||||||
|
|
||||||
|
config :pleroma, Pleroma.Upload, link_name: false
|
||||||
|
|
||||||
config :pleroma, Pleroma.Uploaders.Local, uploads: "test/uploads"
|
config :pleroma, Pleroma.Uploaders.Local, uploads: "test/uploads"
|
||||||
|
|
||||||
config :pleroma, Pleroma.Mailer, adapter: Swoosh.Adapters.Test
|
config :pleroma, Pleroma.Mailer, adapter: Swoosh.Adapters.Test
|
||||||
|
|
|
@ -6,6 +6,7 @@ If you run Pleroma with ``MIX_ENV=prod`` the file is ``prod.secret.exs``, otherw
|
||||||
## Pleroma.Upload
|
## Pleroma.Upload
|
||||||
* `uploader`: Select which `Pleroma.Uploaders` to use
|
* `uploader`: Select which `Pleroma.Uploaders` to use
|
||||||
* `filters`: List of `Pleroma.Upload.Filter` 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.
|
* `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_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.
|
* `proxy_opts`: Proxy options, see `Pleroma.ReverseProxy` documentation.
|
||||||
|
|
|
@ -24,6 +24,18 @@ def init(_opts) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) do
|
def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) do
|
||||||
|
conn =
|
||||||
|
case fetch_query_params(conn) do
|
||||||
|
%{query_params: %{"name" => name}} = conn ->
|
||||||
|
name = String.replace(name, "\"", "\\\"")
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> put_resp_header("content-disposition", "filename=\"#{name}\"")
|
||||||
|
|
||||||
|
conn ->
|
||||||
|
conn
|
||||||
|
end
|
||||||
|
|
||||||
config = Pleroma.Config.get([Pleroma.Upload])
|
config = Pleroma.Config.get([Pleroma.Upload])
|
||||||
|
|
||||||
with uploader <- Keyword.fetch!(config, :uploader),
|
with uploader <- Keyword.fetch!(config, :uploader),
|
||||||
|
|
|
@ -70,7 +70,7 @@ def store(upload, opts \\ []) do
|
||||||
%{
|
%{
|
||||||
"type" => "Link",
|
"type" => "Link",
|
||||||
"mediaType" => upload.content_type,
|
"mediaType" => upload.content_type,
|
||||||
"href" => url_from_spec(opts.base_url, url_spec)
|
"href" => url_from_spec(upload, opts.base_url, url_spec)
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"name" => Map.get(opts, :description) || upload.name
|
"name" => Map.get(opts, :description) || upload.name
|
||||||
|
@ -219,14 +219,18 @@ defp tempfile_for_image(data) do
|
||||||
tmp_path
|
tmp_path
|
||||||
end
|
end
|
||||||
|
|
||||||
defp url_from_spec(base_url, {:file, path}) do
|
defp url_from_spec(%__MODULE__{name: name}, base_url, {:file, path}) do
|
||||||
path =
|
path =
|
||||||
path
|
URI.encode(path, &char_unescaped?/1) <>
|
||||||
|> URI.encode(&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]
|
[base_url, "media", path]
|
||||||
|> Path.join()
|
|> Path.join()
|
||||||
end
|
end
|
||||||
|
|
||||||
defp url_from_spec(_base_url, {:url, url}), do: url
|
defp url_from_spec(_upload, _base_url, {:url, url}), do: url
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
# 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
|
||||||
|
|
||||||
|
defp upload_file(context) do
|
||||||
|
Pleroma.DataCase.ensure_local_uploader(context)
|
||||||
|
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
|
||||||
|
|
||||||
|
setup_all :upload_file
|
||||||
|
|
||||||
|
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
|
|
@ -150,7 +150,8 @@ test "escapes invalid characters in url" do
|
||||||
{:ok, data} = Upload.store(file)
|
{:ok, data} = Upload.store(file)
|
||||||
[attachment_url | _] = data["url"]
|
[attachment_url | _] = data["url"]
|
||||||
|
|
||||||
assert Path.basename(attachment_url["href"]) == "an%E2%80%A6%20image.jpg"
|
assert Path.basename(attachment_url["href"]) ==
|
||||||
|
"an%E2%80%A6%20image.jpg"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "escapes reserved uri characters" do
|
test "escapes reserved uri characters" do
|
||||||
|
|
Loading…
Reference in New Issue