ChatMessageValidator: Additional validation.
[akkoma] / lib / pleroma / web / mastodon_api / views / instance_view.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.MastodonAPI.InstanceView do
6 use Pleroma.Web, :view
7
8 alias Pleroma.Config
9 alias Pleroma.Web.ActivityPub.MRF
10
11 @mastodon_api_level "2.7.2"
12
13 def render("show.json", _) do
14 instance = Config.get(:instance)
15
16 %{
17 uri: Pleroma.Web.base_url(),
18 title: Keyword.get(instance, :name),
19 description: Keyword.get(instance, :description),
20 version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})",
21 email: Keyword.get(instance, :email),
22 urls: %{
23 streaming_api: Pleroma.Web.Endpoint.websocket_url()
24 },
25 stats: Pleroma.Stats.get_stats(),
26 thumbnail: Keyword.get(instance, :instance_thumbnail),
27 languages: ["en"],
28 registrations: Keyword.get(instance, :registrations_open),
29 # Extra (not present in Mastodon):
30 max_toot_chars: Keyword.get(instance, :limit),
31 poll_limits: Keyword.get(instance, :poll_limits),
32 upload_limit: Keyword.get(instance, :upload_limit),
33 avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
34 background_upload_limit: Keyword.get(instance, :background_upload_limit),
35 banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
36 background_image: Keyword.get(instance, :background_image),
37 pleroma: %{
38 metadata: %{
39 account_activation_required: Keyword.get(instance, :account_activation_required),
40 features: features(),
41 federation: federation(),
42 fields_limits: fields_limits()
43 },
44 vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
45 }
46 }
47 end
48
49 def features do
50 [
51 "pleroma_api",
52 "mastodon_api",
53 "mastodon_api_streaming",
54 "polls",
55 "pleroma_explicit_addressing",
56 "shareable_emoji_packs",
57 "multifetch",
58 "pleroma:api/v1/notifications:include_types_filter",
59 if Config.get([:media_proxy, :enabled]) do
60 "media_proxy"
61 end,
62 if Config.get([:gopher, :enabled]) do
63 "gopher"
64 end,
65 if Config.get([:chat, :enabled]) do
66 "chat"
67 end,
68 if Config.get([:instance, :allow_relay]) do
69 "relay"
70 end,
71 if Config.get([:instance, :safe_dm_mentions]) do
72 "safe_dm_mentions"
73 end,
74 "pleroma_emoji_reactions",
75 "pleroma_chat_messages"
76 ]
77 |> Enum.filter(& &1)
78 end
79
80 def federation do
81 quarantined = Config.get([:instance, :quarantined_instances], [])
82
83 if Config.get([:mrf, :transparency]) do
84 {:ok, data} = MRF.describe()
85
86 data
87 |> Map.merge(%{quarantined_instances: quarantined})
88 else
89 %{}
90 end
91 |> Map.put(:enabled, Config.get([:instance, :federating]))
92 end
93
94 def fields_limits do
95 %{
96 max_fields: Config.get([:instance, :max_account_fields]),
97 max_remote_fields: Config.get([:instance, :max_remote_account_fields]),
98 name_length: Config.get([:instance, :account_field_name_length]),
99 value_length: Config.get([:instance, :account_field_value_length])
100 }
101 end
102 end