228 lines
7.1 KiB
Python
228 lines
7.1 KiB
Python
from django.contrib.auth.decorators import user_passes_test
|
|
from django.core.exceptions import ValidationError
|
|
from django.contrib.auth import get_user_model, authenticate, login
|
|
from django.contrib.auth.models import User
|
|
from django.contrib.auth.password_validation import validate_password
|
|
from django.db import transaction
|
|
|
|
from IoTAnalyzer.exception_handling import handle_exceptions
|
|
from django.contrib.auth import logout
|
|
|
|
|
|
# Create user
|
|
@handle_exceptions
|
|
@transaction.atomic
|
|
def register_user(request, username, password, is_superuser, is_staff):
|
|
# Input validation
|
|
if not username or not isinstance(username, str):
|
|
raise ValidationError("Ungültiger Username")
|
|
username = username.strip()
|
|
if not username:
|
|
raise ValidationError("Username darf nicht leer sein")
|
|
if not password or not isinstance(password, str):
|
|
raise ValidationError("Ungültiges Passwort") # Corrected, was previously "Ungültiger Username"
|
|
password = password.strip()
|
|
if not password:
|
|
raise ValidationError("Passwort darf nicht leer sein")
|
|
|
|
if User.objects.filter(username=username).exists():
|
|
raise ValidationError("User existiert bereits")
|
|
|
|
# Correction: do not pass `request` as an argument
|
|
user = User.objects.create_user(
|
|
username=username,
|
|
password=password,
|
|
is_superuser=is_superuser,
|
|
is_staff=is_staff
|
|
)
|
|
|
|
return {"status": "success", "message": "User wurde erfolgreich erstellt"}
|
|
|
|
|
|
|
|
# Delete user
|
|
@handle_exceptions
|
|
@transaction.atomic
|
|
def delete_user(request, user_id):
|
|
# Input validation
|
|
if not user_id or not isinstance(user_id, int):
|
|
raise ValidationError("Ungültige Id")
|
|
# Check that the user is not deleting themselves
|
|
if request.user.id == user_id:
|
|
raise ValidationError("Sie können Ihren eigenen Account nicht löschen")
|
|
user = User.objects.filter(id=user_id)
|
|
if not user.exists():
|
|
raise ValidationError("User existiert nicht")
|
|
else:
|
|
user.delete()
|
|
return {"status": "success", "message": "User wurde erfolgreich gelöscht"}
|
|
|
|
|
|
# Reset password
|
|
@handle_exceptions
|
|
@transaction.atomic
|
|
def set_password(request, user_id, new_password):
|
|
# Input validation
|
|
if not isinstance(user_id, int):
|
|
raise ValidationError("Ungültige User ID")
|
|
|
|
if not isinstance(new_password, str):
|
|
raise ValidationError("Ungültiges Passwort Format")
|
|
|
|
new_password = new_password.strip()
|
|
if not new_password:
|
|
raise ValidationError("Passwort darf nicht leer sein")
|
|
|
|
# Fetch user
|
|
try:
|
|
user = User.objects.get(id=user_id)
|
|
except User.DoesNotExist:
|
|
raise ValidationError("User existiert nicht")
|
|
|
|
# Permission check
|
|
if request.user.id != user_id and request.user.is_superuser and request.user.is_staff:
|
|
raise ValidationError("Keine Berechtigung zum Ändern des Passworts")
|
|
|
|
# Password validation using Django's built-in validators
|
|
try:
|
|
validate_password(new_password, user)
|
|
except ValidationError as e:
|
|
raise ValidationError(e.messages)
|
|
|
|
# Set and save password
|
|
user.set_password(new_password)
|
|
user.last_login = None
|
|
user.save()
|
|
|
|
return {"status": "success", "message": "Passwort erfolgreich geändert"}
|
|
from django.utils.timezone import now
|
|
|
|
|
|
@handle_exceptions
|
|
@transaction.atomic
|
|
def change_password(request, user_id, new_password):
|
|
# Input validation
|
|
if not isinstance(user_id, int):
|
|
raise ValidationError("Ungültige User ID")
|
|
|
|
if not isinstance(new_password, str):
|
|
raise ValidationError("Ungültiges Passwort Format")
|
|
|
|
new_password = new_password.strip()
|
|
if not new_password:
|
|
raise ValidationError("Passwort darf nicht leer sein")
|
|
|
|
# Fetch user
|
|
try:
|
|
user = User.objects.get(id=user_id)
|
|
except User.DoesNotExist:
|
|
raise ValidationError("User existiert nicht")
|
|
|
|
|
|
|
|
# Password validation using Django's built-in validators
|
|
try:
|
|
validate_password(new_password, user)
|
|
except ValidationError as e:
|
|
raise ValidationError(e.messages)
|
|
|
|
# Set and save password
|
|
user.set_password(new_password)
|
|
user.last_login = now() # Sets last_login to the current date
|
|
user.save()
|
|
|
|
return {"status": "success", "message": "Passwort erfolgreich geändert", "last_login": user.last_login}
|
|
|
|
|
|
@handle_exceptions
|
|
@transaction.atomic
|
|
def login_user(request, username, password):
|
|
# Input validation
|
|
if not username or not isinstance(username, str):
|
|
raise ValidationError("Ungültiger Username")
|
|
|
|
username = username.strip()
|
|
if not username:
|
|
raise ValidationError("Username darf nicht leer sein")
|
|
|
|
if not password or not isinstance(password, str):
|
|
raise ValidationError("Ungültiges Passwort")
|
|
|
|
password = password.strip()
|
|
if not password:
|
|
raise ValidationError("Passwort darf nicht leer sein")
|
|
|
|
user = authenticate(username=username, password=password)
|
|
if user is None:
|
|
raise ValidationError("Falscher Username oder Passwort")
|
|
|
|
# Check the last login
|
|
resetPassword = user.last_login is None
|
|
|
|
# If a password reset is required, do not perform a login
|
|
if resetPassword:
|
|
return False, {"message": "Erster Login erkannt. Passwort muss zurückgesetzt werden.", "resetPassword": True, "user" : {"id": user.id, "username": user.username}}
|
|
|
|
# Log the user in
|
|
login(request, user)
|
|
|
|
user_info = {
|
|
'id': user.id,
|
|
'username': user.username,
|
|
'changePassword': resetPassword,
|
|
'role': 'superuser' if user.is_superuser else 'staff' if user.is_staff else 'user'
|
|
}
|
|
|
|
return True, {"message": "Login erfolgreich", "user": user_info}
|
|
|
|
|
|
@handle_exceptions
|
|
@transaction.atomic
|
|
def logout_user(request, user_id):
|
|
# Input validation
|
|
if not isinstance(user_id, int):
|
|
raise ValidationError("Ungültige User ID")
|
|
|
|
# Fetch user
|
|
try:
|
|
user = User.objects.get(id=user_id)
|
|
except User.DoesNotExist:
|
|
raise ValidationError("User existiert nicht")
|
|
|
|
# Permission check
|
|
if request.user.id != user_id:
|
|
raise ValidationError("Keine Berechtigung zum Ausloggen dieses Benutzers")
|
|
|
|
# Log the user out
|
|
logout(request)
|
|
|
|
return {"message": "Logout erfolgreich"}
|
|
|
|
|
|
# Function to list all users with their roles
|
|
#@user_passes_test(lambda u: u.is_superuser)
|
|
def list_users(request):
|
|
try:
|
|
users = User.objects.all().order_by('username')
|
|
user_list = []
|
|
|
|
for user in users:
|
|
user_info = {
|
|
'id': user.id,
|
|
'username': user.username,
|
|
'password': user.password,
|
|
'email': user.email,
|
|
'role': 'superuser' if user.is_superuser else 'staff' if user.is_staff else 'user'
|
|
}
|
|
user_list.append(user_info)
|
|
|
|
return {
|
|
'status': 'success',
|
|
'data': user_list
|
|
}
|
|
|
|
except Exception as e:
|
|
if isinstance(e, User.DoesNotExist):
|
|
raise ValidationError("Keine Benutzer gefunden")
|
|
raise ValidationError("Fehler beim Abrufen der Benutzerliste: {}").format(str(e))
|