Switch from gen_magic to majic, use Majic.Plug, remove Pleroma.MIME
This commit is contained in:
parent
ec1452fd1c
commit
f124f68205
|
@ -678,7 +678,7 @@
|
||||||
timeout: 300_000
|
timeout: 300_000
|
||||||
]
|
]
|
||||||
|
|
||||||
config :pleroma, :gen_magic_pool, size: 2
|
config :pleroma, :majic_pool, size: 2
|
||||||
|
|
||||||
config :pleroma, :restrict_unauthenticated,
|
config :pleroma, :restrict_unauthenticated,
|
||||||
timelines: %{local: false, federated: false},
|
timelines: %{local: false, federated: false},
|
||||||
|
|
|
@ -3328,14 +3328,14 @@
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
group: :pleroma,
|
group: :pleroma,
|
||||||
key: :gen_magic_pool,
|
key: :majic_pool,
|
||||||
type: :group,
|
type: :group,
|
||||||
description: "GenMagic/libmagic configuration",
|
description: "Majic/libmagic configuration",
|
||||||
children: [
|
children: [
|
||||||
%{
|
%{
|
||||||
key: :size,
|
key: :size,
|
||||||
type: :integer,
|
type: :integer,
|
||||||
description: "Number of gen_magic workers to start.",
|
description: "Number of majic workers to start.",
|
||||||
suggestions: [2]
|
suggestions: [2]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -40,7 +40,7 @@ sudo apk upgrade
|
||||||
* Install some tools, which are needed later:
|
* Install some tools, which are needed later:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo apk add git build-base
|
sudo apk add git build-base file-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
### Install Elixir and Erlang
|
### Install Elixir and Erlang
|
||||||
|
|
|
@ -27,7 +27,7 @@ sudo pacman -Syu
|
||||||
* Install some of the above mentioned programs:
|
* Install some of the above mentioned programs:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo pacman -S git base-devel elixir
|
sudo pacman -S git base-devel elixir file
|
||||||
```
|
```
|
||||||
|
|
||||||
### Install PostgreSQL
|
### Install PostgreSQL
|
||||||
|
|
|
@ -31,7 +31,7 @@ sudo apt full-upgrade
|
||||||
* Install some of the above mentioned programs:
|
* Install some of the above mentioned programs:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo apt install git build-essential postgresql postgresql-contrib
|
sudo apt install git build-essential postgresql postgresql-contrib libmagic-devel
|
||||||
```
|
```
|
||||||
|
|
||||||
### Install Elixir and Erlang
|
### Install Elixir and Erlang
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
- `erlang-nox`
|
- `erlang-nox`
|
||||||
- `git`
|
- `git`
|
||||||
- `build-essential`
|
- `build-essential`
|
||||||
|
- `libmagic-dev`
|
||||||
|
|
||||||
#### このガイドで利用している追加パッケージ
|
#### このガイドで利用している追加パッケージ
|
||||||
|
|
||||||
|
@ -32,7 +33,7 @@ sudo apt full-upgrade
|
||||||
|
|
||||||
* 上記に挙げたパッケージをインストールしておきます。
|
* 上記に挙げたパッケージをインストールしておきます。
|
||||||
```
|
```
|
||||||
sudo apt install git build-essential postgresql postgresql-contrib
|
sudo apt install git build-essential postgresql postgresql-contrib libmagic-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ Gentoo quite pointedly does not come with a cron daemon installed, and as such i
|
||||||
* Emerge all required the required and suggested software in one go:
|
* Emerge all required the required and suggested software in one go:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# emerge --ask dev-db/postgresql dev-lang/elixir dev-vcs/git www-servers/nginx app-crypt/certbot app-crypt/certbot-nginx
|
# emerge --ask dev-db/postgresql dev-lang/elixir dev-vcs/git www-servers/nginx app-crypt/certbot app-crypt/certbot-nginx sys-apps/file
|
||||||
```
|
```
|
||||||
|
|
||||||
If you would not like to install the optional packages, remove them from this line.
|
If you would not like to install the optional packages, remove them from this line.
|
||||||
|
|
|
@ -32,11 +32,11 @@ Other than things bundled in the OTP release Pleroma depends on:
|
||||||
```sh tab="Alpine"
|
```sh tab="Alpine"
|
||||||
echo "http://nl.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories
|
echo "http://nl.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories
|
||||||
apk update
|
apk update
|
||||||
apk add curl unzip ncurses postgresql postgresql-contrib nginx certbot libmagic
|
apk add curl unzip ncurses postgresql postgresql-contrib nginx certbot file-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh tab="Debian/Ubuntu"
|
```sh tab="Debian/Ubuntu"
|
||||||
apt install curl unzip libncurses5 postgresql postgresql-contrib nginx certbot libmagic
|
apt install curl unzip libncurses5 postgresql postgresql-contrib nginx certbot libmagic-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
|
@ -80,7 +80,7 @@ def start(_type, _args) do
|
||||||
[
|
[
|
||||||
Pleroma.Stats,
|
Pleroma.Stats,
|
||||||
Pleroma.JobQueueMonitor,
|
Pleroma.JobQueueMonitor,
|
||||||
Pleroma.MIME,
|
{Majic.Pool, [name: Pleroma.MajicPool, pool_size: Config.get([:majic_pool, :size], 2)]},
|
||||||
{Oban, Config.get(Oban)}
|
{Oban, Config.get(Oban)}
|
||||||
] ++
|
] ++
|
||||||
task_children(@env) ++
|
task_children(@env) ++
|
||||||
|
|
|
@ -1,80 +0,0 @@
|
||||||
# Pleroma: A lightweight social networking server
|
|
||||||
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
defmodule Pleroma.MIME do
|
|
||||||
@moduledoc """
|
|
||||||
Returns the mime-type of a binary and optionally a normalized file-name.
|
|
||||||
"""
|
|
||||||
@read_bytes 35
|
|
||||||
@pool __MODULE__.GenMagicPool
|
|
||||||
|
|
||||||
def child_spec(_) do
|
|
||||||
pool_size = Pleroma.Config.get!([:gen_magic_pool, :size])
|
|
||||||
name = @pool
|
|
||||||
|
|
||||||
%{
|
|
||||||
id: __MODULE__,
|
|
||||||
start: {GenMagic.Pool, :start_link, [[name: name, pool_size: pool_size]]},
|
|
||||||
type: :worker,
|
|
||||||
restart: :permanent,
|
|
||||||
shutdown: 500
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
@spec file_mime_type(String.t(), String.t()) ::
|
|
||||||
{:ok, content_type :: String.t(), filename :: String.t()} | {:error, any()} | :error
|
|
||||||
def file_mime_type(path, filename) do
|
|
||||||
with {:ok, content_type} <- file_mime_type(path),
|
|
||||||
filename <- fix_extension(filename, content_type) do
|
|
||||||
{:ok, content_type, filename}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@spec file_mime_type(String.t()) :: {:ok, String.t()} | {:error, any()} | :error
|
|
||||||
def file_mime_type(filename) do
|
|
||||||
case GenMagic.Pool.perform(@pool, filename) do
|
|
||||||
{:ok, %GenMagic.Result{mime_type: content_type}} -> {:ok, content_type}
|
|
||||||
error -> error
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def bin_mime_type(binary, filename) do
|
|
||||||
with {:ok, content_type} <- bin_mime_type(binary),
|
|
||||||
filename <- fix_extension(filename, content_type) do
|
|
||||||
{:ok, content_type, filename}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@spec bin_mime_type(binary()) :: {:ok, String.t()} | :error
|
|
||||||
def bin_mime_type(<<head::binary-size(@read_bytes), _::binary>>) do
|
|
||||||
case GenMagic.Pool.perform(@pool, {:bytes, head}) do
|
|
||||||
{:ok, %GenMagic.Result{mime_type: content_type}} -> {:ok, content_type}
|
|
||||||
error -> error
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def bin_mime_type(_), do: :error
|
|
||||||
|
|
||||||
defp fix_extension(filename, content_type) do
|
|
||||||
parts = String.split(filename, ".")
|
|
||||||
|
|
||||||
new_filename =
|
|
||||||
if length(parts) > 1 do
|
|
||||||
Enum.drop(parts, -1) |> Enum.join(".")
|
|
||||||
else
|
|
||||||
Enum.join(parts)
|
|
||||||
end
|
|
||||||
|
|
||||||
cond do
|
|
||||||
content_type == "application/octet-stream" ->
|
|
||||||
filename
|
|
||||||
|
|
||||||
ext = List.first(MIME.extensions(content_type)) ->
|
|
||||||
new_filename <> "." <> ext
|
|
||||||
|
|
||||||
true ->
|
|
||||||
Enum.join([new_filename, String.split(content_type, "/") |> List.last()], ".")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -57,6 +57,7 @@ defmodule Pleroma.Upload do
|
||||||
defstruct [:id, :name, :tempfile, :content_type, :path]
|
defstruct [:id, :name, :tempfile, :content_type, :path]
|
||||||
|
|
||||||
@spec store(source, options :: [option()]) :: {:ok, Map.t()} | {:error, any()}
|
@spec store(source, options :: [option()]) :: {:ok, Map.t()} | {:error, any()}
|
||||||
|
@doc "Store a file. If using a `Plug.Upload{}` as the source, be sure to use `Majic.Plug` to ensure its content_type and filename is correct."
|
||||||
def store(upload, opts \\ []) do
|
def store(upload, opts \\ []) do
|
||||||
opts = get_opts(opts)
|
opts = get_opts(opts)
|
||||||
|
|
||||||
|
@ -123,14 +124,13 @@ defp get_opts(opts) do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp prepare_upload(%Plug.Upload{} = file, opts) do
|
defp prepare_upload(%Plug.Upload{} = file, opts) do
|
||||||
with :ok <- check_file_size(file.path, opts.size_limit),
|
with :ok <- check_file_size(file.path, opts.size_limit) do
|
||||||
{:ok, content_type, name} <- Pleroma.MIME.file_mime_type(file.path, file.filename) do
|
|
||||||
{:ok,
|
{:ok,
|
||||||
%__MODULE__{
|
%__MODULE__{
|
||||||
id: UUID.generate(),
|
id: UUID.generate(),
|
||||||
name: name,
|
name: file.filename,
|
||||||
tempfile: file.path,
|
tempfile: file.path,
|
||||||
content_type: content_type
|
content_type: file.content_type
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -138,16 +138,17 @@ defp prepare_upload(%Plug.Upload{} = file, opts) do
|
||||||
defp prepare_upload(%{img: "data:image/" <> image_data}, opts) do
|
defp prepare_upload(%{img: "data:image/" <> image_data}, opts) do
|
||||||
parsed = Regex.named_captures(~r/(?<filetype>jpeg|png|gif);base64,(?<data>.*)/, image_data)
|
parsed = Regex.named_captures(~r/(?<filetype>jpeg|png|gif);base64,(?<data>.*)/, image_data)
|
||||||
data = Base.decode64!(parsed["data"], ignore: :whitespace)
|
data = Base.decode64!(parsed["data"], ignore: :whitespace)
|
||||||
hash = String.downcase(Base.encode16(:crypto.hash(:sha256, data)))
|
hash = Base.encode16(:crypto.hash(:sha256, data), lower: true)
|
||||||
|
|
||||||
with :ok <- check_binary_size(data, opts.size_limit),
|
with :ok <- check_binary_size(data, opts.size_limit),
|
||||||
tmp_path <- tempfile_for_image(data),
|
tmp_path <- tempfile_for_image(data),
|
||||||
{:ok, content_type, name} <-
|
{:ok, %{mime_type: content_type}} <-
|
||||||
Pleroma.MIME.bin_mime_type(data, hash <> "." <> parsed["filetype"]) do
|
Majic.perform({:bytes, data}, pool: Pleroma.MajicPool),
|
||||||
|
[ext | _] <- MIME.extensions(content_type) do
|
||||||
{:ok,
|
{:ok,
|
||||||
%__MODULE__{
|
%__MODULE__{
|
||||||
id: UUID.generate(),
|
id: UUID.generate(),
|
||||||
name: name,
|
name: hash <> "." <> ext,
|
||||||
tempfile: tmp_path,
|
tempfile: tmp_path,
|
||||||
content_type: content_type
|
content_type: content_type
|
||||||
}}
|
}}
|
||||||
|
@ -156,7 +157,7 @@ defp prepare_upload(%{img: "data:image/" <> image_data}, opts) do
|
||||||
|
|
||||||
# For Mix.Tasks.MigrateLocalUploads
|
# For Mix.Tasks.MigrateLocalUploads
|
||||||
defp prepare_upload(%__MODULE__{tempfile: path} = upload, _opts) do
|
defp prepare_upload(%__MODULE__{tempfile: path} = upload, _opts) do
|
||||||
with {:ok, content_type} <- Pleroma.MIME.file_mime_type(path) do
|
with {:ok, %{mime_type: content_type}} <- Majic.perform(path, pool: Pleroma.MajicPool) do
|
||||||
{:ok, %__MODULE__{upload | content_type: content_type}}
|
{:ok, %__MODULE__{upload | content_type: content_type}}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -45,6 +45,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
||||||
when action in [:read_inbox, :update_outbox, :whoami, :upload_media]
|
when action in [:read_inbox, :update_outbox, :whoami, :upload_media]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
plug(Majic.Plug, [pool: Pleroma.MajicPool] when action in [:upload_media])
|
||||||
|
|
||||||
plug(
|
plug(
|
||||||
Pleroma.Plugs.Cache,
|
Pleroma.Plugs.Cache,
|
||||||
[query_params: false, tracking_fun: &__MODULE__.track_object_fetch/2]
|
[query_params: false, tracking_fun: &__MODULE__.track_object_fetch/2]
|
||||||
|
|
|
@ -16,6 +16,7 @@ defmodule Pleroma.Web.MastodonAPI.MediaController do
|
||||||
|
|
||||||
plug(OAuthScopesPlug, %{scopes: ["read:media"]} when action == :show)
|
plug(OAuthScopesPlug, %{scopes: ["read:media"]} when action == :show)
|
||||||
plug(OAuthScopesPlug, %{scopes: ["write:media"]} when action != :show)
|
plug(OAuthScopesPlug, %{scopes: ["write:media"]} when action != :show)
|
||||||
|
plug(Majic.Plug, [pool: Pleroma.MajicPool] when action in [:create, :create2])
|
||||||
|
|
||||||
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.MediaOperation
|
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.MediaOperation
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,11 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
|
||||||
plug(:assign_account_by_id when action in [:favourites, :subscribe, :unsubscribe])
|
plug(:assign_account_by_id when action in [:favourites, :subscribe, :unsubscribe])
|
||||||
plug(:put_view, Pleroma.Web.MastodonAPI.AccountView)
|
plug(:put_view, Pleroma.Web.MastodonAPI.AccountView)
|
||||||
|
|
||||||
|
plug(
|
||||||
|
Majic.Plug,
|
||||||
|
[pool: Pleroma.MajicPool] when action in [:update_avatar, :update_background, :update_banner]
|
||||||
|
)
|
||||||
|
|
||||||
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaAccountOperation
|
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaAccountOperation
|
||||||
|
|
||||||
@doc "POST /api/v1/pleroma/accounts/confirmation_resend"
|
@doc "POST /api/v1/pleroma/accounts/confirmation_resend"
|
||||||
|
|
|
@ -12,6 +12,7 @@ defmodule Pleroma.Web.PleromaAPI.MascotController do
|
||||||
plug(Pleroma.Web.ApiSpec.CastAndValidate)
|
plug(Pleroma.Web.ApiSpec.CastAndValidate)
|
||||||
plug(OAuthScopesPlug, %{scopes: ["read:accounts"]} when action == :show)
|
plug(OAuthScopesPlug, %{scopes: ["read:accounts"]} when action == :show)
|
||||||
plug(OAuthScopesPlug, %{scopes: ["write:accounts"]} when action != :show)
|
plug(OAuthScopesPlug, %{scopes: ["write:accounts"]} when action != :show)
|
||||||
|
plug(Majic.Plug, [pool: Pleroma.MajicPool] when action in [:update])
|
||||||
|
|
||||||
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaMascotOperation
|
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaMascotOperation
|
||||||
|
|
||||||
|
@ -22,14 +23,15 @@ def show(%{assigns: %{user: user}} = conn, _params) do
|
||||||
|
|
||||||
@doc "PUT /api/v1/pleroma/mascot"
|
@doc "PUT /api/v1/pleroma/mascot"
|
||||||
def update(%{assigns: %{user: user}, body_params: %{file: file}} = conn, _) do
|
def update(%{assigns: %{user: user}, body_params: %{file: file}} = conn, _) do
|
||||||
with {:ok, object} <- ActivityPub.upload(file, actor: User.ap_id(user)),
|
with {:content_type, "image" <> _} <- {:content_type, file.content_type},
|
||||||
# Reject if not an image
|
{:ok, object} <- ActivityPub.upload(file, actor: User.ap_id(user)) do
|
||||||
%{type: "image"} = attachment <- render_attachment(object) do
|
attachment = render_attachment(object)
|
||||||
{:ok, _user} = User.mascot_update(user, attachment)
|
{:ok, _user} = User.mascot_update(user, attachment)
|
||||||
|
|
||||||
json(conn, attachment)
|
json(conn, attachment)
|
||||||
else
|
else
|
||||||
%{type: _} -> render_error(conn, :unsupported_media_type, "mascots can only be images")
|
{:content_type, _} ->
|
||||||
|
render_error(conn, :unsupported_media_type, "mascots can only be images")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
2
mix.exs
2
mix.exs
|
@ -197,7 +197,7 @@ defp deps do
|
||||||
ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"},
|
ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"},
|
||||||
{:mox, "~> 0.5", only: :test},
|
{:mox, "~> 0.5", only: :test},
|
||||||
{:restarter, path: "./restarter"},
|
{:restarter, path: "./restarter"},
|
||||||
{:gen_magic, git: "https://github.com/hrefhref/gen_magic", branch: "develop"},
|
{:majic, git: "https://github.com/hrefhref/majic", branch: "develop"},
|
||||||
{:open_api_spex,
|
{:open_api_spex,
|
||||||
git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git",
|
git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git",
|
||||||
ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"}
|
ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"}
|
||||||
|
|
1
mix.lock
1
mix.lock
|
@ -63,6 +63,7 @@
|
||||||
"jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
|
"jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
|
||||||
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
|
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
|
||||||
"libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
|
"libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"},
|
||||||
|
"majic": {:git, "https://github.com/hrefhref/majic", "1c723300364cd014866c6c1bd5260e03965865a2", [branch: "develop"]},
|
||||||
"makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "a10c6eb62cca416019663129699769f0c2ccf39428b3bb3c0cb38c718a0c186d"},
|
"makeup": {:hex, :makeup, "1.0.0", "671df94cf5a594b739ce03b0d0316aa64312cee2574b6a44becb83cd90fb05dc", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "a10c6eb62cca416019663129699769f0c2ccf39428b3bb3c0cb38c718a0c186d"},
|
||||||
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"},
|
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"},
|
||||||
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
|
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
|
||||||
|
|
|
@ -11,7 +11,7 @@ defmodule Pleroma.UploadTest do
|
||||||
alias Pleroma.Uploaders.Uploader
|
alias Pleroma.Uploaders.Uploader
|
||||||
|
|
||||||
@upload_file %Plug.Upload{
|
@upload_file %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
filename: "image.jpg"
|
filename: "image.jpg"
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ test "returns a media url" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
filename: "image.jpg"
|
filename: "image.jpg"
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ test "copies the file to the configured folder with deduping" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
filename: "an [image.jpg"
|
filename: "an [image.jpg"
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,7 @@ test "copies the file to the configured folder without deduping" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
filename: "an [image.jpg"
|
filename: "an [image.jpg"
|
||||||
}
|
}
|
||||||
|
@ -152,63 +152,31 @@ test "copies the file to the configured folder without deduping" do
|
||||||
assert data["name"] == "an [image.jpg"
|
assert data["name"] == "an [image.jpg"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "fixes incorrect content type" do
|
test "fixes incorrect content type when base64 is given" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
params = %{
|
||||||
|
img: "data:image/png;base64,#{Base.encode64(File.read!("test/fixtures/image.jpg"))}"
|
||||||
file = %Plug.Upload{
|
|
||||||
content_type: "application/octet-stream",
|
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
|
||||||
filename: "an [image.jpg"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, data} = Upload.store(file, filters: [Pleroma.Upload.Filter.Dedupe])
|
{:ok, data} = Upload.store(params)
|
||||||
assert hd(data["url"])["mediaType"] == "image/jpeg"
|
assert hd(data["url"])["mediaType"] == "image/jpeg"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "adds missing extension" do
|
test "adds extension when base64 is given" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
file = %Plug.Upload{
|
params = %{
|
||||||
content_type: "image/jpg",
|
img: "data:image/png;base64,#{Base.encode64(File.read!("test/fixtures/image.jpg"))}"
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
|
||||||
filename: "an [image"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, data} = Upload.store(file)
|
{:ok, data} = Upload.store(params)
|
||||||
assert data["name"] == "an [image.jpg"
|
assert String.ends_with?(data["name"], ".jpg")
|
||||||
end
|
|
||||||
|
|
||||||
test "fixes incorrect file extension" 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.blah"
|
|
||||||
}
|
|
||||||
|
|
||||||
{:ok, data} = Upload.store(file)
|
|
||||||
assert data["name"] == "an [image.jpg"
|
|
||||||
end
|
|
||||||
|
|
||||||
test "don't modify filename of an unknown type" do
|
|
||||||
File.cp("test/fixtures/test.txt", "test/fixtures/test_tmp.txt")
|
|
||||||
|
|
||||||
file = %Plug.Upload{
|
|
||||||
content_type: "text/plain",
|
|
||||||
path: Path.absname("test/fixtures/test_tmp.txt"),
|
|
||||||
filename: "test.txt"
|
|
||||||
}
|
|
||||||
|
|
||||||
{:ok, data} = Upload.store(file)
|
|
||||||
assert data["name"] == "test.txt"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "copies the file to the configured folder with anonymizing filename" do
|
test "copies the file to the configured folder with anonymizing filename" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
filename: "an [image.jpg"
|
filename: "an [image.jpg"
|
||||||
}
|
}
|
||||||
|
@ -222,7 +190,7 @@ test "escapes invalid characters in url" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
filename: "an… image.jpg"
|
filename: "an… image.jpg"
|
||||||
}
|
}
|
||||||
|
@ -237,7 +205,7 @@ test "escapes reserved uri characters" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
filename: ":?#[]@!$&\\'()*+,;=.jpg"
|
filename: ":?#[]@!$&\\'()*+,;=.jpg"
|
||||||
}
|
}
|
||||||
|
@ -259,7 +227,7 @@ test "returns a media url with configured base_url" do
|
||||||
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
File.cp!("test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg")
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
filename: "image.jpg"
|
filename: "image.jpg"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1428,9 +1428,9 @@ test "POST /api/ap/upload_media", %{conn: conn} do
|
||||||
desc = "Description of the image"
|
desc = "Description of the image"
|
||||||
|
|
||||||
image = %Plug.Upload{
|
image = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "bad/content-type",
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
path: Path.absname("test/fixtures/image.jpg"),
|
||||||
filename: "an_image.jpg"
|
filename: "an_image.png"
|
||||||
}
|
}
|
||||||
|
|
||||||
object =
|
object =
|
||||||
|
@ -1445,6 +1445,7 @@ test "POST /api/ap/upload_media", %{conn: conn} do
|
||||||
assert [%{"href" => object_href, "mediaType" => object_mediatype}] = object["url"]
|
assert [%{"href" => object_href, "mediaType" => object_mediatype}] = object["url"]
|
||||||
assert is_binary(object_href)
|
assert is_binary(object_href)
|
||||||
assert object_mediatype == "image/jpeg"
|
assert object_mediatype == "image/jpeg"
|
||||||
|
assert String.ends_with?(object_href, ".jpg")
|
||||||
|
|
||||||
activity_request = %{
|
activity_request = %{
|
||||||
"@context" => "https://www.w3.org/ns/activitystreams",
|
"@context" => "https://www.w3.org/ns/activitystreams",
|
||||||
|
|
|
@ -58,7 +58,7 @@ test "it handles our own uploads" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpeg",
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
path: Path.absname("test/fixtures/image.jpg"),
|
||||||
filename: "an_image.jpg"
|
filename: "an_image.jpg"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue