From 07f398766a5df047f4e31feea75999a83c2bf7d0 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Tue, 11 Aug 2020 17:24:27 +0200 Subject: [PATCH] Support receiving and updating ssh keys from upstream live This includes adding an API endpoint for push changes from the new community authentication API. --- gitadmin/gitadmin/adm/apps.py | 11 +++++++++++ gitadmin/gitadmin/adm/urls.py | 1 + gitadmin/gitadmin/adm/util.py | 20 ++++++++++++++++++++ gitadmin/gitadmin/settings.py | 2 +- 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gitadmin/gitadmin/adm/apps.py diff --git a/gitadmin/gitadmin/adm/apps.py b/gitadmin/gitadmin/adm/apps.py new file mode 100644 index 0000000..17d85c1 --- /dev/null +++ b/gitadmin/gitadmin/adm/apps.py @@ -0,0 +1,11 @@ +from django.apps import AppConfig + + +class GitAdmAppConfig(AppConfig): + name = 'gitadmin.adm' + + def ready(self): + from gitadmin.auth import auth_user_data_received + from gitadmin.adm.util import handle_user_data + + auth_user_data_received.connect(handle_user_data) diff --git a/gitadmin/gitadmin/adm/urls.py b/gitadmin/gitadmin/adm/urls.py index 11a490a..e24f5a9 100644 --- a/gitadmin/gitadmin/adm/urls.py +++ b/gitadmin/gitadmin/adm/urls.py @@ -14,4 +14,5 @@ urlpatterns = [ url(r'^login/$', gitadmin.auth.login), url(r'^logout/$', gitadmin.auth.logout), url(r'^auth_receive/$', gitadmin.auth.auth_receive), + url(r'^auth_api/$', gitadmin.auth.auth_api), ] diff --git a/gitadmin/gitadmin/adm/util.py b/gitadmin/gitadmin/adm/util.py index ed7ce83..03f4920 100644 --- a/gitadmin/gitadmin/adm/util.py +++ b/gitadmin/gitadmin/adm/util.py @@ -1,4 +1,5 @@ from django.contrib.auth.models import User +from django.db import connection from gitadmin.auth import user_search, user_import @@ -15,3 +16,22 @@ def get_or_import_user(email): raise Exception("User not found") return user_import(users[0]['u']) + + +# Updates arriving from community authentication +def handle_user_data(sender, **kwargs): + user = kwargs.pop('user') + userdata = kwargs.pop('userdata') + + curs = connection.cursor() + if userdata.get('sshkeys', None): + # We have an ssh key, so update the contents + curs.execute("INSERT INTO git_users (user_id, sshkey) VALUES (%(uid)s, %(key)s) ON CONFLICT (user_id) DO UPDATE SET sshkey=excluded.sshkey", { + 'uid': user.id, + 'key': userdata['sshkeys'], + }) + else: + # No or empty ssh key upstream, so delete + curs.execute("DELETE FROM git_users WHERE user_id=%(uid)s", { + 'uid': user.id, + }) diff --git a/gitadmin/gitadmin/settings.py b/gitadmin/gitadmin/settings.py index 93a22b7..8801050 100644 --- a/gitadmin/gitadmin/settings.py +++ b/gitadmin/gitadmin/settings.py @@ -80,7 +80,7 @@ INSTALLED_APPS = ( 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', - 'gitadmin.adm', + 'gitadmin.adm.apps.GitAdmAppConfig', 'django.contrib.admin', ) -- 2.39.5