Improve upload filter return values so we can identify when filters make no changes...
authorMark Felder <feld@FreeBSD.org>
Fri, 4 Sep 2020 22:40:59 +0000 (17:40 -0500)
committerrinpatch <rinpatch@sdf.org>
Tue, 8 Sep 2020 09:29:38 +0000 (12:29 +0300)
lib/pleroma/upload/filter.ex
lib/pleroma/upload/filter/anonymize_filename.ex
lib/pleroma/upload/filter/dedupe.ex
lib/pleroma/upload/filter/exiftool.ex
lib/pleroma/upload/filter/mogrifun.ex
lib/pleroma/upload/filter/mogrify.ex
test/upload/filter/anonymize_filename_test.exs
test/upload/filter/dedupe_test.exs
test/upload/filter/exiftool_test.exs
test/upload/filter/mogrifun_test.exs
test/upload/filter/mogrify_test.exs

index dbdadc97f1a5eab2b5afdc5783d88bfe80c7ad5a..66113563494a5a72d442c9c9587817ecaa941403 100644 (file)
@@ -15,7 +15,11 @@ defmodule Pleroma.Upload.Filter do
 
   require Logger
 
-  @callback filter(Pleroma.Upload.t()) :: :ok | {:ok, Pleroma.Upload.t()} | {:error, any()}
+  @callback filter(Pleroma.Upload.t()) ::
+              {:ok, :filtered}
+              | {:ok, :noop}
+              | {:ok, :filtered, Pleroma.Upload.t()}
+              | {:error, any()}
 
   @spec filter([module()], Pleroma.Upload.t()) :: {:ok, Pleroma.Upload.t()} | {:error, any()}
 
@@ -25,10 +29,13 @@ defmodule Pleroma.Upload.Filter do
 
   def filter([filter | rest], upload) do
     case filter.filter(upload) do
-      :ok ->
+      {:ok, :filtered} ->
         filter(rest, upload)
 
-      {:ok, upload} ->
+      {:ok, :filtered, upload} ->
+        filter(rest, upload)
+
+      {:ok, :noop} ->
         filter(rest, upload)
 
       error ->
index 07ead82038d1cc929c00762bca70826680d83ecb..fc456e4f4fc7c9358faaa05b41d3f1726867e2a8 100644 (file)
@@ -16,9 +16,11 @@ defmodule Pleroma.Upload.Filter.AnonymizeFilename do
   def filter(%Upload{name: name} = upload) do
     extension = List.last(String.split(name, "."))
     name = predefined_name(extension) || random(extension)
-    {:ok, %Upload{upload | name: name}}
+    {:ok, :filtered, %Upload{upload | name: name}}
   end
 
+  def filter(_), do: {:ok, :noop}
+
   @spec predefined_name(String.t()) :: String.t() | nil
   defp predefined_name(extension) do
     with name when not is_nil(name) <- Config.get([__MODULE__, :text]),
index 41218a91862ed6f45667db80836025d67434cac0..86cbc8996b126f604f1be5651f97bd178b553bfe 100644 (file)
@@ -17,8 +17,8 @@ defmodule Pleroma.Upload.Filter.Dedupe do
       |> Base.encode16(case: :lower)
 
     filename = shasum <> "." <> extension
-    {:ok, %Upload{upload | id: shasum, path: filename}}
+    {:ok, :filtered, %Upload{upload | id: shasum, path: filename}}
   end
 
-  def filter(_), do: :ok
+  def filter(_), do: {:ok, :noop}
 end
index a91bd5e2466ce19caf09e6708926f47cd386719b..94d12c01b16c7cd519a8950a4afb61cb55c490ae 100644 (file)
@@ -9,22 +9,22 @@ defmodule Pleroma.Upload.Filter.Exiftool do
   """
   @behaviour Pleroma.Upload.Filter
 
-  @spec filter(Pleroma.Upload.t()) :: :ok | {:error, String.t()}
+  @spec filter(Pleroma.Upload.t()) :: {:ok, any()} | {:error, String.t()}
   def filter(%Pleroma.Upload{name: file, tempfile: path, content_type: "image" <> _}) do
     # webp is not compatible with exiftool at this time
     if Regex.match?(~r/\.(webp)$/i, file) do
-      :ok
+      {:ok, :noop}
     else
       strip_exif(path)
     end
   end
 
-  def filter(_), do: :ok
+  def filter(_), do: {:ok, :noop}
 
   defp strip_exif(path) do
     try do
       case System.cmd("exiftool", ["-overwrite_original", "-gps:all=", path], parallelism: true) do
-        {_response, 0} -> :ok
+        {_response, 0} -> {:ok, :filtered}
         {error, 1} -> {:error, error}
       end
     rescue
index c8fa7b19084fce6ebd7ff1be4ba193cc114a0446..363e5cf0f2881d31dab31d91a91a96983f5cc87d 100644 (file)
@@ -38,16 +38,16 @@ defmodule Pleroma.Upload.Filter.Mogrifun do
     [{"fill", "yellow"}, {"tint", "40"}]
   ]
 
-  @spec filter(Pleroma.Upload.t()) :: :ok | {:error, String.t()}
+  @spec filter(Pleroma.Upload.t()) :: {:ok, atom()} | {:error, String.t()}
   def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
     try do
       Filter.Mogrify.do_filter(file, [Enum.random(@filters)])
-      :ok
+      {:ok, :filtered}
     rescue
       _e in ErlangError ->
         {:error, "mogrify command not found"}
     end
   end
 
-  def filter(_), do: :ok
+  def filter(_), do: {:ok, :noop}
 end
index 7a45add5a2cda00662d43bd17d31b67e90797655..71968fd9c196500aa7b2e2117eae7830b75d2687 100644 (file)
@@ -8,18 +8,18 @@ defmodule Pleroma.Upload.Filter.Mogrify do
   @type conversion :: action :: String.t() | {action :: String.t(), opts :: String.t()}
   @type conversions :: conversion() | [conversion()]
 
-  @spec filter(Pleroma.Upload.t()) :: :ok | {:error, String.t()}
+  @spec filter(Pleroma.Upload.t()) :: {:ok, :atom} | {:error, String.t()}
   def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
     try do
       do_filter(file, Pleroma.Config.get!([__MODULE__, :args]))
-      :ok
+      {:ok, :filtered}
     rescue
       _e in ErlangError ->
         {:error, "mogrify command not found"}
     end
   end
 
-  def filter(_), do: :ok
+  def filter(_), do: {:ok, :noop}
 
   def do_filter(file, filters) do
     file
index adff70f574272f2a6a682bf27898ada2950f85fb..19b915cc80dc0bca750203fe08e9dbb19effc8b7 100644 (file)
@@ -24,18 +24,18 @@ defmodule Pleroma.Upload.Filter.AnonymizeFilenameTest do
 
   test "it replaces filename on pre-defined text", %{upload_file: upload_file} do
     Config.put([Upload.Filter.AnonymizeFilename, :text], "custom-file.png")
-    {:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
+    {:ok, :filtered, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
     assert name == "custom-file.png"
   end
 
   test "it replaces filename on pre-defined text expression", %{upload_file: upload_file} do
     Config.put([Upload.Filter.AnonymizeFilename, :text], "custom-file.{extension}")
-    {:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
+    {:ok, :filtered, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
     assert name == "custom-file.jpg"
   end
 
   test "it replaces filename on random text", %{upload_file: upload_file} do
-    {:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
+    {:ok, :filtered, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
     assert <<_::bytes-size(14)>> <> ".jpg" = name
     refute name == "an… image.jpg"
   end
index 966c353f792aebbd5087b0dd12863fdc0828a93b..75c7198e1bf3e8970f56e5dc929535a1e5971b89 100644 (file)
@@ -25,6 +25,7 @@ defmodule Pleroma.Upload.Filter.DedupeTest do
 
     assert {
              :ok,
+             :filtered,
              %Pleroma.Upload{id: @shasum, path: @shasum <> ".jpg"}
            } = Dedupe.filter(upload)
   end
index 8ed7d650bfb74ef7a255a11422d3e0f973dac99e..094253a25d3b5374699022befce1d14bd4768c1c 100644 (file)
@@ -21,7 +21,7 @@ defmodule Pleroma.Upload.Filter.ExiftoolTest do
       tempfile: Path.absname("test/fixtures/DSCN0010_tmp.jpg")
     }
 
-    assert Filter.Exiftool.filter(upload) == :ok
+    assert Filter.Exiftool.filter(upload) == {:ok, :filtered}
 
     {exif_original, 0} = System.cmd("exiftool", ["test/fixtures/DSCN0010.jpg"])
     {exif_filtered, 0} = System.cmd("exiftool", ["test/fixtures/DSCN0010_tmp.jpg"])
index 2426a8496000b1383df48385dddd47d9ca8d9bf2..dc1e9e78f0f898983bf5886d837db25e96a5cdbf 100644 (file)
@@ -36,7 +36,7 @@ defmodule Pleroma.Upload.Filter.MogrifunTest do
          save: fn _f, _o -> :ok end
        ]}
     ]) do
-      assert Filter.Mogrifun.filter(upload) == :ok
+      assert Filter.Mogrifun.filter(upload) == {:ok, :filtered}
     end
 
     Task.await(task)
index 62ca304877ca3f02a73229eb761493403410b76e..bf64b96b365697df9e6544867da50f33345eed9f 100644 (file)
@@ -33,7 +33,7 @@ defmodule Pleroma.Upload.Filter.MogrifyTest do
       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
+      assert Filter.Mogrify.filter(upload) == {:ok, :filtered}
     end
 
     Task.await(task)