初始化工程
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
"""管理员创建的访问 UUID 持久化存储。
|
||||
|
||||
位置:`data/user_data/access_uuids.json`,权限 0600。
|
||||
与 secrets.json 分离,避免凭据文件过大且便于独立管理。
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
import uuid
|
||||
from pathlib import Path
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _path() -> Path:
|
||||
from app.config import settings
|
||||
p = settings.data_dir / "user_data" / "access_uuids.json"
|
||||
p.parent.mkdir(parents=True, exist_ok=True)
|
||||
return p
|
||||
|
||||
|
||||
def _load() -> list[dict]:
|
||||
p = _path()
|
||||
if p.exists():
|
||||
try:
|
||||
data = json.loads(p.read_text(encoding="utf-8"))
|
||||
if isinstance(data, list):
|
||||
return data
|
||||
except Exception as e: # noqa: BLE001
|
||||
logger.warning("access_uuids.json malformed: %s", e)
|
||||
return []
|
||||
|
||||
|
||||
def _save(records: list[dict]) -> list[dict]:
|
||||
p = _path()
|
||||
p.write_text(json.dumps(records, indent=2, ensure_ascii=False), encoding="utf-8")
|
||||
try:
|
||||
os.chmod(p, 0o600)
|
||||
except OSError:
|
||||
pass
|
||||
return records
|
||||
|
||||
|
||||
def list_uuids() -> list[dict]:
|
||||
"""返回所有 UUID 记录(按创建时间倒序)。"""
|
||||
records = _load()
|
||||
records.sort(key=lambda r: r.get("created_at", 0), reverse=True)
|
||||
return records
|
||||
|
||||
|
||||
def exists(uuid: str) -> bool:
|
||||
"""检查 UUID 是否存在且启用。"""
|
||||
normalized = uuid.strip()
|
||||
return any(r.get("uuid") == normalized and r.get("enabled", True) for r in _load())
|
||||
|
||||
|
||||
def create(label: str = "") -> dict:
|
||||
"""创建一个新的访问 UUID。"""
|
||||
records = _load()
|
||||
new_uuid = str(uuid.uuid4())
|
||||
record = {
|
||||
"uuid": new_uuid,
|
||||
"label": (label or "").strip(),
|
||||
"enabled": True,
|
||||
"created_at": int(time.time()),
|
||||
}
|
||||
records.append(record)
|
||||
_save(records)
|
||||
return record
|
||||
|
||||
|
||||
def delete(uuid: str) -> bool:
|
||||
"""删除指定 UUID。"""
|
||||
records = _load()
|
||||
original_len = len(records)
|
||||
records = [r for r in records if r.get("uuid") != uuid.strip()]
|
||||
if len(records) == original_len:
|
||||
return False
|
||||
_save(records)
|
||||
return True
|
||||
|
||||
|
||||
def toggle(uuid: str, enabled: bool) -> bool:
|
||||
"""启用/禁用指定 UUID。"""
|
||||
records = _load()
|
||||
found = False
|
||||
for r in records:
|
||||
if r.get("uuid") == uuid.strip():
|
||||
r["enabled"] = enabled
|
||||
found = True
|
||||
break
|
||||
if not found:
|
||||
return False
|
||||
_save(records)
|
||||
return True
|
||||
Reference in New Issue
Block a user