moviewyrm/bookwyrm/views/wellknown.py

128 lines
3.7 KiB
Python
Raw Normal View History

2021-03-08 16:49:10 +00:00
""" responds to various requests to /.well-know """
2020-11-01 19:09:16 +00:00
from dateutil.relativedelta import relativedelta
2020-11-01 18:42:48 +00:00
from django.http import HttpResponseNotFound
2020-02-15 19:31:35 +00:00
from django.http import JsonResponse
2021-03-29 21:36:24 +00:00
from django.template.response import TemplateResponse
from django.utils import timezone
from django.views.decorators.http import require_GET
2020-02-15 19:31:35 +00:00
from bookwyrm import models
from bookwyrm.settings import DOMAIN, VERSION
2020-02-15 19:31:35 +00:00
@require_GET
2020-02-15 19:31:35 +00:00
def webfinger(request):
2021-04-26 16:15:42 +00:00
"""allow other servers to ask about a user"""
2021-03-08 16:49:10 +00:00
resource = request.GET.get("resource")
if not resource or not resource.startswith("acct:"):
2020-11-01 18:42:48 +00:00
return HttpResponseNotFound()
2021-03-08 16:49:10 +00:00
username = resource.replace("acct:", "")
2020-11-01 18:42:48 +00:00
try:
user = models.User.objects.get(username=username)
except models.User.DoesNotExist:
2021-03-08 16:49:10 +00:00
return HttpResponseNotFound("No account found")
return JsonResponse(
{
"subject": "acct:%s" % (user.username),
"links": [
{
"rel": "self",
"type": "application/activity+json",
"href": user.remote_id,
}
],
}
)
2020-02-15 19:31:35 +00:00
@require_GET
def nodeinfo_pointer(_):
2021-04-26 16:15:42 +00:00
"""direct servers to nodeinfo"""
2021-03-08 16:49:10 +00:00
return JsonResponse(
{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": "https://%s/nodeinfo/2.0" % DOMAIN,
}
]
}
)
2020-02-15 19:31:35 +00:00
2020-03-29 07:05:09 +00:00
@require_GET
def nodeinfo(_):
2021-04-26 16:15:42 +00:00
"""basic info about the server"""
2020-03-29 07:05:09 +00:00
status_count = models.Status.objects.filter(user__local=True).count()
2020-11-07 20:07:09 +00:00
user_count = models.User.objects.filter(local=True).count()
month_ago = timezone.now() - relativedelta(months=1)
last_month_count = models.User.objects.filter(
2021-03-08 16:49:10 +00:00
local=True, last_active_date__gt=month_ago
).count()
six_months_ago = timezone.now() - relativedelta(months=6)
six_month_count = models.User.objects.filter(
2021-03-08 16:49:10 +00:00
local=True, last_active_date__gt=six_months_ago
).count()
2020-11-08 05:07:07 +00:00
site = models.SiteSettings.get()
2021-03-08 16:49:10 +00:00
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,
2020-02-15 19:40:21 +00:00
},
2021-03-08 16:49:10 +00:00
"openRegistrations": site.allow_registration,
}
)
2020-02-15 19:40:21 +00:00
@require_GET
def instance_info(_):
2021-04-26 16:15:42 +00:00
"""let's talk about your cool unique instance"""
2020-11-08 05:07:07 +00:00
user_count = models.User.objects.filter(local=True).count()
status_count = models.Status.objects.filter(user__local=True).count()
site = models.SiteSettings.get()
2021-03-08 16:49:10 +00:00
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,
}
)
2020-03-29 07:05:09 +00:00
@require_GET
def peers(_):
2021-04-26 16:15:42 +00:00
"""list of federated servers this instance connects with"""
2021-03-08 16:49:10 +00:00
names = models.FederatedServer.objects.values_list("server_name", flat=True)
2020-03-29 22:51:43 +00:00
return JsonResponse(list(names), safe=False)
2021-03-29 21:36:24 +00:00
@require_GET
def host_meta(request):
2021-04-26 16:15:42 +00:00
"""meta of the host"""
2021-03-29 21:36:24 +00:00
return TemplateResponse(request, "host_meta.xml", {"DOMAIN": DOMAIN})