cahnges to the backend to allow for the user
This commit is contained in:
+32
-165
@@ -15,30 +15,12 @@ def _get_users_collection():
|
|||||||
|
|
||||||
|
|
||||||
def check_password_strength(password):
|
def check_password_strength(password):
|
||||||
"""
|
|
||||||
Check if a password meets minimum security requirements.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
password (str): Password to check
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if password is strong enough, False otherwise
|
|
||||||
"""
|
|
||||||
if len(password) < 6:
|
if len(password) < 6:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def hashing(password):
|
def hashing(password):
|
||||||
"""
|
|
||||||
Hash a password using SHA-512.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
password (str): Password to hash
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: Hexadecimal digest of the hashed password
|
|
||||||
"""
|
|
||||||
return hashlib.scrypt(
|
return hashlib.scrypt(
|
||||||
password.encode(),
|
password.encode(),
|
||||||
salt=b'salt_1234567890',
|
salt=b'salt_1234567890',
|
||||||
@@ -50,16 +32,6 @@ def hashing(password):
|
|||||||
|
|
||||||
|
|
||||||
def check_nm_pwd(username, password):
|
def check_nm_pwd(username, password):
|
||||||
"""
|
|
||||||
Verify username and password combination.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username to check
|
|
||||||
password (str): Password to verify
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
dict: User document if credentials are valid, None otherwise
|
|
||||||
"""
|
|
||||||
client = None
|
client = None
|
||||||
try:
|
try:
|
||||||
client, users = _get_users_collection()
|
client, users = _get_users_collection()
|
||||||
@@ -70,16 +42,9 @@ def check_nm_pwd(username, password):
|
|||||||
client.close()
|
client.close()
|
||||||
|
|
||||||
|
|
||||||
def add_user(username, password, name, last_name, email=""):
|
def add_user(username, password, school_name="", contact_person="", email="", marketing_opt_in=False, verified=False, verification_token=None):
|
||||||
"""
|
"""
|
||||||
Add a new user to the database.
|
Legt einen neuen Benutzer mit allen Verifizierungsdaten in MongoDB an.
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username for the new user
|
|
||||||
password (str): Password for the new user
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if user was added successfully, False if password was too weak
|
|
||||||
"""
|
"""
|
||||||
if not check_password_strength(password):
|
if not check_password_strength(password):
|
||||||
return False
|
return False
|
||||||
@@ -93,9 +58,12 @@ def add_user(username, password, name, last_name, email=""):
|
|||||||
'Password': hashing(password),
|
'Password': hashing(password),
|
||||||
'Admin': False,
|
'Admin': False,
|
||||||
'active_ausleihung': None,
|
'active_ausleihung': None,
|
||||||
'name': name,
|
'school_name': school_name,
|
||||||
'last_name': last_name,
|
'contact_person': contact_person,
|
||||||
'email': (email or '').strip().lower(),
|
'email': (email or '').strip().lower(),
|
||||||
|
'marketing_opt_in': marketing_opt_in,
|
||||||
|
'verified': verified,
|
||||||
|
'verification_token': hashing(verification_token) if verification_token else None,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return True
|
return True
|
||||||
@@ -104,16 +72,27 @@ def add_user(username, password, name, last_name, email=""):
|
|||||||
client.close()
|
client.close()
|
||||||
|
|
||||||
|
|
||||||
|
def verify_user_token(username, token):
|
||||||
|
"""
|
||||||
|
Prüft den Token und markiert das Konto als verifiziert.
|
||||||
|
"""
|
||||||
|
client = None
|
||||||
|
try:
|
||||||
|
client, users = _get_users_collection()
|
||||||
|
user = users.find_one({'Username': username})
|
||||||
|
if user and user.get('verification_token') == hashing(token):
|
||||||
|
users.update_one(
|
||||||
|
{'Username': username},
|
||||||
|
{'$set': {'verified': True, 'verification_token': None}}
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
finally:
|
||||||
|
if client:
|
||||||
|
client.close()
|
||||||
|
|
||||||
|
|
||||||
def make_admin(username):
|
def make_admin(username):
|
||||||
"""
|
|
||||||
Grant administrator privileges to a user.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username of the user to promote
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if user was promoted successfully
|
|
||||||
"""
|
|
||||||
client = None
|
client = None
|
||||||
try:
|
try:
|
||||||
client, users = _get_users_collection()
|
client, users = _get_users_collection()
|
||||||
@@ -123,16 +102,8 @@ def make_admin(username):
|
|||||||
if client:
|
if client:
|
||||||
client.close()
|
client.close()
|
||||||
|
|
||||||
|
|
||||||
def remove_admin(username):
|
def remove_admin(username):
|
||||||
"""
|
|
||||||
Remove administrator privileges from a user.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username of the user to demote
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if user was demoted successfully
|
|
||||||
"""
|
|
||||||
client = None
|
client = None
|
||||||
try:
|
try:
|
||||||
client, users = _get_users_collection()
|
client, users = _get_users_collection()
|
||||||
@@ -142,16 +113,8 @@ def remove_admin(username):
|
|||||||
if client:
|
if client:
|
||||||
client.close()
|
client.close()
|
||||||
|
|
||||||
|
|
||||||
def get_user(username):
|
def get_user(username):
|
||||||
"""
|
|
||||||
Retrieve a specific user by username.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username to search for
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
dict: User document or None if not found
|
|
||||||
"""
|
|
||||||
client = None
|
client = None
|
||||||
try:
|
try:
|
||||||
client, users = _get_users_collection()
|
client, users = _get_users_collection()
|
||||||
@@ -162,15 +125,6 @@ def get_user(username):
|
|||||||
|
|
||||||
|
|
||||||
def check_admin(username):
|
def check_admin(username):
|
||||||
"""
|
|
||||||
Check if a user has administrator privileges.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username to check
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if user is an administrator, False otherwise
|
|
||||||
"""
|
|
||||||
client = None
|
client = None
|
||||||
try:
|
try:
|
||||||
client, users = _get_users_collection()
|
client, users = _get_users_collection()
|
||||||
@@ -180,17 +134,8 @@ def check_admin(username):
|
|||||||
if client:
|
if client:
|
||||||
client.close()
|
client.close()
|
||||||
|
|
||||||
|
|
||||||
def delete_user(username):
|
def delete_user(username):
|
||||||
"""
|
|
||||||
Delete a user from the database.
|
|
||||||
Administrative function for removing user accounts.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username of the account to delete
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if user was deleted successfully, False otherwise
|
|
||||||
"""
|
|
||||||
client = None
|
client = None
|
||||||
try:
|
try:
|
||||||
client, users = _get_users_collection()
|
client, users = _get_users_collection()
|
||||||
@@ -202,109 +147,31 @@ def delete_user(username):
|
|||||||
if client:
|
if client:
|
||||||
client.close()
|
client.close()
|
||||||
|
|
||||||
def get_name(username):
|
|
||||||
"""
|
|
||||||
Retrieve the name that is assosiated with the username.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: String of name
|
|
||||||
"""
|
|
||||||
client = None
|
|
||||||
try:
|
|
||||||
client, users = _get_users_collection()
|
|
||||||
user = users.find_one({'Username': username}) or {}
|
|
||||||
return user.get("name")
|
|
||||||
finally:
|
|
||||||
if client:
|
|
||||||
client.close()
|
|
||||||
|
|
||||||
def get_last_name(username):
|
|
||||||
"""
|
|
||||||
Retrieve the last_name that is assosiated with the username.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: String of last_name
|
|
||||||
"""
|
|
||||||
client = None
|
|
||||||
try:
|
|
||||||
client, users = _get_users_collection()
|
|
||||||
user = users.find_one({'Username': username}) or {}
|
|
||||||
return user.get("last_name")
|
|
||||||
finally:
|
|
||||||
if client:
|
|
||||||
client.close()
|
|
||||||
|
|
||||||
|
|
||||||
def get_all_users():
|
def get_all_users():
|
||||||
"""
|
|
||||||
Retrieve all users from the database.
|
|
||||||
Administrative function for user management.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
list: List of all user documents
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
client, users = _get_users_collection()
|
client, users = _get_users_collection()
|
||||||
all_users = list(users.find())
|
all_users = list(users.find())
|
||||||
client.close()
|
client.close()
|
||||||
return all_users
|
return all_users
|
||||||
except Exception as e:
|
except Exception:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
def update_password(username, new_password):
|
def update_password(username, new_password):
|
||||||
"""
|
|
||||||
Update a user's password with a new one.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username of the user
|
|
||||||
new_password (str): New password to set
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if password was updated successfully, False otherwise
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
if not check_password_strength(new_password):
|
if not check_password_strength(new_password):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
client, users = _get_users_collection()
|
client, users = _get_users_collection()
|
||||||
|
|
||||||
# Hash the new password
|
|
||||||
hashed_password = hashing(new_password)
|
hashed_password = hashing(new_password)
|
||||||
|
|
||||||
# Update the user's password
|
|
||||||
result = users.update_one(
|
result = users.update_one(
|
||||||
{'Username': username},
|
{'Username': username},
|
||||||
{'$set': {'Password': hashed_password}}
|
{'$set': {'Password': hashed_password}}
|
||||||
)
|
)
|
||||||
|
|
||||||
client.close()
|
client.close()
|
||||||
return result.modified_count > 0
|
return result.modified_count > 0
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error updating password: {e}")
|
print(f"Error updating password: {e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def update_user_name(username, name, last_name):
|
|
||||||
"""
|
|
||||||
Update a user's name and last name.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
username (str): Username of the user
|
|
||||||
name (str): New first name
|
|
||||||
last_name (str): New last name
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
bool: True if updated successfully, False otherwise
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
client, users = _get_users_collection()
|
|
||||||
|
|
||||||
result = users.update_one(
|
|
||||||
{'Username': username},
|
|
||||||
{'$set': {'name': name, 'last_name': last_name}}
|
|
||||||
)
|
|
||||||
|
|
||||||
client.close()
|
|
||||||
return True
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error updating user name: {e}")
|
|
||||||
return False
|
|
||||||
Reference in New Issue
Block a user