From 7b4be3dbc9318360936fdb211ed51038fac5be20 Mon Sep 17 00:00:00 2001 From: patrick-motsch Date: Tue, 17 Feb 2026 00:33:05 +0100 Subject: [PATCH] feat: accept botEmail/botPassword from request, auto-create system bot in DB Co-authored-by: Cursor --- .../features/teamsbot/routeFeatureTeamsbot.py | 89 ++++++++++++------- 1 file changed, 56 insertions(+), 33 deletions(-) diff --git a/modules/features/teamsbot/routeFeatureTeamsbot.py b/modules/features/teamsbot/routeFeatureTeamsbot.py index f83fc5d6..c2bc53a7 100644 --- a/modules/features/teamsbot/routeFeatureTeamsbot.py +++ b/modules/features/teamsbot/routeFeatureTeamsbot.py @@ -728,42 +728,65 @@ async def testAuth( if not meetingUrl: raise HTTPException(status_code=400, detail="meetingUrl is required") - # Load system bot credentials for the auth test variant - email = None - password = None - credentialDebug = {"mandateId": mandateId, "botFound": False, "botEmail": None, "botMandateId": None, "searchStrategy": "byMandate"} + # Load system bot credentials: + # 1. Use email/password from request body (direct override) + # 2. Fallback: load from DB (system bot record) + email = body.get("botEmail") + password = body.get("botPassword") + credentialDebug = {"mandateId": mandateId, "source": "none"} - systemBot = interface.getActiveSystemBot(mandateId) - - # Fallback: if no bot found for this mandate, search ALL system bots - if not systemBot: - logger.info(f"[test-auth] No bot for mandate {mandateId}, searching all system bots...") - credentialDebug["searchStrategy"] = "allBots" - allBots = interface.db.getRecordset(TeamsbotSystemBot, recordFilter={"isActive": True}) - if allBots: - systemBot = allBots[0] - credentialDebug["allBotsCount"] = len(allBots) - credentialDebug["botMandateId"] = systemBot.get("mandateId") - logger.info(f"[test-auth] Found {len(allBots)} active bot(s), using first: {systemBot.get('email')} (mandate={systemBot.get('mandateId')})") - - if systemBot: - email = systemBot.get("email") - encryptedPwd = systemBot.get("encryptedPassword") - credentialDebug["botFound"] = True + if email and password: + # Direct override from request body + credentialDebug["source"] = "requestBody" credentialDebug["botEmail"] = email - logger.info(f"[test-auth] System bot: email={email}, hasEncryptedPwd={bool(encryptedPwd)}") - if encryptedPwd: - try: - from modules.shared.configuration import decryptValue - password = decryptValue(encryptedPwd, userId=str(context.user.id), keyName="systemBotPassword") - credentialDebug["passwordDecrypted"] = True - logger.info(f"[test-auth] Password decrypted, length={len(password) if password else 0}") - except Exception as e: - credentialDebug["passwordError"] = str(e) - logger.error(f"[test-auth] Password decryption failed: {e}") + logger.info(f"[test-auth] Using credentials from request: {email}") + + # Also create/update system bot in DB for future use + try: + from modules.shared.configuration import encryptValue + encryptedPassword = encryptValue(password, userId=str(context.user.id), keyName="systemBotPassword") + existingBot = interface.getActiveSystemBot(mandateId) + if not existingBot: + botData = TeamsbotSystemBot( + mandateId=mandateId, + name=email.split("@")[0].replace(".", " ").title(), + email=email, + encryptedPassword=encryptedPassword, + isActive=True, + ).model_dump() + interface.createSystemBot(botData) + credentialDebug["dbCreated"] = True + logger.info(f"[test-auth] Created system bot in DB: {email} for mandate {mandateId}") + else: + credentialDebug["dbExists"] = True + except Exception as e: + logger.warning(f"[test-auth] Could not save system bot to DB: {e}") else: - logger.warning(f"[test-auth] No active system bot found anywhere") - credentialDebug["searchStrategy"] = "noneFound" + # Try loading from DB + systemBot = interface.getActiveSystemBot(mandateId) + if not systemBot: + # Fallback: search ALL active bots + allBots = interface.db.getRecordset(TeamsbotSystemBot, recordFilter={"isActive": True}) + if allBots: + systemBot = allBots[0] + credentialDebug["source"] = "dbFallback" + + if systemBot: + email = systemBot.get("email") + encryptedPwd = systemBot.get("encryptedPassword") + credentialDebug["source"] = credentialDebug.get("source", "db") + credentialDebug["botEmail"] = email + if encryptedPwd: + try: + from modules.shared.configuration import decryptValue + password = decryptValue(encryptedPwd, userId=str(context.user.id), keyName="systemBotPassword") + logger.info(f"[test-auth] Loaded from DB: {email}") + except Exception as e: + credentialDebug["passwordError"] = str(e) + logger.error(f"[test-auth] Password decryption failed: {e}") + else: + logger.warning(f"[test-auth] No credentials provided and no system bot in DB") + credentialDebug["source"] = "noneFound" # Forward to browser bot service browserBotUrl = effectiveConfig._getEffectiveBrowserBotUrl()