From d324edec69905326b891c7543ae58eef2e261e5d Mon Sep 17 00:00:00 2001 From: A B Date: Sun, 27 Oct 2024 01:06:37 +0000 Subject: [PATCH] Merge vpn.Users with Django Users --- mysite/middleware.py | 36 +++++++++++++++++++++++++++++++++++ mysite/settings.py | 4 +++- vpn/admin.py | 8 ++++++-- vpn/forms.py | 2 +- vpn/models.py | 12 ++++++++---- vpn/server_plugins/generic.py | 3 +++ vpn/server_plugins/outline.py | 14 +++++++------- 7 files changed, 64 insertions(+), 15 deletions(-) diff --git a/mysite/middleware.py b/mysite/middleware.py index 050ce11..fcaae92 100644 --- a/mysite/middleware.py +++ b/mysite/middleware.py @@ -12,3 +12,39 @@ class RequestLogger: response = self.get_response(request) return response + + +from django.contrib.auth import get_user_model +from django.contrib.auth import login +from django.contrib.auth.models import Group + +class AutoLoginMiddleware: + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + if not request.user.is_authenticated: + user_email = request.META.get('HTTP_X_AUTHENTIK_EMAIL') + user_name = request.META.get('HTTP_X_AUTHENTIK_USERNAME') + user_groups = request.META.get('HTTP_X_AUTHENTIK_GROUPS') + + if user_email and user_name: + User = get_user_model() + try: + user = User.objects.get(email=user_email) + except User.DoesNotExist: + user = User.objects.create_user( + username=user_name, + email=user_email + ) + + if user_groups: + groups_list = user_groups.split(',') + for group_name in groups_list: + group, created = Group.objects.get_or_create(name=group_name.strip()) + user.groups.add(group) + + login(request, user) + + response = self.get_response(request) + return response diff --git a/mysite/settings.py b/mysite/settings.py index 99f1b30..50960c6 100644 --- a/mysite/settings.py +++ b/mysite/settings.py @@ -21,6 +21,8 @@ CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_RESULT_EXTENDED = True +AUTH_USER_MODEL = "vpn.User" + # CACHES = { # 'default': { # 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', @@ -110,7 +112,6 @@ INSTALLED_APPS = [ MIDDLEWARE = [ - #'mysite.middleware.RequestLogger', 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -120,6 +121,7 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'corsheaders.middleware.CorsMiddleware', + #'mysite.middleware.AutoLoginMiddleware', ] ROOT_URLCONF = 'mysite.urls' diff --git a/vpn/admin.py b/vpn/admin.py index e6bf4c4..c20fa29 100644 --- a/vpn/admin.py +++ b/vpn/admin.py @@ -6,6 +6,9 @@ from django.contrib import admin from django.utils.safestring import mark_safe from django.db.models import Count +from django.contrib.auth.admin import UserAdmin +from .models import User + from vpn.models import User, ACL from vpn.forms import UserForm from .server_plugins import ( @@ -43,11 +46,12 @@ class ServerAdmin(PolymorphicParentModelAdmin): qs = qs.annotate(user_count=Count('acl')) return qs +#admin.site.register(User, UserAdmin) @admin.register(User) class UserAdmin(admin.ModelAdmin): form = UserForm - list_display = ('name', 'comment', 'registration_date', 'hash', 'server_count') - search_fields = ('name', 'hash') + list_display = ('username', 'comment', 'registration_date', 'hash', 'server_count') + search_fields = ('username', 'hash') readonly_fields = ('hash',) diff --git a/vpn/forms.py b/vpn/forms.py index 098db53..c27d3f1 100644 --- a/vpn/forms.py +++ b/vpn/forms.py @@ -11,4 +11,4 @@ class UserForm(forms.ModelForm): class Meta: model = User - fields = ['name', 'comment', 'servers'] + fields = ['username', 'comment', 'servers'] diff --git a/vpn/models.py b/vpn/models.py index 29509fc..39c0e38 100644 --- a/vpn/models.py +++ b/vpn/models.py @@ -6,8 +6,12 @@ from django.dispatch import receiver from .server_plugins import Server import shortuuid -class User(models.Model): - name = models.CharField(max_length=100) +from django.contrib.auth.models import AbstractUser + + +class User(AbstractUser): + #username = models.CharField(max_length=100) + is_active = False comment = models.TextField(default="", blank=True) registration_date = models.DateTimeField(auto_now_add=True) servers = models.ManyToManyField('Server', through='ACL', blank=True) @@ -23,7 +27,7 @@ class User(models.Model): super().save(*args, **kwargs) def __str__(self): - return self.name + return self.username class ACL(models.Model): @@ -39,7 +43,7 @@ class ACL(models.Model): def __str__(self): - return f"{self.user.name} - {self.server.name}" + return f"{self.user.username} - {self.server.name}" def save(self, *args, **kwargs): if not self.link: diff --git a/vpn/server_plugins/generic.py b/vpn/server_plugins/generic.py index e648628..4b9a740 100644 --- a/vpn/server_plugins/generic.py +++ b/vpn/server_plugins/generic.py @@ -42,6 +42,9 @@ class Server(PolymorphicModel): class Meta: verbose_name = "Server" verbose_name_plural = "Servers" + permissions = [ + ("access_server", "Can view public status"), + ] def __str__(self): return self.name diff --git a/vpn/server_plugins/outline.py b/vpn/server_plugins/outline.py index 6b0d299..70e9fae 100644 --- a/vpn/server_plugins/outline.py +++ b/vpn/server_plugins/outline.py @@ -146,35 +146,35 @@ class OutlineServer(Server): if server_user: if server_user.method != "chacha20-ietf-poly1305" or \ server_user.port != int(self.client_port) or \ - server_user.name != user.name or \ + server_user.username != user.username or \ server_user.password != user.hash or \ self.client.delete_key(user.hash): self.delete_user(user) key = self.client.create_key( key_id=user.hash, - name=user.name, + name=user.username, method=server_user.method, password=user.hash, data_limit=None, port=server_user.port ) - logger.debug(f"[{self.name}] User {user.name} updated") + logger.debug(f"[{self.name}] User {user.username} updated") else: try: key = self.client.create_key( key_id=user.hash, - name=user.name, + name=user.username, method="chacha20-ietf-poly1305", password=user.hash, data_limit=None, port=int(self.client_port) ) - logger.info(f"[{self.name}] User {user.name} created") + logger.info(f"[{self.name}] User {user.username} created") except OutlineServerErrorException as e: error_message = str(e) if "code\":\"Conflict" in error_message: - logger.warning(f"[{self.name}] Conflict for User {user.name}, trying to force sync. {error_message}") + logger.warning(f"[{self.name}] Conflict for User {user.username}, trying to force sync. {error_message}") for key in self.client.get_keys(): logger.warning(f"[{self.name}] hash: {user.hash}, password: {key.password}") if key.password == user.hash: @@ -205,7 +205,7 @@ class OutlineServer(Server): self.logger.info(f"[{self.name}] TEST") self.client.delete_key(server_user.key_id) result = {"status": "User was deleted"} - self.logger.info(f"[{self.name}] User deleted: {user.name} on server {self.name}") + self.logger.info(f"[{self.name}] User deleted: {user.username} on server {self.name}") return result