Skip to content

row 74 F25: a lane base URL's userinfo is stripped, never dialled, sent or printed, as 1.5.5 did - #876

Merged
MattJackson merged 1 commit into
predevfrom
lane-row74-userinfo
Oct 15, 2026
Merged

MattJackson merged 1 commit into
predevfrom
lane-row74-userinfo

Conversation

@MattJackson

Copy link
Copy Markdown
Collaborator

What

A provider (lane) base_url written as https://user:pass@host[:port]/... is ACCEPTED and its userinfo is STRIPPED where the base URL enters the served flow, so the host dialled, the certificate name, the Host/:authority on the wire and any signed host are the stripped host[:port]. The userinfo never reaches a connection, a log line, an error/fault message, or the lane tables /stats reads.

Why

1.5.5 did exactly this: v1.5.5 crates/busbar/src/proxy/egress.rs:18 (host_from_base), test crates/busbar/src/proxy/tests/auth_style_tests.rs:70. 1.6.0 refused it (the connector's carries_userinfo, split_url) with no spec line signing the change (ARCHITECT ruling, F25 row 74).

Flow points fixed

  • busbar-kernel-egress trust/net.rs: new strip_userinfo (the narrowly-named entry; split_url is unchanged, so connector / a2a / oauth2 dial targets keep refusing userinfo); redact_userinfo made public.
  • busbar-kernel appbuild.rs: the lane carrier's base_url is stripped. That covers the in-process lane row, egress targets, signed host, health probe, the neutral lane tables, and the boot model ... via (...) line.
  • busbar root/door_steps.rs provider_routes: the door member route's base_url is stripped. That covers the sealed anchors/reach, the auth binding origin, the URL the auth plugin signs, and the connector dial.
  • busbar-kernel config/sections.rs destinations(): the provider metadata carve-out now keys on the stripped base. Before, split_url read the userinfo spelling as no host and the carve-out vanished.
  • busbar-kernel config_validate: the scheme, plaintext, metadata, base+path and base+path_base refusals repeat the base redacted (message literals unchanged).
  • busbar-kernel plane_host/egress.rs open_http: the fault's target url is the redacted copy. open_http keeps refusing userinfo: it is reached by a2a and FFI planes, not by the provider lane flow.

REDs

  • busbar-llm engine/tests/health_tests.rs a_userinfo_base_url_boots_and_its_lane_dials_the_stripped_host: real boot plus a real probe dial to a loopback far end. It checks Host is the stripped authority, no auth field carries the planted spelling or a Basic built from it, and the lane row, signed host and neutral lane view hold the stripped base.
  • busbar root/tests/door_steps.rs a_provider_base_url_with_userinfo_is_reached_at_its_stripped_authority.
  • busbar-kernel config_validate/tests/tests.rs a_base_url_userinfo_is_accepted_and_no_validation_error_repeats_it: the userinfo base validates, and a planted scan over every base_url refusal finds no svcuser/hunter2.
  • busbar-kernel plane_host/egress_tests.rs a_guard_refusal_surfaces_class_refused_with_the_guards_own_reason: planted scan of the fault cause and target.
  • busbar-kernel-egress trust/tests/net_tests.rs a_base_url_userinfo_is_stripped_to_the_host_it_names.

…nt or printed, as 1.5.5 did

1.5.5 accepted `user:pass@` in a provider base_url and dialled, sent and signed the host after it
(v1.5.5 crates/busbar/src/proxy/egress.rs:18 host_from_base; its test
crates/busbar/src/proxy/tests/auth_style_tests.rs:70). No spec line signs the refusal 1.6.0 grew,
so the 1.5.5 rule is restored where the base URL enters the served flow, and every other dial
target keeps its refusal (split_url, the connector's carries_userinfo, a2a, oauth2 unchanged).

- busbar-kernel-egress net: strip_userinfo, the narrowly-named entry (authority ends at / ? # \,
  userinfo is everything before its last @); redact_userinfo made public for the messages below.
- busbar-kernel appbuild: the lane carrier's base_url is stripped, so the plane's lane row, its
  egress targets, its signed host, its health probe, the neutral lane tables (/stats readers) and
  the boot "model ... via" line read host[:port] only.
- busbar root door_steps provider_routes: the provider route's base_url is stripped, so the
  member route, its sealed anchors/reach, its auth binding origin, the auth plugin's signed URL
  and the connector dial never carry userinfo (the connector refused it before).
- busbar-kernel config sections destinations(): the provider carve-out keys on the stripped base
  (split_url read the userinfo spelling as no host, so the carve-out silently vanished).
- busbar-kernel config_validate: the scheme, plaintext, metadata, base+path and base+path_base
  refusals repeat the base URL redacted (the message literals are unchanged).
- busbar-kernel plane_host open_http: the fault's target url is the redacted copy.

REDs: a userinfo base boots and its lane's probe dials the loopback far end at the stripped
authority (busbar-llm health_tests); provider_routes strips it (root door_steps tests); a planted
scan over every base_url validation refusal and over the egress fault finds neither half of
`svcuser:hunter2-P4ss`; strip_userinfo's unit cases (kernel-egress net_tests).
@MattJackson

Copy link
Copy Markdown
Collaborator Author

FYI (queue rule 20): $ draft #870 also edits crates/busbar-kernel/src/config_validate/{mod.rs:1553 rate-refusal message, tests/tests.rs:4178-4216 rate test}; hunks are disjoint from yours and merge clean.

MattJackson added a commit that referenced this pull request Oct 15, 2026
…eld; clippy; the six Law 0 cells the merge grew; config-schema snapshot

- busbar-core-connector dialled.rs (#837 over #893's Piece): the datagram leg's body piece states
  `fault: None` and `declared_len: None` (E0063).
- busbar-kernel appbuild: build_app_from_config takes the root's rules as an eighth input (#1001);
  allowed too_many_arguments with that reason. plugin-loader secret_disk_tests: let-else for the
  refused declare (clippy err_expect).
- Law 0 growth over the merge-base (gates log of 3598829 and the group measures):
  kernel x plane: the failover predicate's docs and test say verdict, not decision (#890);
  kernel x instance:secret: the two new SecretRef literals key on SECRET_MODULE_ENV (#863/#864);
  kernel x auth: the resolved provider's and the token endpoint's docs name the client-credentials
  style without spelling the module (#957, #876);
  connector x transport: spawn_env's doc says program members (#865);
  contract x plane: section.rs's trust_from doc names a plane's push trust (#1001);
  busbar x vendor: the health-probe cell's catalog entry is testing/root-fixtures data (#1039);
  busbar x instance:secret: the pinned-cells selftest builds its fixture citing the pinned file
  rather than re-keying it (#1006).
- config-schema: the RAW carrier records each section as the map's value type; the snapshot gains
  DeployCfg.agent_push (serde_yaml::Value, #1001), ProviderLaneCaps (its Deserialize, round 2) and
  the `type ProviderTable` alias (#957).
- qa/scripts-allowlist.toml: the three twilio conformance legs (#998), oracle-driver like their
  siblings.
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).
@MattJackson
MattJackson merged commit ff4196b into predev Oct 15, 2026
1 check was pending
@MattJackson
MattJackson deleted the lane-row74-userinfo branch October 15, 2026 13:54
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