Repository navigation
row 159: a settings-derived need target drops its userinfo; the webhook sink sends it as Basic, as 1.5.5 did (audit export-webhook #1, HIGH) - #842
Merged
Conversation
…nector drops it, and still refuses any other target carrying one Audit export-webhook #1 (HIGH), ARCHITECT ruling (a), (b), (d). A need's target read from the plugin's own settings through target_from (settings.<key>[...], no member path) is declared without its userinfo: the authority's text through its last '@' is left out, and the text left out is never recorded, judged, logged or put in an error. Every other target carrying a userinfo (no target_from, a member path, a path outside its settings), and a settings-derived one whose userinfo this reading cannot clear, is refused as before. The rule names no scheme; nothing in the contract changes. REDs (crates/busbar-core-connector/src/tests/connector_tests.rs): - a_settings_derived_target_is_declared_without_its_userinfo: URL, user:pass@host:port and user@host:port forms declare, pin to the cleared target and open there; a log capture (busbar_contract::testkit::WarnCapture at DEBUG), the kept records and every error text are scanned for the user and the password. - a_target_not_from_its_own_settings_carrying_a_userinfo_is_still_refused: replaces a_declared_target_carrying_a_userinfo_is_refused, whose settings.url arm the ruling reverses. tracing joins the connector's dev-dependencies to install the capture.
…bhook#19): a userinfo in the webhook URL is sent as authorization: Basic, as 1.5.5's reqwest 0.12 sent it Audit export-webhook #1 (HIGH), ARCHITECT ruling (c). The pin moves from 46cd95ba78f6 to the plugin PR's head, which also carries the plugin's dev commits since 46cd95ba78f6 (the door states ready; refusals in 1.5.5's words; drops warned). Re-point to the plugin's merged commit before this lands if that PR squashes.
…nce (law0 busbar-core-connector x export 4 -> 1) Three comments cited the finding by the export instance's name, three instance-vocabulary hits in a neutral crate (kind-isolation:law0 / law0-base). They now cite the ruling without naming it; no code moves and no ceiling is touched.
…ar-export-webhook pin b5240b33d1da. BUSBAR-7071/7072 are actionable and warned on every dropped line, as 1.5.5 warned them (the sink's declares since 98d4432d84, which the old pin 46cd95ba78 predated)
This was referenced Oct 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Audit pinned export-webhook finding #1 (HIGH), under the ARCHITECT ruling and its conditions (a) to (d).
Why. THE DESIGN §2, "A port keeps 1.5.5's surface ... wire bytes ... the default is 1.5.5's behaviour."
https://user:pass@host/pathwas sent withAuthorization: Basic. reqwest 0.12'sRequestBuilder::new(extract_authority) moved the userinfo intobasic_auth.settings.url. The connector refuses any need target that carries a userinfo, so the sink is disabled (BUSBAR-7070) and delivers nothing.What.
Connector (
crates/busbar-core-connector/src/lib.rs,declare).target_from(settings.<key>[...], not a member path) is declared without its userinfo. The authority's text through its last@is left out.target_from, a member path, or a path outside the plugin's settings. A settings-derived target whose userinfo this reading cannot clear is also refused.busbar-contractchanges.Sink (c). export-webhook: a userinfo in the URL is sent as authorization: Basic, as 1.5.5 sent it (audit export-webhook #1, HIGH) busbar-export-webhook#19 (export-webhook: a userinfo in the URL is sent as authorization: Basic, as 1.5.5 sent it (audit export-webhook #1, HIGH) busbar-export-webhook#19, head
b5240b33d1da15007fac3f74a1ead87f06289fe4) buildsauthorization: Basicfrom its ownsettings.urlthe way reqwest 0.12 did:user:passjoin, with a user alone sent asuser:,content-type, then the configured header. One also namedAuthorizationis sent too, right after the Basic field, asHeaderMap::appendheld both in 1.5.5.The parity tests are in that PR.
Pin.
busbar-export-webhookandbusbar-export-webhook-pluginmove from46cd95ba78f6tob5240b33d1da(Cargo.tomlrev, Cargo.lock sources). That head also carries the plugin's dev commits since46cd95ba78f6: the door statesready, refusals are said in 1.5.5's words, and dropped deliveries are warned. If the plugin PR squashes, re-point this pin to the plugin's merged commit before this lands.REDs (
crates/busbar-core-connector/src/tests/connector_tests.rs).a_settings_derived_target_is_declared_without_its_userinfocovers thehttp://user:pass@host:port/path,user:pass@host:portanduser@host:portforms.busbar_contract::testkit::WarnCaptureat DEBUG). The kept records (the pinned target and the declared spec) and every error text from a refused settings-derived target (a metadata host) and its open are scanned for the user and the password.a_target_not_from_its_own_settings_carrying_a_userinfo_is_still_refusedchecks that a userinfo target undertarget_from"",settings.*.url,request.url,settings.andsettings..urlis refused, with the refusal kept and nothing opening on it. A backslash-spelled settings-derived target is also refused.a_declared_target_carrying_a_userinfo_is_refused, whosesettings.urlarm the ruling reverses.tracingjoins the connector's[dev-dependencies], only to install the capture. Cargo.lock gains one line for it.Collision check. The open connector PRs #804, #805 and #800 move the proxy env reading and do not touch
declareorcarries_userinfo. #837, #834, #827, #825, #819, #807, #778 and #561 touch other hunks oflib.rs. This change is two small helpers next tocarries_userinfoplus three lines indeclare.