Files
Key-service-Server/Website/user.py
T

246 lines
6.6 KiB
Python

import os
from pymongo import MongoClient
import hashlib
from bson.objectid import ObjectId
MONGO_URI = os.environ.get("MONGO_URI", "mongodb://localhost:27017")
MONGO_DB_NAME = os.environ.get("MONGO_DB_NAME", "Invario_Website")
def _get_users_collection():
client = MongoClient(MONGO_URI, serverSelectionTimeoutMS=1500)
db = client[MONGO_DB_NAME]
return client, db["users"]
def check_password_strength(password):
if len(password) < 6:
return False
return True
def hashing(password):
return hashlib.scrypt(
password.encode(),
salt=b'salt_1234567890',
n=16384,
r=8,
p=1,
dklen=64,
).hex()
def check_nm_pwd(username, password):
client = None
try:
client, users = _get_users_collection()
hashed_password = hashing(password)
return users.find_one({'Username': username, 'Password': hashed_password})
finally:
if client:
client.close()
def add_user(username, password, school_name="", contact_person="", email="", marketing_opt_in=False, verified=False, verification_token=None):
"""
Legt einen neuen Benutzer mit allen Verifizierungsdaten in MongoDB an.
"""
if not check_password_strength(password):
return False
client = None
try:
client, users = _get_users_collection()
users.insert_one(
{
'Username': username,
'Password': hashing(password),
'Admin': False,
'active_ausleihung': None,
'school_name': school_name,
'contact_person': contact_person,
'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
finally:
if client:
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):
client = None
try:
client, users = _get_users_collection()
users.update_one({'Username': username}, {'$set': {'Admin': True}})
return True
finally:
if client:
client.close()
def remove_admin(username):
client = None
try:
client, users = _get_users_collection()
users.update_one({'Username': username}, {'$set': {'Admin': False}})
return True
finally:
if client:
client.close()
def get_user(username):
client = None
try:
client, users = _get_users_collection()
return users.find_one({'Username': username})
finally:
if client:
client.close()
def check_admin(username):
client = None
try:
client, users = _get_users_collection()
user = users.find_one({'Username': username})
return user and user.get('Admin', False)
finally:
if client:
client.close()
def delete_user(username):
client = None
try:
client, users = _get_users_collection()
result = users.delete_one({'username': username})
if result.deleted_count == 0:
result = users.delete_one({'Username': username})
return result.deleted_count > 0
finally:
if client:
client.close()
def get_all_users():
try:
client, users = _get_users_collection()
all_users = list(users.find())
client.close()
return all_users
except Exception:
return []
def update_password(username, new_password):
try:
if not check_password_strength(new_password):
return False
client, users = _get_users_collection()
hashed_password = hashing(new_password)
result = users.update_one(
{'Username': username},
{'$set': {'Password': hashed_password}}
)
client.close()
return result.modified_count > 0
except Exception as e:
print(f"Error updating password: {e}")
return False
def email_exists(email):
"""
Prüft, ob die E-Mail bereits von einem verifizierten Konto genutzt wird.
"""
client = None
try:
client, users = _get_users_collection()
user = users.find_one({'email': email.strip().lower(), 'verified': True})
return user is not None
finally:
if client:
client.close()
def update_verification_token(username, new_token):
"""
Aktualisiert den Verifizierungs-Token für einen Benutzer.
"""
client = None
try:
client, users = _get_users_collection()
hashed_token = hashing(new_token)
result = users.update_one(
{'Username': username},
{'$set': {'verification_token': hashed_token}}
)
return result.modified_count > 0
finally:
if client:
client.close()
def update_user_email_and_token(username, new_email, new_token):
"""
Aktualisiert die E-Mail-Adresse und den Verifizierungs-Token für einen Benutzer.
"""
client = None
try:
client, users = _get_users_collection()
hashed_token = hashing(new_token)
result = users.update_one(
{'Username': username},
{'$set': {'email': new_email.strip().lower(), 'verification_token': hashed_token}}
)
return result.modified_count > 0
finally:
if client:
client.close()
def update_user_profile(username, contact_person, email):
"""
Aktualisiert die Profilinformationen (Name und E-Mail) eines Nutzers.
"""
client = None
try:
client, users = _get_users_collection()
result = users.update_one(
{'Username': username},
{'$set': {
'contact_person': contact_person,
'email': email.strip().lower()
}}
)
return result.modified_count > 0
except Exception as e:
print(f"Error updating profile: {e}")
return False
finally:
if client:
client.close()