1. 新增close_poll、get_poll_results方法实现投票管理 2. 新增pin_message、unpin_message、list_pins实现消息置顶功能 3. 调整导入顺序优化代码整洁度 4. 修复去重逻辑的判断顺序问题 5. 清理多余的空行和导入冗余
81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
import os
|
|
from typing import Any
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
SECRET_TARGETS = [
|
|
{"key": "bot_user", "label": "Bot Username", "source": "direct", "secret": False},
|
|
{"key": "app_password", "label": "App Password", "source": "direct", "secret": True},
|
|
{"key": "api_user", "label": "API Username", "source": "direct", "secret": False},
|
|
{"key": "api_password", "label": "API Password", "source": "direct", "secret": True},
|
|
{"key": "bot_secret_file", "label": "Bot Secret File", "source": "file", "secret": True},
|
|
{"key": "NEXTCLOUD_TALK_BOT_USER", "label": "Env: NEXTCLOUD_TALK_BOT_USER", "source": "env", "secret": False},
|
|
{
|
|
"key": "NEXTCLOUD_TALK_APP_PASSWORD",
|
|
"label": "Env: NEXTCLOUD_TALK_APP_PASSWORD",
|
|
"source": "env",
|
|
"secret": True,
|
|
},
|
|
{
|
|
"key": "NEXTCLOUD_TALK_API_PASSWORD",
|
|
"label": "Env: NEXTCLOUD_TALK_API_PASSWORD",
|
|
"source": "env",
|
|
"secret": True,
|
|
},
|
|
{
|
|
"key": "NEXTCLOUD_TALK_BOT_SECRET",
|
|
"label": "Env: NEXTCLOUD_TALK_BOT_SECRET",
|
|
"source": "env",
|
|
"secret": True,
|
|
},
|
|
]
|
|
|
|
|
|
def list_secret_targets() -> list[dict[str, Any]]:
|
|
return SECRET_TARGETS
|
|
|
|
|
|
def collect_runtime_secrets(config: dict[str, Any]) -> dict[str, Any]:
|
|
secrets: dict[str, Any] = {}
|
|
bot_user = config.get("bot_user", config.get("botUser", ""))
|
|
app_password = config.get("app_password", config.get("appPassword", ""))
|
|
api_user = config.get("api_user", "")
|
|
api_password = config.get("api_password", "")
|
|
|
|
if not bot_user:
|
|
bot_user = os.getenv("NEXTCLOUD_TALK_BOT_USER", "")
|
|
if not app_password:
|
|
app_password = os.getenv(
|
|
"NEXTCLOUD_TALK_APP_PASSWORD",
|
|
os.getenv("NEXTCLOUD_TALK_API_PASSWORD", os.getenv("NEXTCLOUD_TALK_BOT_SECRET", "")),
|
|
)
|
|
|
|
secrets["bot_user"] = {"value": bot_user, "present": bool(bot_user)}
|
|
secrets["app_password"] = {"value": "***" if app_password else "", "present": bool(app_password)}
|
|
secrets["api_user"] = {"value": api_user, "present": bool(api_user)}
|
|
secrets["api_password"] = {"value": "***" if api_password else "", "present": bool(api_password)}
|
|
|
|
return secrets
|
|
|
|
|
|
def verify_secret_contract(config: dict[str, Any]) -> dict[str, Any]:
|
|
result: dict[str, Any] = {"valid": True, "issues": []}
|
|
secrets = collect_runtime_secrets(config)
|
|
|
|
if not secrets["bot_user"]["present"]:
|
|
result["valid"] = False
|
|
result["issues"].append("bot_user is missing")
|
|
if not secrets["app_password"]["present"]:
|
|
result["valid"] = False
|
|
result["issues"].append("app_password is missing")
|
|
|
|
server_url = config.get("server_url", "")
|
|
if not server_url:
|
|
result["valid"] = False
|
|
result["issues"].append("server_url is missing")
|
|
|
|
return result
|