1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Web.MastodonAPI.InstanceView do
9 alias Pleroma.Web.ActivityPub.MRF
11 @mastodon_api_level "2.7.2"
13 def render("show.json", _) do
14 instance = Config.get(:instance)
16 common_information(instance)
18 uri: Pleroma.Web.WebFinger.host(),
19 description: Keyword.get(instance, :description),
20 short_description: Keyword.get(instance, :short_description),
21 email: Keyword.get(instance, :email),
23 streaming_api: Pleroma.Web.Endpoint.websocket_url()
25 stats: Pleroma.Stats.get_stats(),
27 URI.merge(Pleroma.Web.Endpoint.url(), Keyword.get(instance, :instance_thumbnail))
29 registrations: Keyword.get(instance, :registrations_open),
30 approval_required: Keyword.get(instance, :account_approval_required),
31 contact_account: contact_account(Keyword.get(instance, :contact_username)),
32 configuration: configuration(),
33 # Extra (not present in Mastodon):
34 max_toot_chars: Keyword.get(instance, :limit),
35 max_media_attachments: Keyword.get(instance, :max_media_attachments),
36 poll_limits: Keyword.get(instance, :poll_limits),
37 upload_limit: Keyword.get(instance, :upload_limit),
38 avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
39 background_upload_limit: Keyword.get(instance, :background_upload_limit),
40 banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
41 background_image: Pleroma.Web.Endpoint.url() <> Keyword.get(instance, :background_image),
42 shout_limit: Config.get([:shout, :limit]),
43 description_limit: Keyword.get(instance, :description_limit),
44 chat_limit: Keyword.get(instance, :chat_limit),
45 pleroma: pleroma_configuration(instance)
49 def render("show2.json", _) do
50 instance = Config.get(:instance)
52 common_information(instance)
54 domain: Pleroma.Web.WebFinger.host(),
55 source_url: Pleroma.Application.repository(),
56 description: Keyword.get(instance, :short_description),
57 usage: %{users: %{active_month: Pleroma.User.active_user_count()}},
60 URI.merge(Pleroma.Web.Endpoint.url(), Keyword.get(instance, :instance_thumbnail))
63 configuration: configuration2(),
65 enabled: Keyword.get(instance, :registrations_open),
66 approval_required: Keyword.get(instance, :account_approval_required),
71 email: Keyword.get(instance, :email),
72 account: contact_account(Keyword.get(instance, :contact_username))
74 # Extra (not present in Mastodon):
75 pleroma: pleroma_configuration2(instance)
79 defp common_information(instance) do
81 title: Keyword.get(instance, :name),
82 version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})",
83 languages: Keyword.get(instance, :languages, ["en"]),
92 "mastodon_api_streaming",
95 "pleroma_explicit_addressing",
96 "shareable_emoji_packs",
98 "pleroma:api/v1/notifications:include_types_filter",
101 if Config.get([:activitypub, :blockers_visible]) do
104 if Config.get([:media_proxy, :enabled]) do
107 if Config.get([:gopher, :enabled]) do
111 if Config.get([:shout, :enabled]) do
114 if Config.get([:shout, :enabled]) do
117 if Config.get([:instance, :allow_relay]) do
120 if Config.get([:instance, :safe_dm_mentions]) do
123 "pleroma_emoji_reactions",
124 "pleroma_custom_emoji_reactions",
125 "pleroma_chat_messages",
126 if Config.get([:instance, :show_reactions]) do
127 "exposable_reactions"
129 if Config.get([:instance, :profile_directory]) do
132 "pleroma:get:main/ostatus",
133 "pleroma:group_actors",
134 "pleroma:bookmark_folders"
140 quarantined = Config.get([:instance, :quarantined_instances], [])
142 if Config.get([:mrf, :transparency]) do
143 {:ok, data} = MRF.describe()
147 :quarantined_instances,
148 Enum.map(quarantined, fn {instance, _reason} -> instance end)
150 # This is for backwards compatibility. We originally didn't sent
151 # extra info like a reason why an instance was rejected/quarantined/etc.
152 # Because we didn't want to break backwards compatibility it was decided
153 # to add an extra "info" key.
154 |> Map.put(:quarantined_instances_info, %{
155 "quarantined_instances" =>
157 |> Enum.map(fn {instance, reason} -> {instance, %{"reason" => reason}} end)
163 |> Map.put(:enabled, Config.get([:instance, :federating]))
166 defp fields_limits do
168 max_fields: Config.get([:instance, :max_account_fields]),
169 max_remote_fields: Config.get([:instance, :max_remote_account_fields]),
170 name_length: Config.get([:instance, :account_field_name_length]),
171 value_length: Config.get([:instance, :account_field_value_length])
175 defp contact_account(nil), do: nil
177 defp contact_account("@" <> username) do
178 contact_account(username)
181 defp contact_account(username) do
182 user = Pleroma.User.get_cached_by_nickname(username)
185 Pleroma.Web.MastodonAPI.AccountView.render("show.json", %{user: user, for: nil})
191 defp configuration do
197 max_characters: Config.get([:instance, :limit]),
198 max_media_attachments: Config.get([:instance, :max_media_attachments])
200 media_attachments: %{
201 image_size_limit: Config.get([:instance, :upload_limit]),
202 video_size_limit: Config.get([:instance, :upload_limit]),
203 supported_mime_types: ["application/octet-stream"]
206 max_options: Config.get([:instance, :poll_limits, :max_options]),
207 max_characters_per_option: Config.get([:instance, :poll_limits, :max_option_chars]),
208 min_expiration: Config.get([:instance, :poll_limits, :min_expiration]),
209 max_expiration: Config.get([:instance, :poll_limits, :max_expiration])
214 defp configuration2 do
216 |> put_in([:accounts, :max_pinned_statuses], Config.get([:instance, :max_pinned_statuses], 0))
217 |> put_in([:statuses, :characters_reserved_per_url], 0)
220 streaming: Pleroma.Web.Endpoint.websocket_url(),
221 status: Config.get([:instance, :status_page])
224 public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
229 defp pleroma_configuration(instance) do
232 account_activation_required: Keyword.get(instance, :account_activation_required),
233 features: features(),
234 federation: federation(),
235 fields_limits: fields_limits(),
236 post_formats: Config.get([:instance, :allowed_post_formats]),
237 birthday_required: Config.get([:instance, :birthday_required]),
238 birthday_min_age: Config.get([:instance, :birthday_min_age])
240 stats: %{mau: Pleroma.User.active_user_count()},
241 vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
245 defp pleroma_configuration2(instance) do
246 configuration = pleroma_configuration(instance)
251 configuration.metadata
253 avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
254 background_upload_limit: Keyword.get(instance, :background_upload_limit),
255 banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
257 Pleroma.Web.Endpoint.url() <> Keyword.get(instance, :background_image),
258 chat_limit: Keyword.get(instance, :chat_limit),
259 description_limit: Keyword.get(instance, :description_limit),
260 shout_limit: Config.get([:shout, :limit])