lemoncurry/wellknowns/views/host_meta.py

84 lines
2.6 KiB
Python
Raw Permalink Normal View History

from django.conf import settings
from django.http import HttpResponse, JsonResponse
from django.urls import reverse
from lemoncurry.utils import load_package_json, origin
from urllib.parse import urljoin
from xrd import XRD, Attribute, Element, Link
def add_links(request, dest):
base = origin(request)
pkg = load_package_json()
webfinger = reverse('wellknowns:webfinger') + '?resource={uri}'
license = 'https://creativecommons.org/licenses/by-sa/4.0/'
links = (
Link(
href=urljoin(base, reverse('entries:atom')),
rel='alternate', type_='application/atom+xml',
),
2017-11-03 02:19:25 -04:00
Link(
href=urljoin(base, reverse('entries:rss')),
rel='alternate', type_='application/rss+xml',
),
Link(
href=urljoin(base, reverse('lemonauth:indie')),
rel='authorization_endpoint'
2017-11-03 02:19:25 -04:00
),
Link(href=pkg['repository'], type_='text/html', rel='code-repository'),
Link(href=settings.PUSH_HUB, rel='hub'),
Link(href=license, type_='text/html', rel='license'),
Link(href=license+'rdf', type_='application/rdf+xml', rel='license'),
Link(
template=urljoin(base, webfinger),
type_='application/json', rel='lrdd',
),
Link(
href=urljoin(base, reverse('wellknowns:manifest')),
rel='manifest', type_='application/json',
),
Link(
href=urljoin(base, reverse('micropub:micropub')),
rel='micropub'
),
Link(
href=urljoin(base, reverse('lemonauth:token')),
rel='token_endpoint'
),
Link(href='https://openid.indieauth.com/openid', rel='openid.server'),
Link(href=base, rel='openid.delegate'),
)
dest.extend(links)
def host_meta(request):
h = XRD(subject='https://' + request.site.domain)
add_links(request, h.links)
return h
def host_meta_xml(request):
return HttpResponse(
host_meta(request).to_xml().toprettyxml(indent=' ', encoding='utf-8'),
content_type='application/xrd+xml',
)
# The XRD package doesn't actually generate correct JSON, so we have to do it
# ourselves instead.
def host_meta_json(request):
meta = host_meta(request)
links = []
for l in meta.links:
link = {
'rel': l.rel, 'type': l.type,
'href': l.href, 'template': l.template,
}
for k in list(link.keys()):
if not link[k]:
del link[k]
links.append(link)
meta = {'links': links, 'subject': meta.subject}
return JsonResponse(meta)