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):
''' look up a remote user or add them '''
try:
user = models.User.objects.get(actor=actor)
return models.User.objects.get(actor=actor)
except models.User.DoesNotExist:
# TODO: how do you actually correctly learn this?
username = '%s@%s' % (actor.split('/')[-1], actor.split('/')[2])
user = models.User.objects.create_user(
username,
'', '',
actor=actor,
local=False
)
pass
# get the user's info
response = requests.get(
actor,
headers={'Accept': 'application/activity+json'}
)
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

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
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_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')),
('private_key', models.TextField(blank=True, null=True, unique=True)),
('public_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)),
('api_key', models.CharField(blank=True, max_length=255, null=True)),
('actor', 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):
''' a user who wants to read books '''
private_key = models.TextField(blank=True, null=True, unique=True)
public_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)
api_key = models.CharField(max_length=255, blank=True, null=True)
actor = 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):
''' create shelves for new users '''
# this user already exists, no need to poplate fields
if instance.id:
return
# TODO: how do I know this properly???
if not instance.local:
instance.inbox = instance.actor = 'inbox'
instance.outbox = instance.actor = 'outbox'
if instance.id or not instance.local:
return
# populate fields for local users

View file

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