1
0
Fork 0

Moves federation info endpoints into views module

This commit is contained in:
Mouse Reeve 2021-03-13 10:58:54 -08:00
parent 393ea625a2
commit 139416d9c3
5 changed files with 103 additions and 28 deletions

View file

@ -14,6 +14,7 @@ from .import_data import Import, ImportStatus
from .inbox import Inbox
from .interaction import Favorite, Unfavorite, Boost, Unboost
from .invite import ManageInvites, Invite
from .isbn import Isbn
from .landing import About, Home, Discover
from .list import Lists, List, Curate, UserLists
from .notifications import Notifications
@ -32,4 +33,4 @@ from .status import CreateStatus, DeleteStatus
from .tag import Tag, AddTag, RemoveTag
from .updates import Updates
from .user import User, EditUser, Followers, Following
from .isbn import Isbn
from .wellknown import webfinger, nodeinfo_pointer, nodeinfo, instance_info, peers

120
bookwyrm/views/wellknown.py Normal file
View file

@ -0,0 +1,120 @@
""" responds to various requests to /.well-know """
from dateutil.relativedelta import relativedelta
from django.http import HttpResponseNotFound
from django.http import JsonResponse
from django.utils import timezone
from django.views.decorators.http import require_GET
from bookwyrm import models
from bookwyrm.settings import DOMAIN, VERSION
@require_GET
def webfinger(request):
""" allow other servers to ask about a user """
resource = request.GET.get("resource")
if not resource or not resource.startswith("acct:"):
return HttpResponseNotFound()
username = resource.replace("acct:", "")
try:
user = models.User.objects.get(username=username)
except models.User.DoesNotExist:
return HttpResponseNotFound("No account found")
return JsonResponse(
{
"subject": "acct:%s" % (user.username),
"links": [
{
"rel": "self",
"type": "application/activity+json",
"href": user.remote_id,
}
],
}
)
@require_GET
def nodeinfo_pointer(_):
""" direct servers to nodeinfo """
return JsonResponse(
{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": "https://%s/nodeinfo/2.0" % DOMAIN,
}
]
}
)
@require_GET
def nodeinfo(_):
""" basic info about the server """
status_count = models.Status.objects.filter(user__local=True).count()
user_count = models.User.objects.filter(local=True).count()
month_ago = timezone.now() - relativedelta(months=1)
last_month_count = models.User.objects.filter(
local=True, last_active_date__gt=month_ago
).count()
six_months_ago = timezone.now() - relativedelta(months=6)
six_month_count = models.User.objects.filter(
local=True, last_active_date__gt=six_months_ago
).count()
site = models.SiteSettings.get()
return JsonResponse(
{
"version": "2.0",
"software": {"name": "bookwyrm", "version": VERSION},
"protocols": ["activitypub"],
"usage": {
"users": {
"total": user_count,
"activeMonth": last_month_count,
"activeHalfyear": six_month_count,
},
"localPosts": status_count,
},
"openRegistrations": site.allow_registration,
}
)
@require_GET
def instance_info(_):
""" let's talk about your cool unique instance """
user_count = models.User.objects.filter(local=True).count()
status_count = models.Status.objects.filter(user__local=True).count()
site = models.SiteSettings.get()
return JsonResponse(
{
"uri": DOMAIN,
"title": site.name,
"short_description": "",
"description": site.instance_description,
"version": "0.0.1",
"stats": {
"user_count": user_count,
"status_count": status_count,
},
"thumbnail": "https://%s/static/images/logo.png" % DOMAIN,
"languages": ["en"],
"registrations": site.allow_registration,
"approval_required": False,
}
)
@require_GET
def peers(_):
""" list of federated servers this instance connects with """
names = models.FederatedServer.objects.values_list("server_name", flat=True)
return JsonResponse(list(names), safe=False)