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) response = self.get_response(request)
return response 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_SERIALIZER = 'json'
CELERY_RESULT_EXTENDED = True CELERY_RESULT_EXTENDED = True
AUTH_USER_MODEL = "vpn.User"
# CACHES = { # CACHES = {
# 'default': { # 'default': {
# 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
@ -110,7 +112,6 @@ INSTALLED_APPS = [
MIDDLEWARE = [ MIDDLEWARE = [
#'mysite.middleware.RequestLogger',
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
@ -120,6 +121,7 @@ MIDDLEWARE = [
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware', 'corsheaders.middleware.CorsMiddleware',
#'mysite.middleware.AutoLoginMiddleware',
] ]
ROOT_URLCONF = 'mysite.urls' ROOT_URLCONF = 'mysite.urls'

View File

@ -6,6 +6,9 @@ from django.contrib import admin
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.db.models import Count 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.models import User, ACL
from vpn.forms import UserForm from vpn.forms import UserForm
from .server_plugins import ( from .server_plugins import (
@ -43,11 +46,12 @@ class ServerAdmin(PolymorphicParentModelAdmin):
qs = qs.annotate(user_count=Count('acl')) qs = qs.annotate(user_count=Count('acl'))
return qs return qs
#admin.site.register(User, UserAdmin)
@admin.register(User) @admin.register(User)
class UserAdmin(admin.ModelAdmin): class UserAdmin(admin.ModelAdmin):
form = UserForm form = UserForm
list_display = ('name', 'comment', 'registration_date', 'hash', 'server_count') list_display = ('username', 'comment', 'registration_date', 'hash', 'server_count')
search_fields = ('name', 'hash') search_fields = ('username', 'hash')
readonly_fields = ('hash',) readonly_fields = ('hash',)

View File

@ -11,4 +11,4 @@ class UserForm(forms.ModelForm):
class Meta: class Meta:
model = User 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 from .server_plugins import Server
import shortuuid import shortuuid
class User(models.Model): from django.contrib.auth.models import AbstractUser
name = models.CharField(max_length=100)
class User(AbstractUser):
#username = models.CharField(max_length=100)
is_active = False
comment = models.TextField(default="", blank=True) comment = models.TextField(default="", blank=True)
registration_date = models.DateTimeField(auto_now_add=True) registration_date = models.DateTimeField(auto_now_add=True)
servers = models.ManyToManyField('Server', through='ACL', blank=True) servers = models.ManyToManyField('Server', through='ACL', blank=True)
@ -23,7 +27,7 @@ class User(models.Model):
super().save(*args, **kwargs) super().save(*args, **kwargs)
def __str__(self): def __str__(self):
return self.name return self.username
class ACL(models.Model): class ACL(models.Model):
@ -39,7 +43,7 @@ class ACL(models.Model):
def __str__(self): def __str__(self):
return f"{self.user.name} - {self.server.name}" return f"{self.user.username} - {self.server.name}"
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.link: if not self.link:

View File

@ -42,6 +42,9 @@ class Server(PolymorphicModel):
class Meta: class Meta:
verbose_name = "Server" verbose_name = "Server"
verbose_name_plural = "Servers" verbose_name_plural = "Servers"
permissions = [
("access_server", "Can view public status"),
]
def __str__(self): def __str__(self):
return self.name return self.name

View File

@ -146,35 +146,35 @@ class OutlineServer(Server):
if server_user: if server_user:
if server_user.method != "chacha20-ietf-poly1305" or \ if server_user.method != "chacha20-ietf-poly1305" or \
server_user.port != int(self.client_port) 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 \ server_user.password != user.hash or \
self.client.delete_key(user.hash): self.client.delete_key(user.hash):
self.delete_user(user) self.delete_user(user)
key = self.client.create_key( key = self.client.create_key(
key_id=user.hash, key_id=user.hash,
name=user.name, name=user.username,
method=server_user.method, method=server_user.method,
password=user.hash, password=user.hash,
data_limit=None, data_limit=None,
port=server_user.port port=server_user.port
) )
logger.debug(f"[{self.name}] User {user.name} updated") logger.debug(f"[{self.name}] User {user.username} updated")
else: else:
try: try:
key = self.client.create_key( key = self.client.create_key(
key_id=user.hash, key_id=user.hash,
name=user.name, name=user.username,
method="chacha20-ietf-poly1305", method="chacha20-ietf-poly1305",
password=user.hash, password=user.hash,
data_limit=None, data_limit=None,
port=int(self.client_port) 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: except OutlineServerErrorException as e:
error_message = str(e) error_message = str(e)
if "code\":\"Conflict" in error_message: 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(): for key in self.client.get_keys():
logger.warning(f"[{self.name}] hash: {user.hash}, password: {key.password}") logger.warning(f"[{self.name}] hash: {user.hash}, password: {key.password}")
if key.password == user.hash: if key.password == user.hash:
@ -205,7 +205,7 @@ class OutlineServer(Server):
self.logger.info(f"[{self.name}] TEST") self.logger.info(f"[{self.name}] TEST")
self.client.delete_key(server_user.key_id) self.client.delete_key(server_user.key_id)
result = {"status": "User was deleted"} 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 return result