这是一个批量整理提交,包含以下主要改动: 1. 删除多处冗余的空行和未使用的导入 2. 修复文件末尾缺少换行符的问题 3. 调整部分模块的导入顺序与代码排版 4. 修复部分配置默认值与策略逻辑 5. 新增多个功能模块与辅助工具 6. 完善异常处理与日志记录 7. 修复速率限制、消息缓存、权限校验等逻辑bug 8. 废弃部分旧有API与配置项并添加警告提示
75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import Any
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def fetch_app_owner_open_id(client: Any) -> str | None:
|
|
try:
|
|
resp = await client.bot.v3.info()
|
|
if not resp.success():
|
|
logger.warning("[FeishuAppOwner] Failed to fetch bot info: %s", resp.msg)
|
|
return None
|
|
|
|
bot_info = resp.data if hasattr(resp, "data") else {}
|
|
app_owner_open_id = getattr(bot_info, "app_owner_open_id", "") or bot_info.get("app_owner_open_id", "")
|
|
if app_owner_open_id:
|
|
logger.info("[FeishuAppOwner] App owner open_id: %s...", app_owner_open_id[:8])
|
|
return app_owner_open_id
|
|
|
|
logger.warning("[FeishuAppOwner] No app_owner_open_id in bot info response")
|
|
return None
|
|
except Exception as e:
|
|
logger.warning("[FeishuAppOwner] fetch_app_owner_open_id failed: %s", e)
|
|
return None
|
|
|
|
|
|
async def resolve_app_owner_open_id(client: Any, config: dict[str, Any]) -> str:
|
|
explicit = config.get("docOwnerOpenId", "") or config.get("app_owner_open_id", "")
|
|
if explicit:
|
|
return explicit
|
|
|
|
fetched = await fetch_app_owner_open_id(client)
|
|
if fetched:
|
|
return fetched
|
|
|
|
logger.warning("[FeishuAppOwner] Could not resolve app owner open_id, using bot_open_id fallback")
|
|
return config.get("bot_open_id", "")
|
|
|
|
|
|
async def validate_owner_permission(
|
|
client: Any,
|
|
owner_open_id: str,
|
|
resource_type: str,
|
|
resource_token: str,
|
|
) -> bool:
|
|
try:
|
|
from .tools.perm import list_file_members
|
|
|
|
members = await list_file_members(client, resource_token)
|
|
for member in members:
|
|
if member.get("member_id") == owner_open_id and member.get("perm") == "full_access":
|
|
return True
|
|
return False
|
|
except Exception as e:
|
|
logger.warning("[FeishuAppOwner] Permission validation failed: %s", e)
|
|
return False
|
|
|
|
|
|
async def ensure_owner_access(
|
|
client: Any,
|
|
owner_open_id: str,
|
|
resource_type: str,
|
|
resource_token: str,
|
|
) -> bool:
|
|
try:
|
|
from .tools.perm import add_file_permission
|
|
|
|
await add_file_permission(client, resource_token, "openid", owner_open_id, "full_access")
|
|
logger.info("[FeishuAppOwner] Granted full_access to owner %s on %s", owner_open_id[:8], resource_token[:16])
|
|
return True
|
|
except Exception as e:
|
|
logger.warning("[FeishuAppOwner] Failed to grant owner access: %s", e)
|
|
return False |