Separate user administration test documentation
This commit is contained in:
@@ -19,7 +19,8 @@ Hardware characterization, the serial core, USB CDC-ACM, Wi-Fi, HTTPS/WebSocket,
|
|||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
- [Hardware wiring](docs/wiring.md): hardware profile, GPIO assignments, connector guidance, and safety notes.
|
- [Hardware wiring](docs/wiring.md): hardware profile, GPIO assignments, connector guidance, and safety notes.
|
||||||
- [Electrical tests](docs/electrical_tests.md): MAX3243, UART loopback, and session-broker verification procedures.
|
- [Electrical tests](docs/electrical_tests.md): OLED/buttons, MAX3243, UART loopback, and session-broker verification procedures.
|
||||||
|
- [Role-based user database and UART0 administration](docs/user_administration_tests.md): user migration and administration, HTTPS/SSH authentication, and session-revocation validation.
|
||||||
- [Command reference](docs/command_reference.md): UART0 administration, serial, broker, USB, Wi-Fi, web, SSH, and diagnostic commands.
|
- [Command reference](docs/command_reference.md): UART0 administration, serial, broker, USB, Wi-Fi, web, SSH, and diagnostic commands.
|
||||||
|
|
||||||
## Flash partition layout
|
## Flash partition layout
|
||||||
|
|||||||
@@ -186,125 +186,6 @@ Exercise the following fault matrix while keeping UART0 available:
|
|||||||
|
|
||||||
For the final concurrency regression, connect USB CDC, one WebSocket terminal, and one SSH terminal while UART1 carries sustained bidirectional traffic. Navigate the UI, run the persistence checks, exercise service stop/start and writer revocation, and inject the display/stuck-button faults above. Confirm UART0 remains responsive, the UI never appears as a broker client or injects serial bytes, writer ownership is always the expected client or none, and serial/broker drop counters do not increase unexpectedly. Record `memory`, transport counters, `wifi counters`, and `debug display status` before and after the run.
|
For the final concurrency regression, connect USB CDC, one WebSocket terminal, and one SSH terminal while UART1 carries sustained bidirectional traffic. Navigate the UI, run the persistence checks, exercise service stop/start and writer revocation, and inject the display/stuck-button faults above. Confirm UART0 remains responsive, the UI never appears as a broker client or injects serial bytes, writer ownership is always the expected client or none, and serial/broker drop counters do not increase unexpectedly. Record `memory`, transport counters, `wifi counters`, and `debug display status` before and after the run.
|
||||||
|
|
||||||
## Phase 8A role-based user database and UART0 administration
|
|
||||||
|
|
||||||
Keep UART0 physically attached throughout these tests. Phase 8A deliberately does not change HTTPS or SSH authentication: existing network sessions still use the legacy shared credential, while the new database and public keys are prepared for the Phase 8B cutover. Do not include generated or entered passwords in test logs.
|
|
||||||
|
|
||||||
### 1. First-boot migration and persistence
|
|
||||||
|
|
||||||
Upgrade a device that already has working HTTPS/SSH credentials and no `user_db` blob. After boot:
|
|
||||||
|
|
||||||
1. Run `user status` and `user show admin`.
|
|
||||||
2. Confirm exactly one `admin`-named account exists with role `user`, `bootstrapped=no`, no displayed password/salt/verifier, and no public keys.
|
|
||||||
3. Confirm the pre-upgrade credential still authenticates to HTTPS and SSH and that serial terminal behavior is unchanged.
|
|
||||||
4. Reboot and confirm `user status` reports the same account ID and authentication generation.
|
|
||||||
5. Confirm routine boot logs, `status`, `web status`, and `ssh status` contain no user password, verifier, salt, or raw public-key blob.
|
|
||||||
|
|
||||||
A transient failure reading the legacy web credential must not create or commit an empty user database. If a valid `user_db` blob already exists, it must still load without the legacy credential being readable.
|
|
||||||
|
|
||||||
### 2. Administrator bootstrap
|
|
||||||
|
|
||||||
Run `user bootstrap`, verify that typed password characters are not echoed, enter a 12–64 character printable password twice, and confirm `user show admin` now reports role `admin` and a higher authentication generation. Reboot and confirm `bootstrapped=yes` and one administrator persist. On a separate resettable test image, exercise `user bootstrap --generate`; record the generated password securely for the test, verify it is displayed once, then clear the terminal scrollback after use.
|
|
||||||
|
|
||||||
During Phase 8A, verify the newly bootstrapped password does **not** replace the legacy HTTPS/SSH login yet and the existing network credential continues to work. This separation is intentional until Phase 8B. A second `user bootstrap` must be rejected without changing the account.
|
|
||||||
|
|
||||||
### 3. Account CRUD, capacity, and invariants
|
|
||||||
|
|
||||||
Use generated test passwords where practical:
|
|
||||||
|
|
||||||
```text
|
|
||||||
user add operator user --generate
|
|
||||||
user add maint admin --generate
|
|
||||||
user list
|
|
||||||
user show operator
|
|
||||||
user role operator admin --force
|
|
||||||
user role operator user --force
|
|
||||||
user password operator --generate
|
|
||||||
```
|
|
||||||
|
|
||||||
Confirm unique valid usernames are accepted; uppercase, empty, oversized, or punctuation-invalid usernames are rejected. Confirm duplicate users are rejected. Fill all eight slots and verify a ninth account is rejected without altering existing records; delete a non-final account and confirm its slot can be reused with a new account ID.
|
|
||||||
|
|
||||||
With two administrators, demote or delete one and confirm the operation persists. Then attempt both deletion and demotion of the final administrator and confirm both are rejected. Before bootstrap on a separate migration run, verify `user delete admin --force` is rejected so legacy synchronization remains recoverable. `Ctrl-C` during either hidden password prompt must cancel without changing the account or leaving stale input in the next console command.
|
|
||||||
|
|
||||||
### 4. SSH public-key import and fingerprints
|
|
||||||
|
|
||||||
Generate disposable Ed25519 and ECDSA P-256 OpenSSH keys on a trusted host. For each supported type, run `user key add <username>`, paste the single `.pub` line, and confirm `user show <username>` reports the type, stable slot index, and expected `SHA256:` fingerprint without displaying the Base64 blob or comment.
|
|
||||||
|
|
||||||
Verify all of the following fail without changing the account generation or key list:
|
|
||||||
|
|
||||||
- Unsupported RSA, certificate, or unknown key types.
|
|
||||||
- Truncated/invalid Base64, mismatched outer and embedded types, trailing blob data, malformed Ed25519 lengths, and an invalid/off-curve ECDSA point.
|
|
||||||
- Adding the same key again to the same account or assigning it to a different account.
|
|
||||||
- Adding a fourth key to an account that already has three.
|
|
||||||
- Deleting an empty/out-of-range slot.
|
|
||||||
|
|
||||||
Then exercise `user key delete <username> <index> --force` and `user key clear <username> --force`, reboot, and confirm the exact remaining fingerprints persist. Phase 8A stores these keys but does not yet accept SSH key login.
|
|
||||||
|
|
||||||
### 5. Legacy credential rotation boundary and reboot reconciliation
|
|
||||||
|
|
||||||
Before administrator bootstrap on a resettable test image:
|
|
||||||
|
|
||||||
1. Run `web credentials rotate --force`.
|
|
||||||
2. Confirm the console reports that the pre-bootstrap migrated verifier was synchronized.
|
|
||||||
3. Verify the new legacy credential works for HTTPS and SSH, reboot, and confirm `user show admin` retains the synchronized authentication generation.
|
|
||||||
4. Where NVS fault injection or controlled power interruption is available, interrupt after the web credential commits but before the user blob commits. On the next boot, confirm reconciliation updates the migrated verifier rather than committing an empty database or losing network recovery.
|
|
||||||
|
|
||||||
After bootstrap, rotate the legacy credential again. Confirm the console explicitly says it remains separate from user passwords, existing network sessions are revoked, the new legacy credential works, and the bootstrapped administrator generation/password are not silently replaced. Apply the same checks to `web reset --force`, additionally confirming HTTPS certificate recovery/restart behavior remains intact.
|
|
||||||
|
|
||||||
### 6. Explicit database recovery and storage failures
|
|
||||||
|
|
||||||
Using a disposable device or test NVS image, inject a wrong-size/version or malformed `user_db` blob and reboot. Confirm normal database initialization fails without erasing shared NVS, but the `user` command is still registered. `user status` must report the database unavailable. Run:
|
|
||||||
|
|
||||||
```text
|
|
||||||
user recover --force
|
|
||||||
user status
|
|
||||||
user bootstrap --generate
|
|
||||||
```
|
|
||||||
|
|
||||||
Confirm recovery explicitly replaces only `user_db`, imports the current legacy credential as role `user`, and leaves serial, Wi-Fi, HTTPS identity, SSH host key, and legacy network login intact. Confirm recovery is rejected while a valid database is initialized. Simulate NVS write/commit exhaustion or failure during create, password, role, key, and recovery operations; after reboot, each operation must expose either the complete old blob or complete new blob, never a partially live mutation.
|
|
||||||
|
|
||||||
Because NVS is not yet encrypted, this test validates logical verifier storage rather than resistance to physical extraction. PBKDF2 verifiers remain susceptible to offline guessing, and append-oriented NVS may retain historical plaintext legacy credentials until a full partition/flash erase.
|
|
||||||
|
|
||||||
### 7. Phase 8A regression
|
|
||||||
|
|
||||||
With the maximum supported mix of USB CDC, WebSocket, and SSH serial clients active, repeat user list/show and several UART0 mutations. Confirm password prompts remain physical-UART-only, no user operation acquires a broker client or writer lease, existing Phase 8A network authentication and revocation behavior remains functional, and serial/broker counters show no unexplained loss. Record `memory`, `web counters`, and `ssh counters` before and after the run.
|
|
||||||
|
|
||||||
## Phase 8B role-aware HTTPS and SSH authentication
|
|
||||||
|
|
||||||
Complete the Phase 8A bootstrap first and retain two disposable accounts, one `user` and one `admin`. Phase 8B gives both roles the existing serial/status interface; the administrative SSH shell is not expected until Phase 8C.
|
|
||||||
|
|
||||||
### 1. HTTPS passwords and fail-closed behavior
|
|
||||||
|
|
||||||
For both roles, authenticate to `/`, `/api/status`, and the browser terminal with the account password. Confirm the full 16-character username and a 64-character password work, while absent, malformed, oversized, wrong-user, and wrong-password Basic headers fail without exposing which component was wrong. After bootstrap, confirm the value from `web credentials show` no longer authenticates unless it independently equals a current user password.
|
|
||||||
|
|
||||||
On a disposable malformed-database image, confirm HTTPS returns authentication-service unavailable and never falls back to the legacy credential. Recover through physical UART0 only. Verify `web status` reports user-database authentication and active WebSocket sessions show account, user role, and password method without secrets.
|
|
||||||
|
|
||||||
### 2. SSH password and public-key login
|
|
||||||
|
|
||||||
For both `user` and `admin`, verify password SSH login reaches the same broker-backed serial stream as before. Confirm `ssh sessions` shows the account, user role, password method, and writer/observer role. An administrator must not receive UART0 commands yet.
|
|
||||||
|
|
||||||
Import one Ed25519 key and one ECDSA P-256 key through `user key add`, then verify each matching private key authenticates without a password and `ssh sessions` reports `public-key`. Confirm an unregistered key, wrong username, unsupported RSA key, certificate key, and three failed completed attempts are rejected. Normal client probe-then-sign behavior must consume one completed attempt, not two; unsigned probes alone must never create an authenticated session or broker client.
|
|
||||||
|
|
||||||
### 3. WebSocket ticket binding
|
|
||||||
|
|
||||||
Authenticate separately as two users and request tickets. Confirm each ticket is accepted exactly once, expires after 30 seconds, and cannot be reused or altered. Change one account after ticket issuance but before WebSocket connection; its ticket must fail closed without creating a broker client, while the other account's ticket still works. Repeat with delete followed by recreation of the same username and confirm the old ticket remains invalid.
|
|
||||||
|
|
||||||
### 4. Targeted session revocation
|
|
||||||
|
|
||||||
Connect simultaneous WebSocket and SSH sessions for two different users and place one affected session in writer state. One mutation at a time, exercise password change, role change, SSH-key add/delete/clear, and account deletion. Required results:
|
|
||||||
|
|
||||||
1. Outstanding tickets and active sessions for the changed username are revoked promptly and any writer lease is released.
|
|
||||||
2. The stale session cannot inject additional serial bytes or reacquire writer ownership.
|
|
||||||
3. The unrelated user's WebSocket/SSH sessions remain connected and retain their expected broker roles.
|
|
||||||
4. New authentication succeeds only with the updated password/key/role state.
|
|
||||||
5. Deleting and recreating the same username does not revive old tickets or sessions.
|
|
||||||
|
|
||||||
Run `web status`, `ssh sessions`, `web counters`, `ssh counters`, and `broker clients` around each mutation. Also rotate `web credentials rotate --force` after administrator bootstrap and confirm it changes only recovery material: role-based HTTPS/SSH sessions remain connected and user passwords are unchanged. `web reset --force` restarts HTTPS because the TLS identity changes, but must not revoke unrelated SSH sessions.
|
|
||||||
|
|
||||||
### 5. Concurrency regression
|
|
||||||
|
|
||||||
With USB CDC, two role-based network users, one WebSocket terminal, one SSH terminal, and UART1 traffic active, alternate writer ownership and mutate one account. Confirm binary transparency, observer isolation, bounded authentication/handshake behavior, UART0 responsiveness, and no unexpected disconnect of the unaffected user. Record memory, broker, web, SSH, and serial counters before and after. Repeat after reboot to verify passwords, roles, keys, and authentication methods persist.
|
|
||||||
|
|
||||||
## Configuration A: data and handshake pairs
|
## Configuration A: data and handshake pairs
|
||||||
|
|
||||||
Connect the following pairs:
|
Connect the following pairs:
|
||||||
|
|||||||
@@ -0,0 +1,120 @@
|
|||||||
|
# Role-based user database and UART0 administration
|
||||||
|
|
||||||
|
## Phase 8A role-based user database and UART0 administration
|
||||||
|
|
||||||
|
Keep UART0 physically attached throughout these tests. Phase 8A deliberately does not change HTTPS or SSH authentication: existing network sessions still use the legacy shared credential, while the new database and public keys are prepared for the Phase 8B cutover. Do not include generated or entered passwords in test logs.
|
||||||
|
|
||||||
|
### 1. First-boot migration and persistence
|
||||||
|
|
||||||
|
Upgrade a device that already has working HTTPS/SSH credentials and no `user_db` blob. After boot:
|
||||||
|
|
||||||
|
1. Run `user status` and `user show admin`.
|
||||||
|
2. Confirm exactly one `admin`-named account exists with role `user`, `bootstrapped=no`, no displayed password/salt/verifier, and no public keys.
|
||||||
|
3. Confirm the pre-upgrade credential still authenticates to HTTPS and SSH and that serial terminal behavior is unchanged.
|
||||||
|
4. Reboot and confirm `user status` reports the same account ID and authentication generation.
|
||||||
|
5. Confirm routine boot logs, `status`, `web status`, and `ssh status` contain no user password, verifier, salt, or raw public-key blob.
|
||||||
|
|
||||||
|
A transient failure reading the legacy web credential must not create or commit an empty user database. If a valid `user_db` blob already exists, it must still load without the legacy credential being readable.
|
||||||
|
|
||||||
|
### 2. Administrator bootstrap
|
||||||
|
|
||||||
|
Run `user bootstrap`, verify that typed password characters are not echoed, enter a 12–64 character printable password twice, and confirm `user show admin` now reports role `admin` and a higher authentication generation. Reboot and confirm `bootstrapped=yes` and one administrator persist. On a separate resettable test image, exercise `user bootstrap --generate`; record the generated password securely for the test, verify it is displayed once, then clear the terminal scrollback after use.
|
||||||
|
|
||||||
|
During Phase 8A, verify the newly bootstrapped password does **not** replace the legacy HTTPS/SSH login yet and the existing network credential continues to work. This separation is intentional until Phase 8B. A second `user bootstrap` must be rejected without changing the account.
|
||||||
|
|
||||||
|
### 3. Account CRUD, capacity, and invariants
|
||||||
|
|
||||||
|
Use generated test passwords where practical:
|
||||||
|
|
||||||
|
```text
|
||||||
|
user add operator user --generate
|
||||||
|
user add maint admin --generate
|
||||||
|
user list
|
||||||
|
user show operator
|
||||||
|
user role operator admin --force
|
||||||
|
user role operator user --force
|
||||||
|
user password operator --generate
|
||||||
|
```
|
||||||
|
|
||||||
|
Confirm unique valid usernames are accepted; uppercase, empty, oversized, or punctuation-invalid usernames are rejected. Confirm duplicate users are rejected. Fill all eight slots and verify a ninth account is rejected without altering existing records; delete a non-final account and confirm its slot can be reused with a new account ID.
|
||||||
|
|
||||||
|
With two administrators, demote or delete one and confirm the operation persists. Then attempt both deletion and demotion of the final administrator and confirm both are rejected. Before bootstrap on a separate migration run, verify `user delete admin --force` is rejected so legacy synchronization remains recoverable. `Ctrl-C` during either hidden password prompt must cancel without changing the account or leaving stale input in the next console command.
|
||||||
|
|
||||||
|
### 4. SSH public-key import and fingerprints
|
||||||
|
|
||||||
|
Generate disposable Ed25519 and ECDSA P-256 OpenSSH keys on a trusted host. For each supported type, run `user key add <username>`, paste the single `.pub` line, and confirm `user show <username>` reports the type, stable slot index, and expected `SHA256:` fingerprint without displaying the Base64 blob or comment.
|
||||||
|
|
||||||
|
Verify all of the following fail without changing the account generation or key list:
|
||||||
|
|
||||||
|
- Unsupported RSA, certificate, or unknown key types.
|
||||||
|
- Truncated/invalid Base64, mismatched outer and embedded types, trailing blob data, malformed Ed25519 lengths, and an invalid/off-curve ECDSA point.
|
||||||
|
- Adding the same key again to the same account or assigning it to a different account.
|
||||||
|
- Adding a fourth key to an account that already has three.
|
||||||
|
- Deleting an empty/out-of-range slot.
|
||||||
|
|
||||||
|
Then exercise `user key delete <username> <index> --force` and `user key clear <username> --force`, reboot, and confirm the exact remaining fingerprints persist. Phase 8A stores these keys but does not yet accept SSH key login.
|
||||||
|
|
||||||
|
### 5. Legacy credential rotation boundary and reboot reconciliation
|
||||||
|
|
||||||
|
Before administrator bootstrap on a resettable test image:
|
||||||
|
|
||||||
|
1. Run `web credentials rotate --force`.
|
||||||
|
2. Confirm the console reports that the pre-bootstrap migrated verifier was synchronized.
|
||||||
|
3. Verify the new legacy credential works for HTTPS and SSH, reboot, and confirm `user show admin` retains the synchronized authentication generation.
|
||||||
|
4. Where NVS fault injection or controlled power interruption is available, interrupt after the web credential commits but before the user blob commits. On the next boot, confirm reconciliation updates the migrated verifier rather than committing an empty database or losing network recovery.
|
||||||
|
|
||||||
|
After bootstrap, rotate the legacy credential again. Confirm the console explicitly says it remains separate from user passwords, existing network sessions are revoked, the new legacy credential works, and the bootstrapped administrator generation/password are not silently replaced. Apply the same checks to `web reset --force`, additionally confirming HTTPS certificate recovery/restart behavior remains intact.
|
||||||
|
|
||||||
|
### 6. Explicit database recovery and storage failures
|
||||||
|
|
||||||
|
Using a disposable device or test NVS image, inject a wrong-size/version or malformed `user_db` blob and reboot. Confirm normal database initialization fails without erasing shared NVS, but the `user` command is still registered. `user status` must report the database unavailable. Run:
|
||||||
|
|
||||||
|
```text
|
||||||
|
user recover --force
|
||||||
|
user status
|
||||||
|
user bootstrap --generate
|
||||||
|
```
|
||||||
|
|
||||||
|
Confirm recovery explicitly replaces only `user_db`, imports the current legacy credential as role `user`, and leaves serial, Wi-Fi, HTTPS identity, SSH host key, and legacy network login intact. Confirm recovery is rejected while a valid database is initialized. Simulate NVS write/commit exhaustion or failure during create, password, role, key, and recovery operations; after reboot, each operation must expose either the complete old blob or complete new blob, never a partially live mutation.
|
||||||
|
|
||||||
|
Because NVS is not yet encrypted, this test validates logical verifier storage rather than resistance to physical extraction. PBKDF2 verifiers remain susceptible to offline guessing, and append-oriented NVS may retain historical plaintext legacy credentials until a full partition/flash erase.
|
||||||
|
|
||||||
|
### 7. Phase 8A regression
|
||||||
|
|
||||||
|
With the maximum supported mix of USB CDC, WebSocket, and SSH serial clients active, repeat user list/show and several UART0 mutations. Confirm password prompts remain physical-UART-only, no user operation acquires a broker client or writer lease, existing Phase 8A network authentication and revocation behavior remains functional, and serial/broker counters show no unexplained loss. Record `memory`, `web counters`, and `ssh counters` before and after the run.
|
||||||
|
|
||||||
|
## Phase 8B role-aware HTTPS and SSH authentication
|
||||||
|
|
||||||
|
Complete the Phase 8A bootstrap first and retain two disposable accounts, one `user` and one `admin`. Phase 8B gives both roles the existing serial/status interface; the administrative SSH shell is not expected until Phase 8C.
|
||||||
|
|
||||||
|
### 1. HTTPS passwords and fail-closed behavior
|
||||||
|
|
||||||
|
For both roles, authenticate to `/`, `/api/status`, and the browser terminal with the account password. Confirm the full 16-character username and a 64-character password work, while absent, malformed, oversized, wrong-user, and wrong-password Basic headers fail without exposing which component was wrong. After bootstrap, confirm the value from `web credentials show` no longer authenticates unless it independently equals a current user password.
|
||||||
|
|
||||||
|
On a disposable malformed-database image, confirm HTTPS returns authentication-service unavailable and never falls back to the legacy credential. Recover through physical UART0 only. Verify `web status` reports user-database authentication and active WebSocket sessions show account, user role, and password method without secrets.
|
||||||
|
|
||||||
|
### 2. SSH password and public-key login
|
||||||
|
|
||||||
|
For both `user` and `admin`, verify password SSH login reaches the same broker-backed serial stream as before. Confirm `ssh sessions` shows the account, user role, password method, and writer/observer role. An administrator must not receive UART0 commands yet.
|
||||||
|
|
||||||
|
Import one Ed25519 key and one ECDSA P-256 key through `user key add`, then verify each matching private key authenticates without a password and `ssh sessions` reports `public-key`. Confirm an unregistered key, wrong username, unsupported RSA key, certificate key, and three failed completed attempts are rejected. Normal client probe-then-sign behavior must consume one completed attempt, not two; unsigned probes alone must never create an authenticated session or broker client.
|
||||||
|
|
||||||
|
### 3. WebSocket ticket binding
|
||||||
|
|
||||||
|
Authenticate separately as two users and request tickets. Confirm each ticket is accepted exactly once, expires after 30 seconds, and cannot be reused or altered. Change one account after ticket issuance but before WebSocket connection; its ticket must fail closed without creating a broker client, while the other account's ticket still works. Repeat with delete followed by recreation of the same username and confirm the old ticket remains invalid.
|
||||||
|
|
||||||
|
### 4. Targeted session revocation
|
||||||
|
|
||||||
|
Connect simultaneous WebSocket and SSH sessions for two different users and place one affected session in writer state. One mutation at a time, exercise password change, role change, SSH-key add/delete/clear, and account deletion. Required results:
|
||||||
|
|
||||||
|
1. Outstanding tickets and active sessions for the changed username are revoked promptly and any writer lease is released.
|
||||||
|
2. The stale session cannot inject additional serial bytes or reacquire writer ownership.
|
||||||
|
3. The unrelated user's WebSocket/SSH sessions remain connected and retain their expected broker roles.
|
||||||
|
4. New authentication succeeds only with the updated password/key/role state.
|
||||||
|
5. Deleting and recreating the same username does not revive old tickets or sessions.
|
||||||
|
|
||||||
|
Run `web status`, `ssh sessions`, `web counters`, `ssh counters`, and `broker clients` around each mutation. Also rotate `web credentials rotate --force` after administrator bootstrap and confirm it changes only recovery material: role-based HTTPS/SSH sessions remain connected and user passwords are unchanged. `web reset --force` restarts HTTPS because the TLS identity changes, but must not revoke unrelated SSH sessions.
|
||||||
|
|
||||||
|
### 5. Concurrency regression
|
||||||
|
|
||||||
|
With USB CDC, two role-based network users, one WebSocket terminal, one SSH terminal, and UART1 traffic active, alternate writer ownership and mutate one account. Confirm binary transparency, observer isolation, bounded authentication/handshake behavior, UART0 responsiveness, and no unexpected disconnect of the unaffected user. Record memory, broker, web, SSH, and serial counters before and after. Repeat after reboot to verify passwords, roles, keys, and authentication methods persist.
|
||||||
Reference in New Issue
Block a user