diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/formatter.ex | 42 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 4 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 5 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex | 80 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/views/instance_view.ex | 3 | ||||
| -rw-r--r-- | lib/pleroma/web/templates/o_auth/mfa/totp.html.eex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/templates/o_auth/o_auth/register.html.eex | 8 | ||||
| -rw-r--r-- | lib/pleroma/web/templates/o_auth/o_auth/show.html.eex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex | 4 | 
9 files changed, 121 insertions, 29 deletions
| diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index ae37946ab..115835378 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -34,32 +34,34 @@ defmodule Pleroma.Formatter do    def mention_handler("@" <> nickname, buffer, opts, acc) do      case User.get_cached_by_nickname(nickname) do -      %User{id: id} = user -> -        user_url = user.uri || user.ap_id -        nickname_text = get_nickname_text(nickname, opts) - -        link = -          Phoenix.HTML.Tag.content_tag( -            :span, -            Phoenix.HTML.Tag.content_tag( -              :a, -              ["@", Phoenix.HTML.Tag.content_tag(:span, nickname_text)], -              "data-user": id, -              class: "u-url mention", -              href: user_url, -              rel: "ugc" -            ), -            class: "h-card" -          ) -          |> Phoenix.HTML.safe_to_string() - -        {link, %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, user})}} +      %User{} = user -> +        {mention_from_user(user, opts), +         %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, user})}}        _ ->          {buffer, acc}      end    end +  def mention_from_user(%User{id: id} = user, opts \\ %{mentions_format: :full}) do +    user_url = user.uri || user.ap_id +    nickname_text = get_nickname_text(user.nickname, opts) + +    Phoenix.HTML.Tag.content_tag( +      :span, +      Phoenix.HTML.Tag.content_tag( +        :a, +        ["@", Phoenix.HTML.Tag.content_tag(:span, nickname_text)], +        "data-user": id, +        class: "u-url mention", +        href: user_url, +        rel: "ugc" +      ), +      class: "h-card" +    ) +    |> Phoenix.HTML.safe_to_string() +  end +    def hashtag_handler("#" <> tag = tag_text, _buffer, _opts, acc) do      tag = String.downcase(tag)      url = "#{Pleroma.Web.Endpoint.url()}/tag/#{tag}" diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index d608525e8..8bb4fb204 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1084,6 +1084,10 @@ defmodule Pleroma.User do      Repo.get_by(User, ap_id: ap_id)    end +  def get_by_uri(uri) do +    Repo.get_by(User, uri: uri) +  end +    def get_all_by_ap_id(ap_ids) do      from(u in __MODULE__,        where: u.ap_id in ^ap_ids diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index bdbcc93f4..7551dd56d 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1675,7 +1675,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do          "orderedItems" => objects        })        when type in ["OrderedCollection", "Collection"] do -    Map.new(objects, fn %{"id" => object_ap_id} -> {object_ap_id, NaiveDateTime.utc_now()} end) +    Map.new(objects, fn +      %{"id" => object_ap_id} -> {object_ap_id, NaiveDateTime.utc_now()} +      object_ap_id when is_binary(object_ap_id) -> {object_ap_id, NaiveDateTime.utc_now()} +    end)    end    def fetch_and_prepare_featured_from_ap_id(nil) do diff --git a/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex new file mode 100644 index 000000000..522ae2f60 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex @@ -0,0 +1,80 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent do +  alias Pleroma.Formatter +  alias Pleroma.User + +  @behaviour Pleroma.Web.ActivityPub.MRF.Policy + +  defp do_extract({:a, attrs, _}, acc) do +    if Enum.find(attrs, fn {name, value} -> +         name == "class" && value in ["mention", "u-url mention", "mention u-url"] +       end) do +      href = Enum.find(attrs, fn {name, _} -> name == "href" end) |> elem(1) +      acc ++ [href] +    else +      acc +    end +  end + +  defp do_extract({_, _, children}, acc) do +    do_extract(children, acc) +  end + +  defp do_extract(nodes, acc) when is_list(nodes) do +    Enum.reduce(nodes, acc, fn node, acc -> do_extract(node, acc) end) +  end + +  defp do_extract(_, acc), do: acc + +  defp extract_mention_uris_from_content(content) do +    {:ok, tree} = :fast_html.decode(content, format: [:html_atoms]) +    do_extract(tree, []) +  end + +  @impl true +  def filter(%{"type" => "Create", "object" => %{"type" => "Note", "tag" => tag}} = object) do +    # image-only posts from pleroma apparently reach this MRF without the content field +    content = object["object"]["content"] || "" + +    mention_users = +      tag +      |> Enum.filter(fn tag -> tag["type"] == "Mention" end) +      |> Enum.map(& &1["href"]) +      |> Enum.reject(&is_nil/1) +      |> Enum.map(fn ap_id_or_uri -> +        case User.get_or_fetch_by_ap_id(ap_id_or_uri) do +          {:ok, user} -> {ap_id_or_uri, user} +          _ -> {ap_id_or_uri, User.get_by_uri(ap_id_or_uri)} +        end +      end) +      |> Enum.reject(fn {_, user} -> user == nil end) +      |> Enum.into(%{}) + +    explicitly_mentioned_uris = extract_mention_uris_from_content(content) + +    added_mentions = +      Enum.reduce(mention_users, "", fn {uri, user}, acc -> +        unless uri in explicitly_mentioned_uris do +          acc <> Formatter.mention_from_user(user) +        else +          acc +        end +      end) + +    content = +      if added_mentions != "", +        do: added_mentions <> " " <> content, +        else: content + +    {:ok, put_in(object["object"]["content"], content)} +  end + +  @impl true +  def filter(object), do: {:ok, object} + +  @impl true +  def describe, do: {:ok, %{}} +end diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index f24979048..fa6c20a30 100644 --- a/lib/pleroma/web/mastodon_api/views/instance_view.ex +++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex @@ -67,6 +67,9 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do        "shareable_emoji_packs",        "multifetch",        "pleroma:api/v1/notifications:include_types_filter", +      if Config.get([:activitypub, :blockers_visible]) do +        "blockers_visible" +      end,        if Config.get([:media_proxy, :enabled]) do          "media_proxy"        end, diff --git a/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex b/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex index 29ea7c5fb..27600253c 100644 --- a/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex +++ b/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex @@ -10,7 +10,7 @@  <%= form_for @conn, Routes.mfa_verify_path(@conn, :verify), [as: "mfa"], fn f -> %>  <div class="input">    <%= label f, :code, "Authentication code" %> -  <%= text_input f, :code, [autocomplete: false, autocorrect: "off", autocapitalize: "off", autofocus: true, pattern: "[0-9]*", spellcheck: false] %> +  <%= text_input f, :code, [autocomplete: "one-time-code", autocorrect: "off", autocapitalize: "off", autofocus: true, pattern: "[0-9]*", spellcheck: false] %>    <%= hidden_input f, :mfa_token, value: @mfa_token %>    <%= hidden_input f, :state, value: @state %>    <%= hidden_input f, :redirect_uri, value: @redirect_uri %> diff --git a/lib/pleroma/web/templates/o_auth/o_auth/register.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/register.html.eex index 99f900fb7..3ac428b2f 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/register.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/register.html.eex @@ -12,11 +12,11 @@  <div class="input">    <%= label f, :nickname, "Nickname" %> -  <%= text_input f, :nickname, value: @nickname %> +  <%= text_input f, :nickname, value: @nickname, autocomplete: "username" %>  </div>  <div class="input">    <%= label f, :email, "Email" %> -  <%= text_input f, :email, value: @email %> +  <%= text_input f, :email, value: @email, autocomplete: "email" %>  </div>  <%= submit "Proceed as new user", name: "op", value: "register" %> @@ -25,11 +25,11 @@  <div class="input">    <%= label f, :name, "Name or email" %> -  <%= text_input f, :name %> +  <%= text_input f, :name, autocomplete: "username" %>  </div>  <div class="input">    <%= label f, :password, "Password" %> -  <%= password_input f, :password %> +  <%= password_input f, :password, autocomplete: "password" %>  </div>  <%= submit "Proceed as existing user", name: "op", value: "connect" %> diff --git a/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex index 181a9519a..d63da6c1d 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex @@ -35,7 +35,7 @@        <p>Choose carefully! You won't be able to change this later. You will be able to change your display name, though.</p>        <div class="input">          <%= label f, :nickname, "Pleroma Handle" %> -        <%= text_input f, :nickname, placeholder: "lain" %> +        <%= text_input f, :nickname, placeholder: "lain", autocomplete: "username" %>        </div>        <%= hidden_input f, :name, value: @params["name"] %>        <%= hidden_input f, :password, value: @params["password"] %> diff --git a/lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex b/lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex index a8026fa9d..bc5fb28e3 100644 --- a/lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex +++ b/lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex @@ -5,9 +5,9 @@  <p><%= @followee.nickname %></p>  <img height="128" width="128" src="<%= avatar_url(@followee) %>">  <%= form_for @conn, Routes.remote_follow_path(@conn, :do_follow), [as: "authorization"], fn f -> %> -<%= text_input f, :name, placeholder: "Username", required: true %> +<%= text_input f, :name, placeholder: "Username", required: true, autocomplete: "username" %>  <br> -<%= password_input f, :password, placeholder: "Password", required: true %> +<%= password_input f, :password, placeholder: "Password", required: true, autocomplete: "password" %>  <br>  <%= hidden_input f, :id, value: @followee.id %>  <%= submit "Authorize" %> | 
