diff --git a/Web/modules/database/user.py b/Web/modules/database/user.py index 1bd4ff7..4dc7a10 100755 --- a/Web/modules/database/user.py +++ b/Web/modules/database/user.py @@ -54,10 +54,34 @@ def _clean_name_fragment(value): return cleaned -def _get_tenant_db(client): +def _get_tenant_db(client, tenant_id=None): """Return the current tenant database for the request, or fall back to default.""" try: from tenant import get_tenant_db + if tenant_id is None: + return get_tenant_db(client) + + tenant_id = str(tenant_id).strip() + if tenant_id: + try: + from tenant import get_tenant_config + + config = get_tenant_config(tenant_id) + if isinstance(config, dict): + explicit_db = config.get('db') or config.get('db_name') + if explicit_db: + db_name = str(explicit_db).strip() + if db_name and not db_name.startswith('inventar_'): + db_name = f'inventar_{db_name}' + if db_name: + return client[db_name] + except Exception: + pass + + sanitized = ''.join(c for c in tenant_id.lower() if c.isalnum() or c == '_') + if sanitized: + return client[f'inventar_{sanitized}'] + return get_tenant_db(client) except Exception: return client[cfg.MONGODB_DB] @@ -479,8 +503,45 @@ def check_nm_pwd(username, password): query = {'$or': [{'Username': username}, {'username': username}]} user_record_fallback = users.find_one(query) if user_record_fallback is None: - logger.warning("Kein Benutzer für %r in DB %r gefunden.", dp.encrypt_text(username), db_name) - return None + if db_name != cfg.MONGODB_DB: + default_users = client[cfg.MONGODB_DB]['users'] + user_record_fallback = default_users.find_one( + {'$or': [ + {'Username': dp.encrypt_text(username)}, + {'username': dp.encrypt_text(username)}, + {'Username': username}, + {'username': username}, + ]} + ) + if user_record_fallback is not None: + migrated_record = dict(user_record_fallback) + migrated_record.pop('_id', None) + users.replace_one( + {'$or': [ + {'Username': migrated_record.get('Username')}, + {'username': migrated_record.get('username')}, + ]}, + migrated_record, + upsert=True, + ) + logger.warning( + "Tenant user %r migrated from default DB %r to tenant DB %r.", + dp.encrypt_text(username), + cfg.MONGODB_DB, + db_name, + ) + user_record = users.find_one( + {'$or': [ + {'Username': migrated_record.get('Username')}, + {'username': migrated_record.get('username')}, + ]} + ) or migrated_record + else: + logger.warning("Kein Benutzer für %r in DB %r gefunden.", dp.encrypt_text(username), db_name) + return None + else: + logger.warning("Kein Benutzer für %r in DB %r gefunden.", dp.encrypt_text(username), db_name) + return None else: user_record = user_record_fallback @@ -506,6 +567,7 @@ def add_admin( permission_preset='full_access', action_permissions=None, page_permissions=None, + tenant_id=None, ): """ Add a new user to the database. @@ -515,7 +577,7 @@ def add_admin( client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT) try: - db = _get_tenant_db(client) + db = _get_tenant_db(client, tenant_id) users = db['users'] permission_defaults = build_default_permission_payload(permission_preset) @@ -561,6 +623,7 @@ def add_user( permission_preset='standard_user', action_permissions=None, page_permissions=None, + tenant_id=None, ): """ Add a new user to the database. @@ -570,7 +633,7 @@ def add_user( client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT) try: - db = _get_tenant_db(client) + db = _get_tenant_db(client, tenant_id) users = db['users'] permission_defaults = build_default_permission_payload(permission_preset) diff --git a/manage-tenant.sh b/manage-tenant.sh index a4bd320..b59ba5b 100755 --- a/manage-tenant.sh +++ b/manage-tenant.sh @@ -206,12 +206,30 @@ import Web.modules.database.user as us tenant_id = sys.argv[1].lower() mode = sys.argv[2] sanitized = "".join(c for c in tenant_id if c.isalnum() or c == "_") +db_name = f"inventar_{sanitized}" if sanitized else settings.MONGODB_DB -us.add_admin("admin", "admin123", "admin", "admin") -us.make_admin("admin") +client = MongoClient(settings.MONGODB_HOST, settings.MONGODB_PORT) +db = client[db_name] +users = db["users"] +permission_defaults = us.build_default_permission_payload("full_access") +admin_doc = { + "Username": "admin", + "Password": us.hashing("admin123"), + "Admin": True, + "active_ausleihung": None, + "name": dp.encrypt_text("admin"), + "last_name": dp.encrypt_text("admin"), + "IsStudent": False, + "PermissionPreset": permission_defaults["preset"], + "ActionPermissions": permission_defaults["actions"], + "PagePermissions": permission_defaults["pages"], +} +users.replace_one({"Username": "admin"}, admin_doc, upsert=True) print("Fallback successfully applied") if mode == "trial": + client = MongoClient(settings.MONGODB_HOST, settings.MONGODB_PORT) + db = client[db_name] db.settings.update_one( {"setting_type": "tenant_trial"}, {"$set": { @@ -224,6 +242,8 @@ if mode == "trial": upsert=True, ) +client.close() + print(f"Tenant {sys.argv[1]} database initialized. Default admin: admin / admin123") PY }