Fixes remote user code
and tests!
This commit is contained in:
@ -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):
|
||||
|
Reference in New Issue
Block a user