Merge vpn.Users with Django Users

This commit is contained in:
A B
2024-10-27 01:06:37 +00:00
parent dda9b4ba5a
commit d324edec69
7 changed files with 64 additions and 15 deletions

View File

@ -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

View File

@ -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'

View File

@ -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',)

View File

@ -11,4 +11,4 @@ class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ['name', 'comment', 'servers']
fields = ['username', 'comment', 'servers']

View File

@ -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:

View File

@ -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

View File

@ -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