mirror of
https://github.com/house-of-vanity/OutFleet.git
synced 2025-07-06 17:14:07 +00:00
Merge vpn.Users with Django Users
This commit is contained in:
@ -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
|
||||
|
@ -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'
|
||||
|
@ -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',)
|
||||
|
||||
|
||||
|
@ -11,4 +11,4 @@ class UserForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ['name', 'comment', 'servers']
|
||||
fields = ['username', 'comment', 'servers']
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user