bookwyrm/fedireads/federation.py

58 lines
1.6 KiB
Python
Raw Normal View History

2020-01-25 21:46:30 +00:00
''' activitystream api '''
2020-01-26 20:14:27 +00:00
from django.http import HttpResponse, HttpResponseBadRequest, \
HttpResponseNotFound, JsonResponse
2020-01-26 00:24:22 +00:00
from fedireads.settings import DOMAIN
from fedireads.models import User
2020-01-25 21:46:30 +00:00
2020-01-26 20:14:27 +00:00
2020-01-25 21:46:30 +00:00
def webfinger(request):
2020-01-26 00:24:22 +00:00
''' allow other servers to ask about a user '''
resource = request.GET.get('resource')
if not resource and not resource.startswith('acct:'):
return HttpResponseBadRequest()
account = resource.replace('acct:', '')
account = account.replace('@' + DOMAIN, '')
user = User.objects.filter(username=account).first()
if not user:
return HttpResponseNotFound('No account found')
return JsonResponse(format_webfinger(user))
2020-01-26 20:14:27 +00:00
2020-01-26 00:24:22 +00:00
def format_webfinger(user):
2020-01-26 20:14:27 +00:00
''' helper function to create structured webfinger json '''
2020-01-26 00:24:22 +00:00
return {
'subject': 'acct:%s@%s' % (user.username, DOMAIN),
'links': [
{
'rel': 'self',
'type': 'application/activity+json',
'href': 'https://%s/user/%s' % (DOMAIN, user.username),
}
]
}
2020-01-26 20:14:27 +00:00
def inbox(request, username):
''' incoming activitypub events '''
# TODO RSA junk: signature = request.headers['Signature']
user = User.objects.get(username=username)
def outbox(request, username):
user = User.objects.get(username=username)
if request.method == 'GET':
# list of activities
return JsonResponse()
data = request.body.decode('utf-8')
if data.activity.type == 'Follow':
handle_follow(data)
return HttpResponse()
def handle_follow(data):
pass
def get_or_create_remote_user(activity):
pass