| """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(), |
| } |
|
|