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