From 336dfa95d3af84869e03ab9102b33b52b22f7912 Mon Sep 17 00:00:00 2001 From: memosr Date: Mon, 13 Apr 2026 23:48:49 +0300 Subject: [PATCH] fix(security): require session token and whitelist key validation for PUT/DELETE /api/env endpoints --- hermes_cli/web_server.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index 77053292e..55e5eca17 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -503,7 +503,16 @@ async def get_env_vars(): @app.put("/api/env") -async def set_env_var(body: EnvVarUpdate): +async def set_env_var(body: EnvVarUpdate, request: Request): + # --- Token check --- + auth = request.headers.get("authorization", "") + if auth != f"Bearer {_SESSION_TOKEN}": + raise HTTPException(status_code=401, detail="Unauthorized") + + # --- Whitelist check --- + if body.key not in OPTIONAL_ENV_VARS: + raise HTTPException(status_code=400, detail=f"{body.key} is not an allowed env var") + try: save_env_value(body.key, body.value) return {"ok": True, "key": body.key} @@ -513,7 +522,16 @@ async def set_env_var(body: EnvVarUpdate): @app.delete("/api/env") -async def remove_env_var(body: EnvVarDelete): +async def remove_env_var(body: EnvVarDelete, request: Request): + # --- Token check --- + auth = request.headers.get("authorization", "") + if auth != f"Bearer {_SESSION_TOKEN}": + raise HTTPException(status_code=401, detail="Unauthorized") + + # --- Whitelist check --- + if body.key not in OPTIONAL_ENV_VARS: + raise HTTPException(status_code=400, detail=f"{body.key} is not an allowed env var") + try: removed = remove_env_value(body.key) if not removed: