aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/config.md17
-rw-r--r--lib/pleroma/mime.ex2
-rw-r--r--lib/pleroma/upload/filter/anonymize_filename.ex19
-rw-r--r--lib/pleroma/web/mastodon_api/views/status_view.ex111
-rw-r--r--test/web/mastodon_api/status_view_test.exs4
5 files changed, 97 insertions, 56 deletions
diff --git a/config/config.md b/config/config.md
index d90d18566..5b30ddc27 100644
--- a/config/config.md
+++ b/config/config.md
@@ -19,6 +19,17 @@ Note: `strip_exif` has been replaced by `Pleroma.Upload.Filter.Mogrify`.
* `args`: List of actions for the `mogrify` command like `"strip"` or `["strip", {"impode", "1"}]`.
+## Pleroma.Upload.Filter.Dedupe
+
+No specific configuration.
+
+## Pleroma.Upload.Filter.AnonymizeFilename
+
+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.
+
## :uri_schemes
* `valid_schemes`: List of the scheme part that is considered valid to be an URL
@@ -30,9 +41,9 @@ Note: `strip_exif` has been replaced by `Pleroma.Upload.Filter.Mogrify`.
* `upload_limit`: File size limit of uploads (except for avatar, background, banner)
* `avatar_upload_limit`: File size limit of user’s profile avatars
* `background_upload_limit`: File size limit of user’s profile backgrounds
-* `banner_upload_limit`: File size limit of user’s profile backgrounds
-* `registerations_open`: Enable registerations for anyone, invitations can be used when false.
-* `federating`
+* `banner_upload_limit`: File size limit of user’s profile banners
+* `registrations_open`: Enable registrations for anyone, invitations can be used when false.
+* `federating`: Enable federation with other instances
* `allow_relay`: Enable Pleroma’s Relay, which makes it possible to follow a whole instance
* `rewrite_policy`: Message Rewrite Policy, either one or a list. Here are the ones available by default:
* `Pleroma.Web.ActivityPub.MRF.NoOpPolicy`: Doesn’t modify activities (default)
diff --git a/lib/pleroma/mime.ex b/lib/pleroma/mime.ex
index 5e1c109e9..2cb3d8bd1 100644
--- a/lib/pleroma/mime.ex
+++ b/lib/pleroma/mime.ex
@@ -3,7 +3,7 @@ defmodule Pleroma.MIME do
Returns the mime-type of a binary and optionally a normalized file-name.
"""
@default "application/octet-stream"
- @read_bytes 31
+ @read_bytes 35
@spec file_mime_type(String.t()) ::
{:ok, content_type :: String.t(), filename :: String.t()} | {:error, any()} | :error
diff --git a/lib/pleroma/upload/filter/anonymize_filename.ex b/lib/pleroma/upload/filter/anonymize_filename.ex
index a83e764e5..39eed7af3 100644
--- a/lib/pleroma/upload/filter/anonymize_filename.ex
+++ b/lib/pleroma/upload/filter/anonymize_filename.ex
@@ -1,10 +1,23 @@
defmodule Pleroma.Upload.Filter.AnonymizeFilename do
- @moduledoc "Replaces the original filename with a randomly generated string."
+ @moduledoc """
+ Replaces the original filename with a pre-defined text or randomly generated string.
+
+ Should be used after `Pleroma.Upload.Filter.Dedupe`.
+ """
@behaviour Pleroma.Upload.Filter
def filter(upload) do
extension = List.last(String.split(upload.name, "."))
- string = Base.url_encode64(:crypto.strong_rand_bytes(10), padding: false)
- {:ok, %Pleroma.Upload{upload | name: string <> "." <> extension}}
+ name = Pleroma.Config.get([__MODULE__, :text], random(extension))
+ {:ok, %Pleroma.Upload{upload | name: name}}
+ end
+
+ defp random(extension) do
+ string =
+ 10
+ |> :crypto.strong_rand_bytes()
+ |> Base.url_encode64(padding: false)
+
+ string <> "." <> extension
end
end
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 2d9a915f0..c3c735d5d 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -1,18 +1,21 @@
defmodule Pleroma.Web.MastodonAPI.StatusView do
use Pleroma.Web, :view
- alias Pleroma.Web.MastodonAPI.{AccountView, StatusView}
- alias Pleroma.{User, Activity}
+
+ alias Pleroma.Activity
+ alias Pleroma.HTML
+ alias Pleroma.Repo
+ alias Pleroma.User
alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Web.MediaProxy
- alias Pleroma.Repo
- alias Pleroma.HTML
+ alias Pleroma.Web.MastodonAPI.AccountView
+ alias Pleroma.Web.MastodonAPI.StatusView
# TODO: Add cached version.
defp get_replied_to_activities(activities) do
activities
|> Enum.map(fn
- %{data: %{"type" => "Create", "object" => %{"inReplyTo" => inReplyTo}}} ->
- inReplyTo != "" && inReplyTo
+ %{data: %{"type" => "Create", "object" => %{"inReplyTo" => in_reply_to}}} ->
+ in_reply_to != "" && in_reply_to
_ ->
nil
@@ -28,8 +31,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
def render("index.json", opts) do
replied_to_activities = get_replied_to_activities(opts.activities)
- render_many(
- opts.activities,
+ opts.activities
+ |> render_many(
StatusView,
"status.json",
Map.put(opts, :replied_to_activities, replied_to_activities)
@@ -72,9 +75,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
sensitive: false,
spoiler_text: "",
visibility: "public",
- media_attachments: [],
+ media_attachments: reblogged[:media_attachments] || [],
mentions: mentions,
- tags: [],
+ tags: reblogged[:tags] || [],
application: %{
name: "Web",
website: nil
@@ -111,20 +114,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
reply_to = get_reply_to(activity, opts)
reply_to_user = reply_to && User.get_cached_by_ap_id(reply_to.data["actor"])
- emojis =
- (activity.data["object"]["emoji"] || [])
- |> Enum.map(fn {name, url} ->
- name = HTML.strip_tags(name)
-
- url =
- HTML.strip_tags(url)
- |> MediaProxy.url()
-
- %{shortcode: name, url: url, static_url: url, visible_in_picker: false}
- end)
-
content =
- render_content(object)
+ object
+ |> render_content()
|> HTML.filter_tags(User.html_filter_policy(opts[:for]))
%{
@@ -140,22 +132,21 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
reblogs_count: announcement_count,
replies_count: 0,
favourites_count: like_count,
- reblogged: !!repeated,
- favourited: !!favorited,
+ reblogged: present?(repeated),
+ favourited: present?(favorited),
muted: false,
sensitive: sensitive,
spoiler_text: object["summary"] || "",
visibility: get_visibility(object),
media_attachments: attachments |> Enum.take(4),
mentions: mentions,
- # fix,
- tags: [],
+ tags: tags,
application: %{
name: "Web",
website: nil
},
language: nil,
- emojis: emojis
+ emojis: build_emojis(activity.data["object"]["emoji"])
}
end
@@ -224,30 +215,56 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
def render_content(%{"type" => "Video"} = object) do
- name = object["name"]
-
- content =
- if !!name and name != "" do
- "<p><a href=\"#{object["id"]}\">#{name}</a></p>#{object["content"]}"
- else
- object["content"] || ""
- end
+ with name when not is_nil(name) and name != "" <- object["name"] do
+ "<p><a href=\"#{object["id"]}\">#{name}</a></p>#{object["content"]}"
+ else
+ _ -> object["content"] || ""
+ end
+ end
- content
+ def render_content(%{"type" => object_type} = object)
+ when object_type in ["Article", "Page"] do
+ with summary when not is_nil(summary) and summary != "" <- object["name"],
+ url when is_bitstring(url) <- object["url"] do
+ "<p><a href=\"#{url}\">#{summary}</a></p>#{object["content"]}"
+ else
+ _ -> object["content"] || ""
+ end
end
- def render_content(%{"type" => object_type} = object) when object_type in ["Article", "Page"] do
- summary = object["name"]
+ def render_content(object), do: object["content"] || ""
- content =
- if !!summary and summary != "" and is_bitstring(object["url"]) do
- "<p><a href=\"#{object["url"]}\">#{summary}</a></p>#{object["content"]}"
- else
- object["content"] || ""
- end
+ @doc """
+ Builds list emojis.
+
+ Arguments: `nil` or list tuple of name and url.
+
+ Returns list emojis.
- content
+ ## Examples
+
+ iex> Pleroma.Web.MastodonAPI.StatusView.build_emojis([{"2hu", "corndog.png"}])
+ [%{shortcode: "2hu", static_url: "corndog.png", url: "corndog.png", visible_in_picker: false}]
+
+ """
+ @spec build_emojis(nil | list(tuple())) :: list(map())
+ def build_emojis(nil), do: []
+
+ def build_emojis(emojis) do
+ emojis
+ |> Enum.map(fn {name, url} ->
+ name = HTML.strip_tags(name)
+
+ url =
+ url
+ |> HTML.strip_tags()
+ |> MediaProxy.url()
+
+ %{shortcode: name, url: url, static_url: url, visible_in_picker: false}
+ end)
end
- def render_content(object), do: object["content"] || ""
+ defp present?(nil), do: false
+ defp present?(false), do: false
+ defp present?(_), do: true
end
diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs
index 9e69b3189..d10d59d6c 100644
--- a/test/web/mastodon_api/status_view_test.exs
+++ b/test/web/mastodon_api/status_view_test.exs
@@ -24,7 +24,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
note
|> Map.put(:data, data)
- user = User.get_cached_by_ap_id(note.data["actor"])
+ User.get_cached_by_ap_id(note.data["actor"])
status = StatusView.render("status.json", %{activity: note})
@@ -62,7 +62,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
visibility: "public",
media_attachments: [],
mentions: [],
- tags: [],
+ tags: note.data["object"]["tag"],
application: %{
name: "Web",
website: nil