Add federated users

This commit is contained in:
Mouse Reeve 2020-01-29 12:07:20 -08:00
parent a9d938fbb2
commit f031b46b20
4 changed files with 28 additions and 22 deletions

View file

@ -15,16 +15,28 @@ from fedireads.settings import DOMAIN
def get_or_create_remote_user(actor): def get_or_create_remote_user(actor):
''' look up a remote user or add them ''' ''' look up a remote user or add them '''
try: try:
user = models.User.objects.get(actor=actor) return models.User.objects.get(actor=actor)
except models.User.DoesNotExist: except models.User.DoesNotExist:
# TODO: how do you actually correctly learn this? pass
username = '%s@%s' % (actor.split('/')[-1], actor.split('/')[2])
user = models.User.objects.create_user( # get the user's info
username, response = requests.get(
'', '', actor,
actor=actor, headers={'Accept': 'application/activity+json'}
local=False )
) data = response.json()
username = '%s@%s' % (actor.split('/')[-1], actor.split('/')[2])
user = models.User.objects.create_user(
username, '', '',
name=data.get('name'),
summary=data.get('summary'),
inbox=data['inbox'],
outbox=data['outbox'],
shared_inbox=data.get('endpoints').get('sharedInbox'),
actor=actor,
local=False
)
return user return user

View file

@ -1,4 +1,4 @@
# Generated by Django 3.0.2 on 2020-01-29 18:40 # Generated by Django 3.0.2 on 2020-01-29 19:58
from django.conf import settings from django.conf import settings
import django.contrib.auth.models import django.contrib.auth.models
@ -32,8 +32,8 @@ class Migration(migrations.Migration):
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('private_key', models.TextField(blank=True, null=True, unique=True)), ('private_key', models.TextField(blank=True, null=True)),
('public_key', models.TextField(blank=True, null=True, unique=True)), ('public_key', models.TextField(blank=True, null=True)),
('api_key', models.CharField(blank=True, max_length=255, null=True)), ('api_key', models.CharField(blank=True, max_length=255, null=True)),
('actor', models.CharField(max_length=255, unique=True)), ('actor', models.CharField(max_length=255, unique=True)),
('inbox', models.CharField(max_length=255, unique=True)), ('inbox', models.CharField(max_length=255, unique=True)),

View file

@ -13,8 +13,8 @@ from fedireads.settings import DOMAIN, OL_URL
class User(AbstractUser): class User(AbstractUser):
''' a user who wants to read books ''' ''' a user who wants to read books '''
private_key = models.TextField(blank=True, null=True, unique=True) private_key = models.TextField(blank=True, null=True)
public_key = models.TextField(blank=True, null=True, unique=True) public_key = models.TextField(blank=True, null=True)
api_key = models.CharField(max_length=255, blank=True, null=True) api_key = models.CharField(max_length=255, blank=True, null=True)
actor = models.CharField(max_length=255, unique=True) actor = models.CharField(max_length=255, unique=True)
inbox = models.CharField(max_length=255, unique=True) inbox = models.CharField(max_length=255, unique=True)
@ -44,13 +44,7 @@ class User(AbstractUser):
def execute_before_save(sender, instance, *args, **kwargs): def execute_before_save(sender, instance, *args, **kwargs):
''' create shelves for new users ''' ''' create shelves for new users '''
# this user already exists, no need to poplate fields # this user already exists, no need to poplate fields
if instance.id: if instance.id or not instance.local:
return
# TODO: how do I know this properly???
if not instance.local:
instance.inbox = instance.actor = 'inbox'
instance.outbox = instance.actor = 'outbox'
return return
# populate fields for local users # populate fields for local users

View file

@ -20,7 +20,7 @@ urlpatterns = [
# TODO: re_path(r'^.well-known/host-meta/?$', incoming.host_meta), # TODO: re_path(r'^.well-known/host-meta/?$', incoming.host_meta),
# ui views # ui views
re_path(r'^/?$', views.home), path(r'', views.home),
re_path(r'^register/?$', views.register), re_path(r'^register/?$', views.register),
re_path(r'^login/?$', views.user_login), re_path(r'^login/?$', views.user_login),
re_path(r'^logout/?$', views.user_logout), re_path(r'^logout/?$', views.user_logout),