Slon/Modules/NodeInfo: Implement .well-known/nodeinfo and nodeinfo/2.0

This commit is contained in:
Alec Murphy 2025-02-21 17:44:54 -05:00
parent 545d408512
commit 614e68194b
5 changed files with 44 additions and 0 deletions

View file

@ -0,0 +1,4 @@
if (!StrICmp("/nodeinfo/2.0", @slon_http_request_path(session))) {
@slon_nodeinfo_20(session);
return;
}

View file

@ -3,6 +3,11 @@ if (!StrICmp("/.well-known/host-meta", @slon_http_request_path(session))) {
return;
}
if (!StrICmp("/.well-known/nodeinfo", @slon_http_request_path(session))) {
@slon_nodeinfo(session);
return;
}
if (!StrICmp("/.well-known/oauth-authorization-server", @slon_http_request_path(session))) {
@slon_oauth_well_known(session);
return;

View file

@ -500,6 +500,7 @@ U0 @slon_http_handle_get_request(SlonHttpSession* session)
#include "Endpoints/Get/FollowedTags";
#include "Endpoints/Get/Instance";
#include "Endpoints/Get/Notifications";
#include "Endpoints/Get/NodeInfo";
#include "Endpoints/Get/OAuth";
#include "Endpoints/Get/Search";
#include "Endpoints/Get/Suggestions";

View file

@ -29,6 +29,7 @@ WinMax(Fs);
#include "Modules/ActivityPub";
#include "Modules/Meta";
#include "Modules/NodeInfo";
#include "Modules/OAuth";
#include "Modules/Web";
#include "Modules/Webfinger";

33
Slon/Modules/NodeInfo.HC Normal file
View file

@ -0,0 +1,33 @@
U0 @slon_nodeinfo(SlonHttpSession* session)
{
SLON_SCRATCH_BUFFER_AND_REQUEST_JSON
no_warn request_json;
StrPrint(scratch_buffer, "{\"links\":[{\"rel\":\"http://nodeinfo.diaspora.software/ns/schema/2.0\",\"href\":\"https://%s/nodeinfo/2.0\"}]}", db->o("instance")->@("uri"));
@slon_http_set_content_type(session, "application/json; charset=utf-8");
session->send(scratch_buffer);
}
U0 @slon_nodeinfo_20(SlonHttpSession* session)
{
JsonObject* nodeinfo = Json.CreateObject();
nodeinfo->set("version", "2.0", JSON_STRING);
nodeinfo->set("software", Json.CreateObject(), JSON_OBJECT);
nodeinfo->o("software")->set("name", "slon", JSON_STRING);
nodeinfo->o("software")->set("version", db->o("instance")->@("version"), JSON_STRING);
nodeinfo->set("protocols", Json.Parse("[\"activitypub\"]"), JSON_ARRAY);
nodeinfo->set("services", Json.Parse("{\"outbound\":[],\"inbound\":[]}"), JSON_OBJECT);
nodeinfo->set("usage", Json.CreateObject(), JSON_OBJECT);
nodeinfo->o("usage")->set("users", Json.CreateObject(), JSON_OBJECT);
nodeinfo->o("usage")->o("users")->set("total", db->o("instance")->o("stats")->@("user_count"), JSON_NUMBER);
// FIXME: return activeMonth, activeHalfyear
nodeinfo->o("usage")->o("users")->set("activeMonth", 0, JSON_NUMBER);
nodeinfo->o("usage")->o("users")->set("activeHalfyear", 0, JSON_NUMBER);
nodeinfo->set("localPosts", db->o("instance")->o("stats")->@("status_count"), JSON_NUMBER);
nodeinfo->set("openRegistrations", db->o("instance")->@("registrations"), JSON_BOOLEAN);
nodeinfo->set("metadata", Json.CreateObject(), JSON_OBJECT);
nodeinfo->o("metadata")->set("nodeName", db->o("instance")->@("title"), JSON_STRING);
nodeinfo->o("metadata")->set("nodeDescription", db->o("instance")->@("description"), JSON_STRING);
session->send(nodeinfo);
Json.Delete(nodeinfo);
}