fix: WS reconnection deadlock, remove redundant try/except, fix docs

- websocket.js: schedule reconnect backoff when token refresh fails,
  otherwise WebSocket stays dead after 3+ disconnects with failed refresh
- daemon/handlers/auth.py: remove two redundant try/except ValueError: raise
  blocks in webauthn register/authenticate finish handlers
- docs/api.md: mark permissions as optional in Create User endpoint
This commit is contained in:
2026-07-28 01:44:10 +00:00
parent 358573567d
commit 739253b2e5
3 changed files with 8 additions and 12 deletions
-6
View File
@@ -409,13 +409,10 @@ def webauthn_register_finish(_request: Any, body: Any) -> dict[str, Any]:
"username, credential_response, and registration_options are required" "username, credential_response, and registration_options are required"
) )
try:
cred = verify_registration( cred = verify_registration(
username, credential_response, registration_options, credential_name username, credential_response, registration_options, credential_name
) )
return {"ok": True, "credential": cred} return {"ok": True, "credential": cred}
except ValueError:
raise
@registry.register(POST_AUTH_WEBAUTHN_AUTHENTICATE_BEGIN) @registry.register(POST_AUTH_WEBAUTHN_AUTHENTICATE_BEGIN)
@@ -458,10 +455,7 @@ def webauthn_authenticate_finish(_request: Any, body: Any) -> dict[str, Any]:
if not check_webauthn_rate(username, client_ip): if not check_webauthn_rate(username, client_ip):
raise ValueError("Too many WebAuthn attempts. Please try again later.") raise ValueError("Too many WebAuthn attempts. Please try again later.")
try:
verify_authentication(username, assertion_response, auth_options) verify_authentication(username, assertion_response, auth_options)
except ValueError:
raise
user = get_user(username) user = get_user(username)
if user is None: if user is None:
+1 -1
View File
@@ -204,7 +204,7 @@ Create a new user with password and per-subsystem permissions.
|---|---|---|---| |---|---|---|---|
| `username` | `string` | Yes | Username | | `username` | `string` | Yes | Username |
| `password` | `string` | Yes | Plain-text password | | `password` | `string` | Yes | Plain-text password |
| `permissions` | `object` | Yes | Per-subsystem permissions (`{ subsystem: "read" \| "rw" }`) | | `permissions` | `object` | No | Per-subsystem permissions (`{ subsystem: "read" \| "rw" }`) |
**Response:** `data` is `null` on success. **Response:** `data` is `null` on success.
+2
View File
@@ -62,6 +62,8 @@ function _wsConnect() {
setTimeout(_wsConnect, 100); setTimeout(_wsConnect, 100);
}).catch(() => { }).catch(() => {
_wsRefreshing = false; _wsRefreshing = false;
_wsReconnectMs = Math.min(_wsReconnectMs * 2 + 1000, 15000);
setTimeout(_wsConnect, _wsReconnectMs);
}); });
return; return;
} }