fix(feishu): fail closed for update prompt card actions

This commit is contained in:
Dusk1e
2026-06-07 06:21:37 -07:00
committed by Teknium
parent 410cb743bf
commit 3fa15b33dd
2 changed files with 125 additions and 5 deletions
+53 -5
View File
@@ -2644,7 +2644,8 @@ class FeishuAdapter(BasePlatformAdapter):
if prompt_id is None:
logger.debug("[Feishu] Card action missing update_prompt_id, ignoring")
return P2CardActionTriggerResponse() if P2CardActionTriggerResponse else None
if prompt_id not in self._update_prompt_state:
state = self._update_prompt_state.get(prompt_id)
if not state:
logger.debug("[Feishu] Update prompt %s already resolved or unknown", prompt_id)
return P2CardActionTriggerResponse() if P2CardActionTriggerResponse else None
@@ -2655,12 +2656,33 @@ class FeishuAdapter(BasePlatformAdapter):
operator = getattr(event, "operator", None)
open_id = str(getattr(operator, "open_id", "") or "")
if not self._is_interactive_operator_authorized(open_id):
sender_id = SimpleNamespace(open_id=open_id, user_id=str(getattr(operator, "user_id", "") or ""))
if not self._allow_group_message(sender_id, state.get("chat_id", ""), is_bot=False):
logger.warning("[Feishu] Unauthorized update prompt click by %s", open_id or "<unknown>")
return P2CardActionTriggerResponse() if P2CardActionTriggerResponse else None
callback_chat_id = str(getattr(getattr(event, "context", None), "open_chat_id", "") or "")
expected_chat_id = str(state.get("chat_id", "") or "")
if callback_chat_id and expected_chat_id and callback_chat_id != expected_chat_id:
logger.warning(
"[Feishu] Update prompt callback chat mismatch for %s (expected=%s, got=%s)",
prompt_id,
expected_chat_id,
callback_chat_id,
)
return P2CardActionTriggerResponse() if P2CardActionTriggerResponse else None
user_name = self._get_cached_sender_name(open_id) or open_id
if not self._submit_on_loop(loop, self._resolve_update_prompt(prompt_id, answer, user_name)):
if not self._submit_on_loop(
loop,
self._resolve_update_prompt(
prompt_id,
answer,
user_name,
open_id=open_id,
chat_id=callback_chat_id,
),
):
return P2CardActionTriggerResponse() if P2CardActionTriggerResponse else None
if P2CardActionTriggerResponse is None:
@@ -2711,12 +2733,38 @@ class FeishuAdapter(BasePlatformAdapter):
except Exception as exc:
logger.error("Failed to resolve gateway approval from Feishu button: %s", exc)
async def _resolve_update_prompt(self, prompt_id: Any, answer: str, user_name: str) -> None:
async def _resolve_update_prompt(
self,
prompt_id: Any,
answer: str,
user_name: str,
*,
open_id: str = "",
chat_id: str = "",
) -> None:
"""Persist an update prompt answer for the detached update process."""
state = self._update_prompt_state.pop(prompt_id, None)
state = self._update_prompt_state.get(prompt_id)
if not state:
logger.debug("[Feishu] Update prompt %s already resolved or unknown", prompt_id)
return
if open_id:
sender_id = SimpleNamespace(open_id=open_id, user_id="")
if not self._allow_group_message(sender_id, state.get("chat_id", ""), is_bot=False):
logger.warning("[Feishu] Unauthorized update prompt click by %s for prompt %s", open_id, prompt_id)
return
expected_chat_id = str(state.get("chat_id", "") or "")
if expected_chat_id and chat_id and expected_chat_id != chat_id:
logger.warning(
"[Feishu] Update prompt %s chat mismatch (expected=%s, got=%s)",
prompt_id,
expected_chat_id,
chat_id,
)
return
state = self._update_prompt_state.pop(prompt_id, None)
if not state:
logger.debug("[Feishu] Update prompt %s already resolved while validating callback", prompt_id)
return
try:
self._write_update_prompt_response(answer)
logger.info(