Revert "Merge branch 'feature/attachments-cleanup' into 'develop'"
This reverts commita431e8c9f7
, reversing changes made to8b4d81609d
.
This commit is contained in:
parent
946de2299c
commit
62b5da21e7
@ -12,7 +12,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- **Breaking:** Pleroma won't start if it detects unapplied migrations
|
- **Breaking:** Pleroma won't start if it detects unapplied migrations
|
||||||
- **Breaking:** attachments are removed along with statuses. Does not affect duplicate files and attachments without status.
|
|
||||||
- **Breaking:** Elixir >=1.8 is now required (was >= 1.7)
|
- **Breaking:** Elixir >=1.8 is now required (was >= 1.7)
|
||||||
- **Breaking:** attachment links (`config :pleroma, :instance, no_attachment_links` and `config :pleroma, Pleroma.Upload, link_name`) disabled by default
|
- **Breaking:** attachment links (`config :pleroma, :instance, no_attachment_links` and `config :pleroma, Pleroma.Upload, link_name`) disabled by default
|
||||||
- **Breaking:** OAuth: defaulted `[:auth, :enforce_oauth_admin_scope_usage]` setting to `true` which demands `admin` OAuth scope to perform admin actions (in addition to `is_admin` flag on User); make sure to use bundled or newer versions of AdminFE & PleromaFE to access admin / moderator features.
|
- **Breaking:** OAuth: defaulted `[:auth, :enforce_oauth_admin_scope_usage]` setting to `true` which demands `admin` OAuth scope to perform admin actions (in addition to `is_admin` flag on User); make sure to use bundled or newer versions of AdminFE & PleromaFE to access admin / moderator features.
|
||||||
|
@ -83,20 +83,6 @@ defmodule Pleroma.Object do
|
|||||||
Repo.one(from(object in Object, where: fragment("(?)->>'id' = ?", object.data, ^ap_id)))
|
Repo.one(from(object in Object, where: fragment("(?)->>'id' = ?", object.data, ^ap_id)))
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc """
|
|
||||||
Get a single attachment by it's name and href
|
|
||||||
"""
|
|
||||||
@spec get_attachment_by_name_and_href(String.t(), String.t()) :: Object.t() | nil
|
|
||||||
def get_attachment_by_name_and_href(name, href) do
|
|
||||||
query =
|
|
||||||
from(o in Object,
|
|
||||||
where: fragment("(?)->>'name' = ?", o.data, ^name),
|
|
||||||
where: fragment("(?)->>'href' = ?", o.data, ^href)
|
|
||||||
)
|
|
||||||
|
|
||||||
Repo.one(query)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp warn_on_no_object_preloaded(ap_id) do
|
defp warn_on_no_object_preloaded(ap_id) do
|
||||||
"Object.normalize() called without preloaded object (#{inspect(ap_id)}). Consider preloading the object"
|
"Object.normalize() called without preloaded object (#{inspect(ap_id)}). Consider preloading the object"
|
||||||
|> Logger.debug()
|
|> Logger.debug()
|
||||||
|
@ -5,12 +5,10 @@
|
|||||||
defmodule Pleroma.Uploaders.Local do
|
defmodule Pleroma.Uploaders.Local do
|
||||||
@behaviour Pleroma.Uploaders.Uploader
|
@behaviour Pleroma.Uploaders.Uploader
|
||||||
|
|
||||||
@impl true
|
|
||||||
def get_file(_) do
|
def get_file(_) do
|
||||||
{:ok, {:static_dir, upload_path()}}
|
{:ok, {:static_dir, upload_path()}}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
|
||||||
def put_file(upload) do
|
def put_file(upload) do
|
||||||
{local_path, file} =
|
{local_path, file} =
|
||||||
case Enum.reverse(Path.split(upload.path)) do
|
case Enum.reverse(Path.split(upload.path)) do
|
||||||
@ -35,15 +33,4 @@ defmodule Pleroma.Uploaders.Local do
|
|||||||
def upload_path do
|
def upload_path do
|
||||||
Pleroma.Config.get!([__MODULE__, :uploads])
|
Pleroma.Config.get!([__MODULE__, :uploads])
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
|
||||||
def delete_file(path) do
|
|
||||||
upload_path()
|
|
||||||
|> Path.join(path)
|
|
||||||
|> File.rm()
|
|
||||||
|> case do
|
|
||||||
:ok -> :ok
|
|
||||||
{:error, posix_error} -> {:error, to_string(posix_error)}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
@ -10,7 +10,6 @@ defmodule Pleroma.Uploaders.S3 do
|
|||||||
|
|
||||||
# The file name is re-encoded with S3's constraints here to comply with previous
|
# The file name is re-encoded with S3's constraints here to comply with previous
|
||||||
# links with less strict filenames
|
# links with less strict filenames
|
||||||
@impl true
|
|
||||||
def get_file(file) do
|
def get_file(file) do
|
||||||
config = Config.get([__MODULE__])
|
config = Config.get([__MODULE__])
|
||||||
bucket = Keyword.fetch!(config, :bucket)
|
bucket = Keyword.fetch!(config, :bucket)
|
||||||
@ -36,7 +35,6 @@ defmodule Pleroma.Uploaders.S3 do
|
|||||||
])}}
|
])}}
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
|
||||||
def put_file(%Pleroma.Upload{} = upload) do
|
def put_file(%Pleroma.Upload{} = upload) do
|
||||||
config = Config.get([__MODULE__])
|
config = Config.get([__MODULE__])
|
||||||
bucket = Keyword.get(config, :bucket)
|
bucket = Keyword.get(config, :bucket)
|
||||||
@ -71,18 +69,6 @@ defmodule Pleroma.Uploaders.S3 do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
|
||||||
def delete_file(file) do
|
|
||||||
[__MODULE__, :bucket]
|
|
||||||
|> Config.get()
|
|
||||||
|> ExAws.S3.delete_object(file)
|
|
||||||
|> ExAws.request()
|
|
||||||
|> case do
|
|
||||||
{:ok, %{status_code: 204}} -> :ok
|
|
||||||
error -> {:error, inspect(error)}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@regex Regex.compile!("[^0-9a-zA-Z!.*/'()_-]")
|
@regex Regex.compile!("[^0-9a-zA-Z!.*/'()_-]")
|
||||||
def strict_encode(name) do
|
def strict_encode(name) do
|
||||||
String.replace(name, @regex, "-")
|
String.replace(name, @regex, "-")
|
||||||
|
@ -36,8 +36,6 @@ defmodule Pleroma.Uploaders.Uploader do
|
|||||||
@callback put_file(Pleroma.Upload.t()) ::
|
@callback put_file(Pleroma.Upload.t()) ::
|
||||||
:ok | {:ok, file_spec()} | {:error, String.t()} | :wait_callback
|
:ok | {:ok, file_spec()} | {:error, String.t()} | :wait_callback
|
||||||
|
|
||||||
@callback delete_file(file :: String.t()) :: :ok | {:error, String.t()}
|
|
||||||
|
|
||||||
@callback http_callback(Plug.Conn.t(), Map.t()) ::
|
@callback http_callback(Plug.Conn.t(), Map.t()) ::
|
||||||
{:ok, Plug.Conn.t()}
|
{:ok, Plug.Conn.t()}
|
||||||
| {:ok, Plug.Conn.t(), file_spec()}
|
| {:ok, Plug.Conn.t(), file_spec()}
|
||||||
@ -45,6 +43,7 @@ defmodule Pleroma.Uploaders.Uploader do
|
|||||||
@optional_callbacks http_callback: 2
|
@optional_callbacks http_callback: 2
|
||||||
|
|
||||||
@spec put_file(module(), Pleroma.Upload.t()) :: {:ok, file_spec()} | {:error, String.t()}
|
@spec put_file(module(), Pleroma.Upload.t()) :: {:ok, file_spec()} | {:error, String.t()}
|
||||||
|
|
||||||
def put_file(uploader, upload) do
|
def put_file(uploader, upload) do
|
||||||
case uploader.put_file(upload) do
|
case uploader.put_file(upload) do
|
||||||
:ok -> {:ok, {:file, upload.path}}
|
:ok -> {:ok, {:file, upload.path}}
|
||||||
|
@ -73,145 +73,6 @@ defmodule Pleroma.ObjectTest do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "delete attachments" do
|
|
||||||
clear_config([Pleroma.Upload])
|
|
||||||
|
|
||||||
test "in subdirectories" do
|
|
||||||
Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
|
|
||||||
|
|
||||||
file = %Plug.Upload{
|
|
||||||
content_type: "image/jpg",
|
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
|
||||||
filename: "an_image.jpg"
|
|
||||||
}
|
|
||||||
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, %Object{} = attachment} =
|
|
||||||
Pleroma.Web.ActivityPub.ActivityPub.upload(file, actor: user.ap_id)
|
|
||||||
|
|
||||||
%{data: %{"attachment" => [%{"url" => [%{"href" => href}]}]}} =
|
|
||||||
note = insert(:note, %{user: user, data: %{"attachment" => [attachment.data]}})
|
|
||||||
|
|
||||||
uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads])
|
|
||||||
|
|
||||||
path = href |> Path.dirname() |> Path.basename()
|
|
||||||
|
|
||||||
assert {:ok, ["an_image.jpg"]} == File.ls("#{uploads_dir}/#{path}")
|
|
||||||
|
|
||||||
Object.delete(note)
|
|
||||||
|
|
||||||
ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker))
|
|
||||||
|
|
||||||
assert Object.get_by_id(attachment.id) == nil
|
|
||||||
|
|
||||||
assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
|
|
||||||
end
|
|
||||||
|
|
||||||
test "with dedupe enabled" do
|
|
||||||
Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
|
|
||||||
Pleroma.Config.put([Pleroma.Upload, :filters], [Pleroma.Upload.Filter.Dedupe])
|
|
||||||
|
|
||||||
uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads])
|
|
||||||
|
|
||||||
File.mkdir_p!(uploads_dir)
|
|
||||||
|
|
||||||
file = %Plug.Upload{
|
|
||||||
content_type: "image/jpg",
|
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
|
||||||
filename: "an_image.jpg"
|
|
||||||
}
|
|
||||||
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, %Object{} = attachment} =
|
|
||||||
Pleroma.Web.ActivityPub.ActivityPub.upload(file, actor: user.ap_id)
|
|
||||||
|
|
||||||
%{data: %{"attachment" => [%{"url" => [%{"href" => href}]}]}} =
|
|
||||||
note = insert(:note, %{user: user, data: %{"attachment" => [attachment.data]}})
|
|
||||||
|
|
||||||
filename = Path.basename(href)
|
|
||||||
|
|
||||||
assert {:ok, files} = File.ls(uploads_dir)
|
|
||||||
assert filename in files
|
|
||||||
|
|
||||||
Object.delete(note)
|
|
||||||
|
|
||||||
ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker))
|
|
||||||
|
|
||||||
assert Object.get_by_id(attachment.id) == nil
|
|
||||||
assert {:ok, files} = File.ls(uploads_dir)
|
|
||||||
refute filename in files
|
|
||||||
end
|
|
||||||
|
|
||||||
test "with objects that have legacy data.url attribute" do
|
|
||||||
Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
|
|
||||||
|
|
||||||
file = %Plug.Upload{
|
|
||||||
content_type: "image/jpg",
|
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
|
||||||
filename: "an_image.jpg"
|
|
||||||
}
|
|
||||||
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, %Object{} = attachment} =
|
|
||||||
Pleroma.Web.ActivityPub.ActivityPub.upload(file, actor: user.ap_id)
|
|
||||||
|
|
||||||
{:ok, %Object{}} = Object.create(%{url: "https://google.com", actor: user.ap_id})
|
|
||||||
|
|
||||||
%{data: %{"attachment" => [%{"url" => [%{"href" => href}]}]}} =
|
|
||||||
note = insert(:note, %{user: user, data: %{"attachment" => [attachment.data]}})
|
|
||||||
|
|
||||||
uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads])
|
|
||||||
|
|
||||||
path = href |> Path.dirname() |> Path.basename()
|
|
||||||
|
|
||||||
assert {:ok, ["an_image.jpg"]} == File.ls("#{uploads_dir}/#{path}")
|
|
||||||
|
|
||||||
Object.delete(note)
|
|
||||||
|
|
||||||
ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker))
|
|
||||||
|
|
||||||
assert Object.get_by_id(attachment.id) == nil
|
|
||||||
|
|
||||||
assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
|
|
||||||
end
|
|
||||||
|
|
||||||
test "With custom base_url" do
|
|
||||||
Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
|
|
||||||
Pleroma.Config.put([Pleroma.Upload, :base_url], "https://sub.domain.tld/dir/")
|
|
||||||
|
|
||||||
file = %Plug.Upload{
|
|
||||||
content_type: "image/jpg",
|
|
||||||
path: Path.absname("test/fixtures/image.jpg"),
|
|
||||||
filename: "an_image.jpg"
|
|
||||||
}
|
|
||||||
|
|
||||||
user = insert(:user)
|
|
||||||
|
|
||||||
{:ok, %Object{} = attachment} =
|
|
||||||
Pleroma.Web.ActivityPub.ActivityPub.upload(file, actor: user.ap_id)
|
|
||||||
|
|
||||||
%{data: %{"attachment" => [%{"url" => [%{"href" => href}]}]}} =
|
|
||||||
note = insert(:note, %{user: user, data: %{"attachment" => [attachment.data]}})
|
|
||||||
|
|
||||||
uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads])
|
|
||||||
|
|
||||||
path = href |> Path.dirname() |> Path.basename()
|
|
||||||
|
|
||||||
assert {:ok, ["an_image.jpg"]} == File.ls("#{uploads_dir}/#{path}")
|
|
||||||
|
|
||||||
Object.delete(note)
|
|
||||||
|
|
||||||
ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker))
|
|
||||||
|
|
||||||
assert Object.get_by_id(attachment.id) == nil
|
|
||||||
|
|
||||||
assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "normalizer" do
|
describe "normalizer" do
|
||||||
test "fetches unknown objects by default" do
|
test "fetches unknown objects by default" do
|
||||||
%Object{} =
|
%Object{} =
|
||||||
|
@ -29,25 +29,4 @@ defmodule Pleroma.Uploaders.LocalTest do
|
|||||||
|> File.exists?()
|
|> File.exists?()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "delete_file/1" do
|
|
||||||
test "deletes local file" do
|
|
||||||
file_path = "local_upload/files/image.jpg"
|
|
||||||
|
|
||||||
file = %Pleroma.Upload{
|
|
||||||
name: "image.jpg",
|
|
||||||
content_type: "image/jpg",
|
|
||||||
path: file_path,
|
|
||||||
tempfile: Path.absname("test/fixtures/image_tmp.jpg")
|
|
||||||
}
|
|
||||||
|
|
||||||
:ok = Local.put_file(file)
|
|
||||||
local_path = Path.join([Local.upload_path(), file_path])
|
|
||||||
assert File.exists?(local_path)
|
|
||||||
|
|
||||||
Local.delete_file(file_path)
|
|
||||||
|
|
||||||
refute File.exists?(local_path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
@ -79,11 +79,4 @@ defmodule Pleroma.Uploaders.S3Test do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "delete_file/1" do
|
|
||||||
test_with_mock "deletes file", ExAws, request: fn _req -> {:ok, %{status_code: 204}} end do
|
|
||||||
assert :ok = S3.delete_file("image.jpg")
|
|
||||||
assert_called(ExAws.request(:_))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user