feat: intégration TikTak #197-200 + scoped tokens, webhooks filtrés, listes mtime/size ; fix e2e-server BUG-112
CI / lint (push) Successful in 3m17s
CI / security (push) Failing after 1m51s
CI / test (push) Successful in 5m14s
CI / build (push) Successful in 1m50s
CI / e2e (push) Successful in 18m18s

This commit is contained in:
2026-10-14 11:42:53 -04:00
parent 2be0b15bcf
commit f783394f09
59 changed files with 3233 additions and 77 deletions
+28 -2
View File
@@ -1003,6 +1003,8 @@ async def delete_user_endpoint(
class CreateApiTokenRequest(BaseModel):
name: str
expiry: str # 1d | 30d | 180d | 365d | never
vaults: list[str] | None = None # #199 : None = vaults du créateur (comportement actuel)
scope: str = "full" # #199 : "full" | "files"
@router.get("/tokens")
@@ -1020,9 +1022,33 @@ async def create_user_token(
request: Request,
current_user=Depends(require_auth),
):
"""Create a long-lived API/MCP token. The raw JWT is returned ONCE."""
"""Create a long-lived API/MCP token. The raw JWT is returned ONCE.
#199 : portée optionnelle — ``vaults`` (sous-ensemble des vaults du
créateur, défaut = tous) et ``scope`` (``"full"`` ou ``"files"``).
"""
from backend.auth.jwt_handler import API_TOKEN_SCOPES
from backend.auth.middleware import check_vault_access
from backend.indexer import index
scope = (req.scope or "full").strip().lower()
if scope not in API_TOKEN_SCOPES:
raise HTTPException(400, "Portée invalide (full | files)")
vaults: list[str] | None = None
if req.vaults is not None:
cleaned = sorted({v.strip() for v in req.vaults if isinstance(v, str) and v.strip()})
if not cleaned:
raise HTTPException(400, "Liste de vaults vide")
unknown = [v for v in cleaned if v not in index]
if unknown:
raise HTTPException(400, f"Vaults inconnus : {', '.join(unknown)}")
denied = [v for v in cleaned if not check_vault_access(v, current_user)]
if denied:
raise HTTPException(403, f"Accès refusé aux vaults : {', '.join(denied)}")
vaults = cleaned
try:
record, token = create_api_token(current_user, req.name.strip(), req.expiry)
record, token = create_api_token(current_user, req.name.strip(), req.expiry,
vaults=vaults, scope=scope)
except ValueError as e:
raise HTTPException(400, str(e))
from backend.audit import log_config_change