Profile and post pages, NodeInfo 2.1, and FEDERATION.md
/@user and /@user/{id} are Razor pages showing an avatar's or community's
public and unlisted posts: no scripts, a strict CSP, no-referrer, noindex,
and an alternate link to the ActivityPub document. A client asking them
for activity+json is redirected to the actor or note, and the actor and
note redirect browsers here.
NodeInfo answers 2.1 as well as 2.0 (repository, homepage, a link to
FEDERATION.md) and counts only public local posts.
FEDERATION.md (FEP-67ff) lists the protocols, FEPs, route names,
activities and the security rules a peer will notice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
1 parent
e54e17708f
commit
9ec1f9930b
11 files changed
+368
-12
No files matched your search
@@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Mvc;
|
||||
using MongoDB.Entities;
|
||||
|
||||
using PrivaPub.Models.Federation;
|
||||
using PrivaPub.Models.Post;
|
||||
using PrivaPub.Models.User;
|
||||
using PrivaPub.StaticServices;
|
||||
|
||||
@@ -64,24 +65,37 @@ namespace PrivaPub.Federation.Controllers
|
||||
{
|
||||
var document = new JsonObject
|
||||
{
|
||||
["links"] = new JsonArray(new JsonObject
|
||||
{
|
||||
["rel"] = "http://nodeinfo.diaspora.software/ns/schema/2.0",
|
||||
["href"] = $"{_localActors.BaseAddress}/nodeinfo/2.0"
|
||||
})
|
||||
["links"] = new JsonArray(
|
||||
new JsonObject
|
||||
{
|
||||
["rel"] = "http://nodeinfo.diaspora.software/ns/schema/2.1",
|
||||
["href"] = $"{_localActors.BaseAddress}/nodeinfo/2.1"
|
||||
},
|
||||
new JsonObject
|
||||
{
|
||||
["rel"] = "http://nodeinfo.diaspora.software/ns/schema/2.0",
|
||||
["href"] = $"{_localActors.BaseAddress}/nodeinfo/2.0"
|
||||
})
|
||||
};
|
||||
return Content(document.ToJsonString(), "application/json; charset=utf-8");
|
||||
}
|
||||
|
||||
[HttpGet, Route("/nodeinfo/2.0")]
|
||||
public async Task<IActionResult> NodeInfo(CancellationToken token)
|
||||
[HttpGet, Route("/nodeinfo/{version:regex(^2\\.[[01]]$)}")]
|
||||
public async Task<IActionResult> NodeInfo(string version, CancellationToken token)
|
||||
{
|
||||
var users = await DB.Default.CountAsync<Avatar>(a => !a.DeletionAt.HasValue, token);
|
||||
var posts = await DB.Default.CountAsync<PostEntity>(p => !p.IsFederatedCopy, token);
|
||||
var posts = await DB.Default.CountAsync<PostEntity>(p => !p.IsFederatedCopy && !p.DeletedAt.HasValue
|
||||
&& (p.Visibility == PostVisibility.Public || p.Visibility == PostVisibility.Unlisted), token);
|
||||
var software = new JsonObject { ["name"] = "privapub", ["version"] = BuildInfo.Ref };
|
||||
if (version == "2.1")
|
||||
{
|
||||
software["repository"] = "https://git.thepra.dev/thepra/SocialPub";
|
||||
software["homepage"] = "https://git.thepra.dev/thepra/SocialPub";
|
||||
}
|
||||
var document = new JsonObject
|
||||
{
|
||||
["version"] = "2.0",
|
||||
["software"] = new JsonObject { ["name"] = "privapub", ["version"] = BuildInfo.Ref },
|
||||
["version"] = version,
|
||||
["software"] = software,
|
||||
["protocols"] = new JsonArray("activitypub"),
|
||||
["services"] = new JsonObject { ["inbound"] = new JsonArray(), ["outbound"] = new JsonArray() },
|
||||
["openRegistrations"] = true,
|
||||
@@ -90,9 +104,15 @@ namespace PrivaPub.Federation.Controllers
|
||||
["users"] = new JsonObject { ["total"] = users },
|
||||
["localPosts"] = posts
|
||||
},
|
||||
["metadata"] = new JsonObject()
|
||||
["metadata"] = new JsonObject
|
||||
{
|
||||
["nodeName"] = "PrivaPub",
|
||||
["nodeDescription"] = "A small ActivityPub server where one private login keeps several unlinkable public personas.",
|
||||
["federation"] = new JsonObject { ["document"] = "https://git.thepra.dev/thepra/SocialPub/src/branch/master/FEDERATION.md" }
|
||||
}
|
||||
};
|
||||
return Content(document.ToJsonString(), "application/json; profile=\"http://nodeinfo.diaspora.software/ns/schema/2.0#\"; charset=utf-8");
|
||||
return Content(document.ToJsonString(),
|
||||
$"application/json; profile=\"http://nodeinfo.diaspora.software/ns/schema/{version}#\"; charset=utf-8");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user