logo

pleroma

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

nodeinfo.ex (3398B)


  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.Nodeinfo.Nodeinfo do
  5. alias Pleroma.Config
  6. alias Pleroma.Stats
  7. alias Pleroma.User
  8. alias Pleroma.Web.ActivityPub.Publisher
  9. alias Pleroma.Web.MastodonAPI.InstanceView
  10. # returns a nodeinfo 2.0 map, since 2.1 just adds a repository field
  11. # under software.
  12. def get_nodeinfo("2.0") do
  13. stats = Stats.get_stats()
  14. staff_accounts =
  15. User.all_superusers()
  16. |> Enum.map(fn u -> u.ap_id end)
  17. federation = InstanceView.federation()
  18. features = InstanceView.features()
  19. %{
  20. version: "2.0",
  21. software: %{
  22. name: Pleroma.Application.name() |> String.downcase(),
  23. version: Pleroma.Application.version()
  24. },
  25. protocols: Publisher.gather_nodeinfo_protocol_names(),
  26. services: %{
  27. inbound: [],
  28. outbound: []
  29. },
  30. openRegistrations: Config.get([:instance, :registrations_open]),
  31. usage: %{
  32. users: %{
  33. total: Map.get(stats, :user_count, 0),
  34. activeMonth: Pleroma.User.active_user_count(30),
  35. activeHalfyear: Pleroma.User.active_user_count(180)
  36. },
  37. localPosts: Map.get(stats, :status_count, 0)
  38. },
  39. metadata: %{
  40. nodeName: Config.get([:instance, :name]),
  41. nodeDescription: Config.get([:instance, :description]),
  42. private: !Config.get([:instance, :public], true),
  43. suggestions: %{
  44. enabled: false
  45. },
  46. staffAccounts: staff_accounts,
  47. roles: %{
  48. admin: Config.get([:instance, :admin_privileges]),
  49. moderator: Config.get([:instance, :moderator_privileges])
  50. },
  51. federation: federation,
  52. pollLimits: Config.get([:instance, :poll_limits]),
  53. postFormats: Config.get([:instance, :allowed_post_formats]),
  54. uploadLimits: %{
  55. general: Config.get([:instance, :upload_limit]),
  56. avatar: Config.get([:instance, :avatar_upload_limit]),
  57. banner: Config.get([:instance, :banner_upload_limit]),
  58. background: Config.get([:instance, :background_upload_limit])
  59. },
  60. fieldsLimits: %{
  61. maxFields: Config.get([:instance, :max_account_fields]),
  62. maxRemoteFields: Config.get([:instance, :max_remote_account_fields]),
  63. nameLength: Config.get([:instance, :account_field_name_length]),
  64. valueLength: Config.get([:instance, :account_field_value_length])
  65. },
  66. accountActivationRequired: Config.get([:instance, :account_activation_required], false),
  67. invitesEnabled: Config.get([:instance, :invites_enabled], false),
  68. mailerEnabled: Config.get([Pleroma.Emails.Mailer, :enabled], false),
  69. features: features,
  70. restrictedNicknames: Config.get([Pleroma.User, :restricted_nicknames]),
  71. skipThreadContainment: Config.get([:instance, :skip_thread_containment], false)
  72. }
  73. }
  74. end
  75. def get_nodeinfo("2.1") do
  76. raw_response = get_nodeinfo("2.0")
  77. updated_software =
  78. raw_response
  79. |> Map.get(:software)
  80. |> Map.put(:repository, Pleroma.Application.repository())
  81. raw_response
  82. |> Map.put(:software, updated_software)
  83. |> Map.put(:version, "2.1")
  84. end
  85. def get_nodeinfo(_version) do
  86. {:error, :missing}
  87. end
  88. end