diff options
Diffstat (limited to 'lib')
8 files changed, 41 insertions, 8 deletions
| diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 0078f9831..b9989f901 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -138,6 +138,7 @@ defmodule Pleroma.User do      field(:also_known_as, {:array, :string}, default: [])      field(:inbox, :string)      field(:shared_inbox, :string) +    field(:accepts_chat_messages, :boolean, default: nil)      embeds_one(        :notification_settings, @@ -436,7 +437,8 @@ defmodule Pleroma.User do          :discoverable,          :invisible,          :actor_type, -        :also_known_as +        :also_known_as, +        :accepts_chat_messages        ]      )      |> validate_required([:name, :ap_id]) @@ -481,7 +483,8 @@ defmodule Pleroma.User do          :pleroma_settings_store,          :discoverable,          :actor_type, -        :also_known_as +        :also_known_as, +        :accepts_chat_messages        ]      )      |> unique_constraint(:nickname) @@ -620,6 +623,7 @@ defmodule Pleroma.User do    def register_changeset(struct, params \\ %{}, opts \\ []) do      bio_limit = Config.get([:instance, :user_bio_length], 5000)      name_limit = Config.get([:instance, :user_name_length], 100) +    params = Map.put_new(params, :accepts_chat_messages, true)      need_confirmation? =        if is_nil(opts[:need_confirmation]) do @@ -638,7 +642,8 @@ defmodule Pleroma.User do        :nickname,        :password,        :password_confirmation, -      :emoji +      :emoji, +      :accepts_chat_messages      ])      |> validate_required([:name, :nickname, :password, :password_confirmation])      |> validate_confirmation(:password) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 1c2908805..8da5cf938 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1226,6 +1226,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do        end)      locked = data["manuallyApprovesFollowers"] || false +    capabilities = data["capabilities"] || %{} +    accepts_chat_messages = capabilities["acceptsChatMessages"]      data = Transmogrifier.maybe_fix_user_object(data)      discoverable = data["discoverable"] || false      invisible = data["invisible"] || false @@ -1264,7 +1266,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do        also_known_as: Map.get(data, "alsoKnownAs", []),        public_key: public_key,        inbox: data["inbox"], -      shared_inbox: shared_inbox +      shared_inbox: shared_inbox, +      accepts_chat_messages: accepts_chat_messages      }      # nickname can be nil because of virtual actors diff --git a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex index c481d79e0..91b475393 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -93,12 +93,14 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do    - If both users are in our system    - If at least one of the users in this ChatMessage is a local user    - If the recipient is not blocking the actor +  - If the recipient is explicitly not accepting chat messages    """    def validate_local_concern(cng) do      with actor_ap <- get_field(cng, :actor),           {_, %User{} = actor} <- {:find_actor, User.get_cached_by_ap_id(actor_ap)},           {_, %User{} = recipient} <-             {:find_recipient, User.get_cached_by_ap_id(get_field(cng, :to) |> hd())}, +         {_, false} <- {:not_accepting_chats?, recipient.accepts_chat_messages == false},           {_, false} <- {:blocking_actor?, User.blocks?(recipient, actor)},           {_, true} <- {:local?, Enum.any?([actor, recipient], & &1.local)} do        cng @@ -107,6 +109,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do          cng          |> add_error(:actor, "actor is blocked by recipient") +      {:not_accepting_chats?, true} -> +        cng +        |> add_error(:to, "recipient does not accept chat messages") +        {:local?, false} ->          cng          |> add_error(:actor, "actor and recipient are both remote") diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index 4a02b09a1..3a4564912 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -81,6 +81,15 @@ defmodule Pleroma.Web.ActivityPub.UserView do      fields = Enum.map(user.fields, &Map.put(&1, "type", "PropertyValue")) +    capabilities = +      if is_boolean(user.accepts_chat_messages) do +        %{ +          "acceptsChatMessages" => user.accepts_chat_messages +        } +      else +        %{} +      end +      %{        "id" => user.ap_id,        "type" => user.actor_type, @@ -101,7 +110,8 @@ defmodule Pleroma.Web.ActivityPub.UserView do        "endpoints" => endpoints,        "attachment" => fields,        "tag" => emoji_tags, -      "discoverable" => user.discoverable +      "discoverable" => user.discoverable, +      "capabilities" => capabilities      }      |> Map.merge(maybe_make_image(&User.avatar_url/2, "icon", user))      |> Map.merge(maybe_make_image(&User.banner_url/2, "image", user)) diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex index b8c527606..952d9347b 100644 --- a/lib/pleroma/web/api_spec/operations/account_operation.ex +++ b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -61,7 +61,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do        description: "Update the user's display and preferences.",        operationId: "AccountController.update_credentials",        security: [%{"oAuth" => ["write:accounts"]}], -      requestBody: request_body("Parameters", update_creadentials_request(), required: true), +      requestBody: request_body("Parameters", update_credentials_request(), required: true),        responses: %{          200 => Operation.response("Account", "application/json", Account),          403 => Operation.response("Error", "application/json", ApiError) @@ -474,7 +474,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do      }    end -  defp update_creadentials_request do +  defp update_credentials_request do      %Schema{        title: "AccountUpdateCredentialsRequest",        description: "POST body for creating an account", @@ -508,6 +508,11 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do            nullable: true,            description: "Whether manual approval of follow requests is required."          }, +        accepts_chat_messages: %Schema{ +          allOf: [BooleanLike], +          nullable: true, +          description: "Whether the user accepts receiving chat messages." +        },          fields_attributes: %Schema{            nullable: true,            oneOf: [ diff --git a/lib/pleroma/web/api_spec/schemas/account.ex b/lib/pleroma/web/api_spec/schemas/account.ex index e6f163cb7..cf148bc9d 100644 --- a/lib/pleroma/web/api_spec/schemas/account.ex +++ b/lib/pleroma/web/api_spec/schemas/account.ex @@ -103,6 +103,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do              description:                "A generic map of settings for frontends. Opaque to the backend. Only returned in `verify_credentials` and `update_credentials`"            }, +          accepts_chat_messages: %Schema{type: :boolean, nullable: true},            favicon: %Schema{              type: :string,              format: :uri, @@ -175,6 +176,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do          "is_admin" => false,          "is_moderator" => false,          "skip_thread_containment" => false, +        "accepts_chat_messages" => true,          "chat_token" =>            "SFMyNTY.g3QAAAACZAAEZGF0YW0AAAASOXRLaTNlc2JHN09RZ1oyOTIwZAAGc2lnbmVkbgYARNplS3EB.Mb_Iaqew2bN1I1o79B_iP7encmVCpTKC4OtHZRxdjKc",          "unread_conversation_count" => 0, diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 743442855..fe5d022f5 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -163,7 +163,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do          :show_role,          :skip_thread_containment,          :allow_following_move, -        :discoverable +        :discoverable, +        :accepts_chat_messages        ]        |> Enum.reduce(%{}, fn key, acc ->          Maps.put_if_present(acc, key, params[key], &{:ok, truthy_param?(&1)}) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 2feba4778..bc9745044 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -258,6 +258,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do          relationship: relationship,          skip_thread_containment: user.skip_thread_containment,          background_image: image_url(user.background) |> MediaProxy.url(), +        accepts_chat_messages: user.accepts_chat_messages,          favicon: favicon        }      } | 
