"""Phase5-H Feature Flags (PRD §51 Stage 1 - Rollback)。 5 個 env-driven flag,全為「預設啟用、出問題可關掉」設計。 | Flag | env 名稱 | 預設 | 作用 | |-------------------------|------------------------|------|--------------------------------------------------| | 2FA 強制 | FEATURE_2FA | true | false → admin/senior_manager 不再強制 2FA grace | | senior_manager 角色 UI | FEATURE_SENIOR_MANAGER | true | false → 不可建立 senior_manager 帳號(API+UI 雙鎖)| | 垃圾桶頁 UI | FEATURE_TRASH_UI | true | false → 前端隱藏垃圾桶頁入口(後端仍可運作) | | 帳號管理進階篩選 UI | FEATURE_ACCOUNT_FILTER | true | false → 前端退回簡化版使用者管理頁 | | FTS5 全文檢索 | FEATURE_FTS5 | false| true → search.py 走 FTS5;其他模組此檔僅顯示狀態 | 註:`FEATURE_FTS5` 預設為 false(與 search.py L36 一致:中文 LIKE 較可靠)。 """ from __future__ import annotations import os from typing import Any def _truthy(env_name: str, default: bool) -> bool: raw = os.environ.get(env_name) if raw is None: return default return raw.strip().lower() in ("1", "true", "yes", "on") def feature_2fa() -> bool: return _truthy("FEATURE_2FA", True) def feature_senior_manager() -> bool: return _truthy("FEATURE_SENIOR_MANAGER", True) def feature_trash_ui() -> bool: return _truthy("FEATURE_TRASH_UI", True) def feature_account_filter() -> bool: return _truthy("FEATURE_ACCOUNT_FILTER", True) def feature_fts5() -> bool: return _truthy("FEATURE_FTS5", False) def feature_hsts() -> bool: """是否輸出 HSTS header。dev/http 預設 off;正式 HTTPS 部署設 KBV5_HSTS=1。""" return _truthy("KBV5_HSTS", False) def get_all() -> dict[str, Any]: return { "FEATURE_2FA": feature_2fa(), "FEATURE_SENIOR_MANAGER": feature_senior_manager(), "FEATURE_TRASH_UI": feature_trash_ui(), "FEATURE_ACCOUNT_FILTER": feature_account_filter(), "FEATURE_FTS5": feature_fts5(), }