diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/mime.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/upload/filter/anonymize_filename.ex | 19 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/views/status_view.ex | 111 | 
3 files changed, 81 insertions, 51 deletions
| 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 | 
