Fixes remote user code

and tests!
This commit is contained in:
Mouse Reeve
2020-05-14 12:08:57 -07:00
parent b203ae5b33
commit a0507edcac
3 changed files with 97 additions and 13 deletions

View File

@ -4,6 +4,7 @@ from uuid import uuid4
import requests
from django.core.files.base import ContentFile
from django.db import transaction
from fedireads import models
from fedireads.status import create_review_from_activity
@ -12,7 +13,7 @@ from fedireads.status import create_review_from_activity
def get_or_create_remote_user(actor):
''' look up a remote user or add them '''
try:
return models.User.objects.get(actor=actor)
return models.User.objects.get(remote_id=actor)
except models.User.DoesNotExist:
pass
@ -25,37 +26,47 @@ def get_or_create_remote_user(actor):
response.raise_for_status()
data = response.json()
# the webfinger format for the username.
actor_parts = urlparse(actor)
with transaction.atomic():
user = create_remote_user(data)
user.federated_server = get_or_create_remote_server(actor_parts.netloc)
user.save()
avatar = get_avatar(data)
user.avatar.save(*avatar)
if user.fedireads_user:
get_remote_reviews(user)
return user
def create_remote_user(data):
''' parse the activitypub actor data into a user '''
actor = data.get('id')
actor_parts = urlparse(actor)
# the webfinger format for the username.
username = '%s@%s' % (actor_parts.path.split('/')[-1], actor_parts.netloc)
shared_inbox = data.get('endpoints').get('sharedInbox') if \
data.get('endpoints') else None
server = get_or_create_remote_server(actor_parts.netloc)
avatar = get_avatar(data)
# throws a key error if it can't find any of these fields
user = models.User.objects.create_user(
return models.User.objects.create_user(
username,
'', '', # email and passwords are left blank
actor=actor,
remote_id=actor,
name=data.get('name'),
summary=data.get('summary'),
inbox=data['inbox'], #fail if there's no inbox
outbox=data['outbox'], # fail if there's no outbox
shared_inbox=shared_inbox,
# TODO: I'm never actually using this for remote users
public_key=data.get('publicKey').get('publicKeyPem'),
local=False,
fedireads_user=data.get('fedireadsUser', False),
manually_approves_followers=data.get(
'manuallyApprovesFollowers', False),
federated_server=server,
)
user.avatar.save(*avatar)
if user.fedireads_user:
get_remote_reviews(user)
return user
def get_avatar(data):