diff options
| -rw-r--r-- | lib/pleroma/upload/filter/dedupe.ex | 15 | ||||
| -rw-r--r-- | lib/pleroma/upload/filter/mogrifun.ex | 24 | ||||
| -rw-r--r-- | lib/pleroma/upload/filter/mogrify.ex | 11 | ||||
| -rw-r--r-- | test/upload/filter/dedupe_test.exs | 31 | ||||
| -rw-r--r-- | test/upload/filter/mogrifun_test.exs | 44 | ||||
| -rw-r--r-- | test/upload/filter/mogrify_test.exs | 51 | ||||
| -rw-r--r-- | test/upload/filter_test.exs | 39 | 
7 files changed, 186 insertions, 29 deletions
diff --git a/lib/pleroma/upload/filter/dedupe.ex b/lib/pleroma/upload/filter/dedupe.ex index e4c225833..14928c355 100644 --- a/lib/pleroma/upload/filter/dedupe.ex +++ b/lib/pleroma/upload/filter/dedupe.ex @@ -6,10 +6,19 @@ defmodule Pleroma.Upload.Filter.Dedupe do    @behaviour Pleroma.Upload.Filter    alias Pleroma.Upload -  def filter(%Upload{name: name} = upload) do -    extension = String.split(name, ".") |> List.last() -    shasum = :crypto.hash(:sha256, File.read!(upload.tempfile)) |> Base.encode16(case: :lower) +  def filter(%Upload{name: name, tempfile: tempfile} = upload) do +    extension = +      name +      |> String.split(".") +      |> List.last() + +    shasum = +      :crypto.hash(:sha256, File.read!(tempfile)) +      |> Base.encode16(case: :lower) +      filename = shasum <> "." <> extension      {:ok, %Upload{upload | id: shasum, path: filename}}    end + +  def filter(_), do: :ok  end diff --git a/lib/pleroma/upload/filter/mogrifun.ex b/lib/pleroma/upload/filter/mogrifun.ex index 35a5a1381..fee49fb51 100644 --- a/lib/pleroma/upload/filter/mogrifun.ex +++ b/lib/pleroma/upload/filter/mogrifun.ex @@ -4,6 +4,7 @@  defmodule Pleroma.Upload.Filter.Mogrifun do    @behaviour Pleroma.Upload.Filter +  alias Pleroma.Upload.Filter    @filters [      {"implode", "1"}, @@ -34,31 +35,10 @@ defmodule Pleroma.Upload.Filter.Mogrifun do    ]    def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do -    filter = Enum.random(@filters) - -    file -    |> Mogrify.open() -    |> mogrify_filter(filter) -    |> Mogrify.save(in_place: true) +    Filter.Mogrify.do_filter(file, [Enum.random(@filters)])      :ok    end    def filter(_), do: :ok - -  defp mogrify_filter(mogrify, [filter | rest]) do -    mogrify -    |> mogrify_filter(filter) -    |> mogrify_filter(rest) -  end - -  defp mogrify_filter(mogrify, []), do: mogrify - -  defp mogrify_filter(mogrify, {action, options}) do -    Mogrify.custom(mogrify, action, options) -  end - -  defp mogrify_filter(mogrify, string) when is_binary(string) do -    Mogrify.custom(mogrify, string) -  end  end diff --git a/lib/pleroma/upload/filter/mogrify.ex b/lib/pleroma/upload/filter/mogrify.ex index f459eeecb..91bfdd4f5 100644 --- a/lib/pleroma/upload/filter/mogrify.ex +++ b/lib/pleroma/upload/filter/mogrify.ex @@ -11,16 +11,19 @@ defmodule Pleroma.Upload.Filter.Mogrify do    def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do      filters = Pleroma.Config.get!([__MODULE__, :args]) +    do_filter(file, filters) +    :ok +  end + +  def filter(_), do: :ok + +  def do_filter(file, filters) do      file      |> Mogrify.open()      |> mogrify_filter(filters)      |> Mogrify.save(in_place: true) - -    :ok    end -  def filter(_), do: :ok -    defp mogrify_filter(mogrify, nil), do: mogrify    defp mogrify_filter(mogrify, [filter | rest]) do diff --git a/test/upload/filter/dedupe_test.exs b/test/upload/filter/dedupe_test.exs new file mode 100644 index 000000000..fddd594dc --- /dev/null +++ b/test/upload/filter/dedupe_test.exs @@ -0,0 +1,31 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Upload.Filter.DedupeTest do +  use Pleroma.DataCase + +  alias Pleroma.Upload +  alias Pleroma.Upload.Filter.Dedupe + +  @shasum "e30397b58d226d6583ab5b8b3c5defb0c682bda5c31ef07a9f57c1c4986e3781" + +  test "adds shasum" do +    File.cp!( +      "test/fixtures/image.jpg", +      "test/fixtures/image_tmp.jpg" +    ) + +    upload = %Upload{ +      name: "an… image.jpg", +      content_type: "image/jpg", +      path: Path.absname("test/fixtures/image_tmp.jpg"), +      tempfile: Path.absname("test/fixtures/image_tmp.jpg") +    } + +    assert { +             :ok, +             %Pleroma.Upload{id: @shasum, path: "#{@shasum}.jpg"} +           } = Dedupe.filter(upload) +  end +end diff --git a/test/upload/filter/mogrifun_test.exs b/test/upload/filter/mogrifun_test.exs new file mode 100644 index 000000000..d5a8751cc --- /dev/null +++ b/test/upload/filter/mogrifun_test.exs @@ -0,0 +1,44 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Upload.Filter.MogrifunTest do +  use Pleroma.DataCase +  import Mock + +  alias Pleroma.Upload +  alias Pleroma.Upload.Filter + +  test "apply mogrify filter" do +    File.cp!( +      "test/fixtures/image.jpg", +      "test/fixtures/image_tmp.jpg" +    ) + +    upload = %Upload{ +      name: "an… image.jpg", +      content_type: "image/jpg", +      path: Path.absname("test/fixtures/image_tmp.jpg"), +      tempfile: Path.absname("test/fixtures/image_tmp.jpg") +    } + +    task = +      Task.async(fn -> +        assert_receive {:apply_filter, {}}, 4_000 +      end) + +    with_mocks([ +      {Mogrify, [], +       [ +         open: fn _f -> %Mogrify.Image{} end, +         custom: fn _m, _a -> send(task.pid, {:apply_filter, {}}) end, +         custom: fn _m, _a, _o -> send(task.pid, {:apply_filter, {}}) end, +         save: fn _f, _o -> :ok end +       ]} +    ]) do +      assert Filter.Mogrifun.filter(upload) == :ok +    end + +    Task.await(task) +  end +end diff --git a/test/upload/filter/mogrify_test.exs b/test/upload/filter/mogrify_test.exs new file mode 100644 index 000000000..c301440fd --- /dev/null +++ b/test/upload/filter/mogrify_test.exs @@ -0,0 +1,51 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Upload.Filter.MogrifyTest do +  use Pleroma.DataCase +  import Mock + +  alias Pleroma.Config +  alias Pleroma.Upload +  alias Pleroma.Upload.Filter + +  setup do +    filter = Config.get([Filter.Mogrify, :args]) + +    on_exit(fn -> +      Config.put([Filter.Mogrify, :args], filter) +    end) +  end + +  test "apply mogrify filter" do +    Config.put([Filter.Mogrify, :args], [{"tint", "40"}]) + +    File.cp!( +      "test/fixtures/image.jpg", +      "test/fixtures/image_tmp.jpg" +    ) + +    upload = %Upload{ +      name: "an… image.jpg", +      content_type: "image/jpg", +      path: Path.absname("test/fixtures/image_tmp.jpg"), +      tempfile: Path.absname("test/fixtures/image_tmp.jpg") +    } + +    task = +      Task.async(fn -> +        assert_receive {:apply_filter, {_, "tint", "40"}}, 4_000 +      end) + +    with_mock Mogrify, +      open: fn _f -> %Mogrify.Image{} end, +      custom: fn _m, _a -> :ok end, +      custom: fn m, a, o -> send(task.pid, {:apply_filter, {m, a, o}}) end, +      save: fn _f, _o -> :ok end do +      assert Filter.Mogrify.filter(upload) == :ok +    end + +    Task.await(task) +  end +end diff --git a/test/upload/filter_test.exs b/test/upload/filter_test.exs new file mode 100644 index 000000000..640cd7107 --- /dev/null +++ b/test/upload/filter_test.exs @@ -0,0 +1,39 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Upload.FilterTest do +  use Pleroma.DataCase + +  alias Pleroma.Config +  alias Pleroma.Upload.Filter + +  setup do +    custom_filename = Config.get([Pleroma.Upload.Filter.AnonymizeFilename, :text]) + +    on_exit(fn -> +      Config.put([Pleroma.Upload.Filter.AnonymizeFilename, :text], custom_filename) +    end) +  end + +  test "applies filters" do +    Config.put([Pleroma.Upload.Filter.AnonymizeFilename, :text], "custom-file.png") + +    File.cp!( +      "test/fixtures/image.jpg", +      "test/fixtures/image_tmp.jpg" +    ) + +    upload = %Pleroma.Upload{ +      name: "an… image.jpg", +      content_type: "image/jpg", +      path: Path.absname("test/fixtures/image_tmp.jpg"), +      tempfile: Path.absname("test/fixtures/image_tmp.jpg") +    } + +    assert Filter.filter([], upload) == {:ok, upload} + +    assert {:ok, upload} = Filter.filter([Pleroma.Upload.Filter.AnonymizeFilename], upload) +    assert upload.name == "custom-file.png" +  end +end  | 
