logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

instance_view.ex (7916B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.MastodonAPI.InstanceView do
  5. use Pleroma.Web, :view
  6. alias Pleroma.Config
  7. alias Pleroma.Web.ActivityPub.MRF
  8. @mastodon_api_level "2.7.2"
  9. def render("show.json", _) do
  10. instance = Config.get(:instance)
  11. common_information(instance)
  12. |> Map.merge(%{
  13. uri: Pleroma.Web.WebFinger.host(),
  14. description: Keyword.get(instance, :description),
  15. short_description: Keyword.get(instance, :short_description),
  16. email: Keyword.get(instance, :email),
  17. urls: %{
  18. streaming_api: Pleroma.Web.Endpoint.websocket_url()
  19. },
  20. stats: Pleroma.Stats.get_stats(),
  21. thumbnail:
  22. URI.merge(Pleroma.Web.Endpoint.url(), Keyword.get(instance, :instance_thumbnail))
  23. |> to_string,
  24. registrations: Keyword.get(instance, :registrations_open),
  25. approval_required: Keyword.get(instance, :account_approval_required),
  26. configuration: configuration(),
  27. # Extra (not present in Mastodon):
  28. max_toot_chars: Keyword.get(instance, :limit),
  29. max_media_attachments: Keyword.get(instance, :max_media_attachments),
  30. poll_limits: Keyword.get(instance, :poll_limits),
  31. upload_limit: Keyword.get(instance, :upload_limit),
  32. avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
  33. background_upload_limit: Keyword.get(instance, :background_upload_limit),
  34. banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
  35. background_image: Pleroma.Web.Endpoint.url() <> Keyword.get(instance, :background_image),
  36. shout_limit: Config.get([:shout, :limit]),
  37. description_limit: Keyword.get(instance, :description_limit),
  38. chat_limit: Keyword.get(instance, :chat_limit),
  39. pleroma: pleroma_configuration(instance)
  40. })
  41. end
  42. def render("show2.json", _) do
  43. instance = Config.get(:instance)
  44. common_information(instance)
  45. |> Map.merge(%{
  46. domain: Pleroma.Web.WebFinger.host(),
  47. source_url: Pleroma.Application.repository(),
  48. description: Keyword.get(instance, :short_description),
  49. usage: %{users: %{active_month: Pleroma.User.active_user_count()}},
  50. thumbnail: %{
  51. url:
  52. URI.merge(Pleroma.Web.Endpoint.url(), Keyword.get(instance, :instance_thumbnail))
  53. |> to_string
  54. },
  55. configuration: configuration2(),
  56. registrations: %{
  57. enabled: Keyword.get(instance, :registrations_open),
  58. approval_required: Keyword.get(instance, :account_approval_required),
  59. message: nil
  60. },
  61. contact: %{
  62. email: Keyword.get(instance, :email),
  63. account: nil
  64. },
  65. # Extra (not present in Mastodon):
  66. pleroma: pleroma_configuration2(instance)
  67. })
  68. end
  69. defp common_information(instance) do
  70. %{
  71. title: Keyword.get(instance, :name),
  72. version: "#{@mastodon_api_level} (compatible; #{Pleroma.Application.named_version()})",
  73. languages: Keyword.get(instance, :languages, ["en"])
  74. }
  75. end
  76. def features do
  77. [
  78. "pleroma_api",
  79. "mastodon_api",
  80. "mastodon_api_streaming",
  81. "polls",
  82. "v2_suggestions",
  83. "pleroma_explicit_addressing",
  84. "shareable_emoji_packs",
  85. "multifetch",
  86. "pleroma:api/v1/notifications:include_types_filter",
  87. "editing",
  88. "quote_posting",
  89. if Config.get([:activitypub, :blockers_visible]) do
  90. "blockers_visible"
  91. end,
  92. if Config.get([:media_proxy, :enabled]) do
  93. "media_proxy"
  94. end,
  95. if Config.get([:gopher, :enabled]) do
  96. "gopher"
  97. end,
  98. # backwards compat
  99. if Config.get([:shout, :enabled]) do
  100. "chat"
  101. end,
  102. if Config.get([:shout, :enabled]) do
  103. "shout"
  104. end,
  105. if Config.get([:instance, :allow_relay]) do
  106. "relay"
  107. end,
  108. if Config.get([:instance, :safe_dm_mentions]) do
  109. "safe_dm_mentions"
  110. end,
  111. "pleroma_emoji_reactions",
  112. "pleroma_custom_emoji_reactions",
  113. "pleroma_chat_messages",
  114. if Config.get([:instance, :show_reactions]) do
  115. "exposable_reactions"
  116. end,
  117. if Config.get([:instance, :profile_directory]) do
  118. "profile_directory"
  119. end,
  120. "pleroma:get:main/ostatus",
  121. "pleroma:group_actors"
  122. ]
  123. |> Enum.filter(& &1)
  124. end
  125. def federation do
  126. quarantined = Config.get([:instance, :quarantined_instances], [])
  127. if Config.get([:mrf, :transparency]) do
  128. {:ok, data} = MRF.describe()
  129. data
  130. |> Map.put(
  131. :quarantined_instances,
  132. Enum.map(quarantined, fn {instance, _reason} -> instance end)
  133. )
  134. # This is for backwards compatibility. We originally didn't sent
  135. # extra info like a reason why an instance was rejected/quarantined/etc.
  136. # Because we didn't want to break backwards compatibility it was decided
  137. # to add an extra "info" key.
  138. |> Map.put(:quarantined_instances_info, %{
  139. "quarantined_instances" =>
  140. quarantined
  141. |> Enum.map(fn {instance, reason} -> {instance, %{"reason" => reason}} end)
  142. |> Map.new()
  143. })
  144. else
  145. %{}
  146. end
  147. |> Map.put(:enabled, Config.get([:instance, :federating]))
  148. end
  149. defp fields_limits do
  150. %{
  151. max_fields: Config.get([:instance, :max_account_fields]),
  152. max_remote_fields: Config.get([:instance, :max_remote_account_fields]),
  153. name_length: Config.get([:instance, :account_field_name_length]),
  154. value_length: Config.get([:instance, :account_field_value_length])
  155. }
  156. end
  157. defp configuration do
  158. %{
  159. statuses: %{
  160. max_characters: Config.get([:instance, :limit]),
  161. max_media_attachments: Config.get([:instance, :max_media_attachments])
  162. },
  163. media_attachments: %{
  164. image_size_limit: Config.get([:instance, :upload_limit]),
  165. video_size_limit: Config.get([:instance, :upload_limit])
  166. },
  167. polls: %{
  168. max_options: Config.get([:instance, :poll_limits, :max_options]),
  169. max_characters_per_option: Config.get([:instance, :poll_limits, :max_option_chars]),
  170. min_expiration: Config.get([:instance, :poll_limits, :min_expiration]),
  171. max_expiration: Config.get([:instance, :poll_limits, :max_expiration])
  172. }
  173. }
  174. end
  175. defp configuration2 do
  176. configuration()
  177. |> Map.merge(%{
  178. urls: %{streaming: Pleroma.Web.Endpoint.websocket_url()}
  179. })
  180. end
  181. defp pleroma_configuration(instance) do
  182. %{
  183. metadata: %{
  184. account_activation_required: Keyword.get(instance, :account_activation_required),
  185. features: features(),
  186. federation: federation(),
  187. fields_limits: fields_limits(),
  188. post_formats: Config.get([:instance, :allowed_post_formats]),
  189. birthday_required: Config.get([:instance, :birthday_required]),
  190. birthday_min_age: Config.get([:instance, :birthday_min_age])
  191. },
  192. stats: %{mau: Pleroma.User.active_user_count()},
  193. vapid_public_key: Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key)
  194. }
  195. end
  196. defp pleroma_configuration2(instance) do
  197. configuration = pleroma_configuration(instance)
  198. configuration
  199. |> Map.merge(%{
  200. metadata:
  201. configuration.metadata
  202. |> Map.merge(%{
  203. avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
  204. background_upload_limit: Keyword.get(instance, :background_upload_limit),
  205. banner_upload_limit: Keyword.get(instance, :banner_upload_limit),
  206. background_image:
  207. Pleroma.Web.Endpoint.url() <> Keyword.get(instance, :background_image),
  208. chat_limit: Keyword.get(instance, :chat_limit),
  209. description_limit: Keyword.get(instance, :description_limit),
  210. shout_limit: Config.get([:shout, :limit])
  211. })
  212. })
  213. end
  214. end