Browse Source

Merge branch 'feature/upload-filter-exiftool' into 'develop'

Add Pleroma.Upload.Filter.Exiftool

Closes #1935

See merge request pleroma/pleroma!2744
chores/our-libs-hex-releases
lain 4 years ago
parent
commit
11dd29ef3f
8 changed files with 66 additions and 7 deletions
  1. +1
    -0
      .gitignore
  2. +2
    -0
      .gitlab-ci.yml
  3. +1
    -0
      CHANGELOG.md
  4. +1
    -1
      Dockerfile
  5. +12
    -6
      docs/configuration/cheatsheet.md
  6. +18
    -0
      lib/pleroma/upload/filter/exiftool.ex
  7. BIN
      test/fixtures/DSCN0010.jpg
  8. +31
    -0
      test/upload/filter/exiftool_test.exs

+ 1
- 0
.gitignore View File

@@ -5,6 +5,7 @@
/*.ez
/test/uploads
/.elixir_ls
/test/fixtures/DSCN0010_tmp.jpg
/test/fixtures/test_tmp.txt
/test/fixtures/image_tmp.jpg
/test/tmp/


+ 2
- 0
.gitlab-ci.yml View File

@@ -58,6 +58,7 @@ unit-testing:
alias: postgres
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
script:
- apt-get update && apt-get install -y libimage-exiftool-perl
- mix deps.get
- mix ecto.create
- mix ecto.migrate
@@ -89,6 +90,7 @@ unit-testing-rum:
<<: *global_variables
RUM_ENABLED: "true"
script:
- apt-get update && apt-get install -y libimage-exiftool-perl
- mix deps.get
- mix ecto.create
- mix ecto.migrate


+ 1
- 0
CHANGELOG.md View File

@@ -57,6 +57,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- MRF (`EmojiStealPolicy`): New MRF Policy which allows to automatically download emojis from remote instances
- Support pagination in emoji packs API (for packs and for files in pack)
- Support for viewing instances favicons next to posts and accounts
- Added Pleroma.Upload.Filter.Exiftool as an alternate EXIF stripping mechanism targeting GPS/location metadata.

<details>
<summary>API Changes</summary>


+ 1
- 1
Dockerfile View File

@@ -33,7 +33,7 @@ ARG DATA=/var/lib/pleroma

RUN echo "http://nl.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories &&\
apk update &&\
apk add imagemagick ncurses postgresql-client &&\
apk add exiftool imagemagick ncurses postgresql-client &&\
adduser --system --shell /bin/false --home ${HOME} pleroma &&\
mkdir -p ${DATA}/uploads &&\
mkdir -p ${DATA}/static &&\


+ 12
- 6
docs/configuration/cheatsheet.md View File

@@ -548,20 +548,26 @@ config :ex_aws, :s3,

### Upload filters

#### Pleroma.Upload.Filter.Mogrify
#### Pleroma.Upload.Filter.AnonymizeFilename

* `args`: List of actions for the `mogrify` command like `"strip"` or `["strip", "auto-orient", {"implode", "1"}]`.
This filter replaces the filename (not the path) of an upload. For complete obfuscation, add
`Pleroma.Upload.Filter.Dedupe` before AnonymizeFilename.

* `text`: Text to replace filenames in links. If empty, `{random}.extension` will be used. You can get the original filename extension by using `{extension}`, for example `custom-file-name.{extension}`.

#### Pleroma.Upload.Filter.Dedupe

No specific configuration.

#### Pleroma.Upload.Filter.AnonymizeFilename
#### Pleroma.Upload.Filter.Exiftool

This filter replaces the filename (not the path) of an upload. For complete obfuscation, add
`Pleroma.Upload.Filter.Dedupe` before AnonymizeFilename.
This filter only strips the GPS and location metadata with Exiftool leaving color profiles and attributes intact.

* `text`: Text to replace filenames in links. If empty, `{random}.extension` will be used. You can get the original filename extension by using `{extension}`, for example `custom-file-name.{extension}`.
No specific configuration.

#### Pleroma.Upload.Filter.Mogrify

* `args`: List of actions for the `mogrify` command like `"strip"` or `["strip", "auto-orient", {"implode", "1"}]`.

## Email



+ 18
- 0
lib/pleroma/upload/filter/exiftool.ex View File

@@ -0,0 +1,18 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Upload.Filter.Exiftool do
@moduledoc """
Strips GPS related EXIF tags and overwrites the file in place.
Also strips or replaces filesystem metadata e.g., timestamps.
"""
@behaviour Pleroma.Upload.Filter

def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
System.cmd("exiftool", ["-overwrite_original", "-gps:all=", file], parallelism: true)
:ok
end

def filter(_), do: :ok
end

BIN
test/fixtures/DSCN0010.jpg View File

Before After
Width: 640  |  Height: 480  |  Size: 158KB

+ 31
- 0
test/upload/filter/exiftool_test.exs View File

@@ -0,0 +1,31 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Upload.Filter.ExiftoolTest do
use Pleroma.DataCase
alias Pleroma.Upload.Filter

test "apply exiftool filter" do
File.cp!(
"test/fixtures/DSCN0010.jpg",
"test/fixtures/DSCN0010_tmp.jpg"
)

upload = %Pleroma.Upload{
name: "image_with_GPS_data.jpg",
content_type: "image/jpg",
path: Path.absname("test/fixtures/DSCN0010.jpg"),
tempfile: Path.absname("test/fixtures/DSCN0010_tmp.jpg")
}

assert Filter.Exiftool.filter(upload) == :ok

{exif_original, 0} = System.cmd("exiftool", ["test/fixtures/DSCN0010.jpg"])
{exif_filtered, 0} = System.cmd("exiftool", ["test/fixtures/DSCN0010_tmp.jpg"])

refute exif_original == exif_filtered
assert String.match?(exif_original, ~r/GPS/)
refute String.match?(exif_filtered, ~r/GPS/)
end
end

Loading…
Cancel
Save