246 lines
6.6 KiB
Python
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() |