diff --git a/PHASE5_RUNBOOK.md b/PHASE5_RUNBOOK.md index f61cc51..ede6b07 100644 --- a/PHASE5_RUNBOOK.md +++ b/PHASE5_RUNBOOK.md @@ -4,6 +4,15 @@ This runbook starts a minimal `k_server` + `k_proxy` prototype for session reuse Last updated: 2026-04-25 +Related browser demo: + +- `k_client_portal.py` can now be used in `k_client` at `http://127.0.0.1:8766` to show: + - registration + - login with card approval/denial + - protected `k_server` counter access + - logout + - explicit "k_server was not called" behavior when login is denied + ## What This Prototype Covers - `k_proxy` creates short-lived sessions. diff --git a/Setup.md b/Setup.md index c0b39a8..b3f79f3 100644 --- a/Setup.md +++ b/Setup.md @@ -359,6 +359,17 @@ Session note (2026-04-25, browser target moved to k_proxy): - browser traffic is now intended to go straight to `k_proxy` - the `k_client` portal remains only as a temporary bridge/compatibility layer +Session note (2026-04-25, k_client browser flow page): +- `k_client_portal.py` now also serves a local browser demo page again on `http://127.0.0.1:8766` inside `k_client`. +- The page is useful as an operator/demo surface: + - register user + - login with card approval or denial in `k_proxy` + - call the protected `k_server` counter + - logout +- It also makes the negative path explicit: + - if login is denied on the card, the page reports that `k_server` was not called +- Primary browser-facing app logic still lives on `k_proxy`, but the `k_client` page is now a concrete demo/control surface rather than just a redirect. + Session note (2026-04-25, provisional enrollment hardening): - The enrollment contract in `k_proxy` is now explicit but provisional. - Current prototype enrollment rules: diff --git a/Workplan.md b/Workplan.md index eb7ea69..6dd0fc7 100644 --- a/Workplan.md +++ b/Workplan.md @@ -319,7 +319,7 @@ Status (2026-04-25): - Added first `k_client` implementation at `/home/user/chromecard/k_client_portal.py`. - Current prototype flow: - browser now targets `k_proxy` directly over `https://127.0.0.1:9771` - - `k_client_portal.py` remains only as a temporary bridge page + - `k_client_portal.py` also serves a local browser flow page on `http://127.0.0.1:8766` - `k_proxy` continues to authenticate with the card and forward to `k_server` - Verified end-to-end through the portal: - enroll `alice` @@ -335,7 +335,7 @@ Status (2026-04-25): - direct browser target is on `k_proxy` - login/resource flow is integrated on the direct proxy path - enrollment now has a real client->proxy path - - the `k_client` bridge remains only for transition/compatibility + - the `k_client` page is now a usable demo/operator surface in addition to the direct proxy path - final enrollment semantics are still provisional Status (2026-04-25, enrollment hardening): diff --git a/k_client_portal.py b/k_client_portal.py index 1622eaa..df8cbee 100644 --- a/k_client_portal.py +++ b/k_client_portal.py @@ -27,7 +27,7 @@ HTML = """ - ChromeCard Client Bridge + ChromeCard Client Flow
-
-

ChromeCard Client Bridge

+
+

ChromeCard Client Flow

- Browser traffic should now target `k_proxy` directly at `https://127.0.0.1:9771/`. - This local service remains only as a temporary bridge and compatibility shim. + This page runs in `k_client` and drives the real split-VM flow: + register a user, ask the card in `k_proxy` for approval, and then call + the protected counter on `k_server` only if auth succeeds.

- -

     
+ +
+
+
+
+ Browser: k_client + Card: k_proxy + Resource: k_server +
+ + + +
+ + + + + + +
+ +
+ Registration: press yes on the card to enroll. + Login: press yes to allow the identity check, or + no to deny it. If login is denied, this page will + show that `k_server` was not called. +
+ +
+
+
1
+
+ Register user
+ Creates or refreshes the enrolled identity in `k_proxy`. +
+
+
+
2
+
+ Authenticate with the card
+ `k_proxy` asks the card for approval. Press `yes` to continue or `no` to reject. +
+
+
+
3
+
+ Call `k_server`
+ The protected counter is only reached when login created a valid session. +
+
+
+
+ +
+
+

Client State

+
Enrolled user: unknown
+
Session: unknown
+
Expires: unknown
+
+
+

Flow Result

+
No flow run yet.
+
+
+
+ +
+

Event Log

+

+      
+