Skip to content

row 74 F25: the door path's userinfo Basic is a root-held auth credential; the kernel holds only the binding - #936

Draft
MattJackson wants to merge 1 commit into
lane-row74-userinfo-door-audfrom
lane-row74-userinfo-root-basic
Draft

MattJackson wants to merge 1 commit into
lane-row74-userinfo-door-audfrom
lane-row74-userinfo-root-basic

Conversation

@MattJackson

Copy link
Copy Markdown
Collaborator

Stacked on #922, which is stacked on #913 and #876. This is a DRAFT per queue rule 19 until its bases land.

Why

ARCHITECT ruling (docs/design/BUSBAR-1.6.0.md l.650-660, 828-834, 872-873): "the kernel never sees the key". #913 had the kernel build, hold and send the Authorization: Basic derived from URL userinfo. On the door path, that now moves to the composition root as a credential of the auth kind.

What

  • root::userinfo::UserinfoBasic: a root-owned Basic credential, read at configuration time from a provider base_url, token_url or a service account's token_uri. It decodes the userinfo the way reqwest 0.12.28 did (request.rs:169-182, extract_authority :581-605, util.rs:4-25).
  • Door member requests: member_routes wraps the member's auth binding (lead_with). Each answer gets the Basic value first unless it already names authorization, which is reqwest's replace_headers condition (util.rs:50-77).
    • The kernel's MemberRoute and far_end now carry only the binding handle. MemberRoute.userinfo and the far_end Basic logic are removed.
  • Token POST: the root's connection table puts the Basic value first; the endpoint is stripped before any auth plugin sees its settings.
    • 1.5.5 sources: v1.5.5 egress_auth/oauth_client_credentials.rs:119-126 and jwt_bearer.rs:175-181. The assertion's aud stays the raw token_uri.
  • TRANSITIONAL, legacy lane plane only: each item below is kept and marked TRANSITIONAL: deleted with the legacy lane plane (row 155 C); inside busbar-llm the marker reads deleted with busbar-llm (row 155 C).
    • kernel UrlUserinfo and its send hook;
    • LaneInput.url_userinfo and LaneInput.token_userinfo;
    • bind_presenting;
    • AuthAxis::serving_presenting;
    • the in-process lane's inserts.

REDs

  • crates/busbar/src/root/tests/userinfo.rs:
    • the root reads userinfo exactly as reqwest did;
    • a binding is led by the Basic value unless it names authorization, both answered on the spot and when submitted;
    • a token POST head is led the same way.
  • crates/busbar/src/root/tests/door_steps.rs, a_members_base_url_userinfo_reaches_its_attempts_only_through_its_binding: a door member whose base URL contains userinfo has the stripped base on its route. The Basic value reaches it only through the binding, first for the api-key style and displaced for bearer.
  • Unchanged and still asserting the wire: the door-path OAuth and jwt tests (stripped dial, Basic-led token POST, raw aud) and the legacy lane's tests.

…of the auth kind; the kernel holds only the binding

ARCHITECT ruling on #913 (BUSBAR-1.6.0.md l.650-660, 828-834, 872-873: the kernel never sees the
key): the composition root reads a provider URL's or token endpoint's `user:pass@` at
configuration time into a root-owned basic credential (root::userinfo::UserinfoBasic, read as
reqwest 0.12.28's extract_authority read it, request.rs:169-182 / :581-605, util.rs:4-25) and
presents it through the auth kind's outbound call:
- member_routes wraps the member's binding (lead_with): every answer is led by
  `authorization: Basic` unless it names `authorization` (reqwest's replace_headers, util.rs:50-77);
  the kernel's MemberRoute and far_end carry only the binding's handle (MemberRoute.userinfo and the
  far_end lead are removed);
- a minting plugin's token POST is led by it from the root's own connection table, the endpoint
  stripped before any plugin settings (v1.5.5 egress_auth/oauth_client_credentials.rs:119-126,
  jwt_bearer.rs:175-181); the assertion's aud stays the raw token_uri.

The kernel UrlUserinfo, its send hook, LaneInput.url_userinfo/token_userinfo, bind_presenting,
AuthAxis::serving_presenting and the in-process lane's inserts stay for the legacy lane plane only,
each marked TRANSITIONAL (deleted with it, row 155 C).

REDs: the root reads userinfo as reqwest did; a binding is led by the Basic value unless it names
authorization, on the spot and when submitted; a token POST head likewise; a door member whose base
URL spells userinfo has the stripped base on its route and the Basic only through its binding
(api-key style: first; bearer: displaced). The door-path oauth/jwt wire tests (stripped dial, Basic-led
token POST, raw aud) and the legacy lane's tests are unchanged.
MattJackson added a commit that referenced this pull request Oct 15, 2026
…onns wrapper follow the merged shapes

From the full logs of 2382599:
- root door_steps PresentingConns: bind_auth/auth_of take and hand on the registration `member`
  (the connector's per-member binding, DeclaredConns; E0050/E0061 x2 each).
- root tests: the datagram cell's Got states fault/declared_len/end (#893 over #837); the two
  upgrade-row builds take the settings alone (HostWire build, #932 over #997); the two userinfo
  cells hand provider_routes a ResolvedProvider (#957 over #876/#936).
- tests/plane_blackbox.rs: the step's (key, text) pairs are a type (clippy type_complexity).
- config-schema snapshot: `type WakeTicket` is now an alias of ConnWake (#1018), recorded.
- Law 0: busbar x instance:export 25 -> 24 (measure); kernel x plane: a test doc names a plane's
  own webhooks section, not the llm plane's (1050 measured against w2's 1049).

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant