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)
|
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
|
||||||
|
@ -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'
|
||||||
|
@ -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',)
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,4 +11,4 @@ class UserForm(forms.ModelForm):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = ['name', 'comment', 'servers']
|
fields = ['username', 'comment', 'servers']
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user