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