[feat](trx-frontend-http): separate transmit permission
CI / frontend (pull_request) Successful in 5m21s
CI / lint (pull_request) Successful in 2m24s
CI / test (pull_request) Successful in 9m11s
CI / test (push) Successful in 8m16s
CI / frontend (push) Successful in 4m24s
CI / reuse (push) Successful in 5s
CI / reuse (pull_request) Successful in 5s
CI / lint (push) Successful in 2m25s
CI / frontend (pull_request) Successful in 5m21s
CI / lint (pull_request) Successful in 2m24s
CI / test (pull_request) Successful in 9m11s
CI / test (push) Successful in 8m16s
CI / frontend (push) Successful in 4m24s
CI / reuse (push) Successful in 5s
CI / reuse (pull_request) Successful in 5s
CI / lint (push) Successful in 2m25s
Assisted-By: Codex (GPT-5) Signed-off-by: Stan Grams <sjg@haxx.space>
This commit was merged in pull request #64.
This commit is contained in:
@@ -926,8 +926,9 @@ main
|
||||
### HTTP Frontend Auth
|
||||
|
||||
- Optional Argon2id-backed managed accounts with HttpOnly session cookies
|
||||
- An exclusive Guest role plus composable Read, Control, Write, and Administrator roles, with policy shared by middleware and handlers
|
||||
- An exclusive Guest role plus composable Read, Control, Transmit, Write, and Administrator roles, with policy shared by middleware and handlers
|
||||
- Guest sessions receive read-only station access but no account-control endpoints or panels
|
||||
- Transmit separately gates PTT, TX audio frames, and TX power-limit changes
|
||||
- Atomic JSON persistence with migration from the legacy single-role schema
|
||||
- Account enable/disable, administrator CRUD, self-service password changes, and session revocation on security changes
|
||||
- A database invariant always preserves at least one enabled administrator
|
||||
|
||||
@@ -541,8 +541,8 @@ setting, which is also what LoTW's station locations expect.
|
||||
rotate operators through one station callsign, which is why contest loggers record it per QSO.
|
||||
It is stored per QSO, defaulted from the configured callsign so a single operator never touches
|
||||
it, and changed on the station line at the top of the panel where it sticks for the session.
|
||||
It cannot be taken from the session's identity: the auth roles are `admin` and `user`, with no
|
||||
notion of who is logged in.
|
||||
It cannot be inferred from the session's identity: an account username need not be an operator
|
||||
callsign, and operational accounts may be shared.
|
||||
|
||||
**Server clock, and the log says so.** The server is the machine at the radio; the browser may
|
||||
be on a phone in another timezone with a clock nobody has checked. QSO times are UTC from the
|
||||
|
||||
@@ -127,7 +127,7 @@ When auth is enabled, an **auth gate** blocks the UI with:
|
||||
- Role badge display
|
||||
|
||||
**Guest** provides read-only station access and is exclusive. Non-Guest accounts
|
||||
may combine **Read**, **Control**, **Write**, and **Administrator** roles.
|
||||
may combine **Read**, **Control**, **Transmit**, **Write**, and **Administrator** roles.
|
||||
Administrator implies all permissions.
|
||||
|
||||
Session cookie: `trx_http_sid`, HttpOnly, configurable Secure and SameSite attributes.
|
||||
@@ -337,13 +337,14 @@ Logo and favicon are embedded at compile time via `include_bytes!`. The logo ima
|
||||
|
||||
### 7.1 Route Access Classification
|
||||
|
||||
Routes are classified into three tiers:
|
||||
Routes are classified into access tiers:
|
||||
|
||||
| Tier | Examples | Requirement |
|
||||
|---|---|---|
|
||||
| **Public** | `/`, `/index.html`, `/map`, login/session endpoints, static assets | None |
|
||||
| **Read** | `/status`, `/events`, `/audio`, `/decode`, `/spectrum`, `/bookmarks` | Guest, Read, Control, or Administrator role |
|
||||
| **Control** | `/set_freq`, `/set_mode`, `/set_ptt`, `/toggle_power`, radio-control POST routes | Control or Administrator role |
|
||||
| **Read** | `/status`, `/events`, `/audio`, `/decode`, `/spectrum`, `/bookmarks` | Guest, Read, Control, Transmit, or Administrator role |
|
||||
| **Control** | `/set_freq`, `/set_mode`, `/toggle_power`, receive-side radio-control POST routes | Control or Administrator role |
|
||||
| **Transmit** | `/set_ptt`, `/set_tx_limit`, outbound `/audio` frames | Transmit or Administrator role |
|
||||
| **Write** | Logbook access and bookmark mutations | Write or Administrator role |
|
||||
|
||||
### 7.2 Session Management
|
||||
|
||||
+5
-3
@@ -593,7 +593,8 @@ The HTTP frontend supports an optional user/password ACL:
|
||||
|
||||
- **Guest** — read-only station access with no Account or Users controls; Guest cannot be combined with another role
|
||||
- **Read** — monitoring, audio, decode streams, and bookmark reads
|
||||
- **Control** — full radio receive/transmit controls
|
||||
- **Control** — tuning, mode, power, and receive-side radio controls
|
||||
- **Transmit** — PTT, transmitted audio, and TX power-limit controls
|
||||
- **Write** — logbook access and bookmark changes
|
||||
- **Administrator** — user management and all other permissions
|
||||
|
||||
@@ -644,8 +645,9 @@ credentials in configuration before first startup on an exposed deployment.
|
||||
| `/auth/users` | GET/POST | List or add users (admin only) |
|
||||
| `/auth/users/{username}` | PATCH/DELETE | Change enabled state/password/roles or remove user (administrator only) |
|
||||
|
||||
Read routes accept Guest or require Read. Radio mutations require Control. Logbook access and
|
||||
bookmark mutations require Write. Administrator grants every permission.
|
||||
Read routes accept Guest or require Read. Tuning and receive-side radio mutations
|
||||
require Control. PTT, transmitted audio, and TX limit changes require Transmit.
|
||||
Logbook access and bookmark mutations require Write. Administrator grants every permission.
|
||||
|
||||
### Frontend Flow
|
||||
|
||||
|
||||
Reference in New Issue
Block a user