Skip to content

build(deps): refresh the lockfile and move the Bugzilla client to reqwest 0.13 - #64

Merged
plusky merged 2 commits into
plusky:mainfrom
mimi1vx:small_update
Aug 7, 2026
Merged

build(deps): refresh the lockfile and move the Bugzilla client to reqwest 0.13#64
plusky merged 2 commits into
plusky:mainfrom
mimi1vx:small_update

Conversation

@mimi1vx

@mimi1vx mimi1vx commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Two self-contained commits, reviewed and verified independently (each
builds/tests/lints clean on its own):

  1. build(deps): refresh the lockfile to latest compatible versions
    a plain cargo update (19 semver-compatible packages), with the
    rmcp 3.1.0 -> 3.1.1 bump reviewed against its actual source
    (ListToolsResult's field set, StreamableHttpServerConfig's
    field table, and the _meta-presence routing trap are all
    unchanged) and the packaged man page / completions regenerated
    (byte-identical). matchit and reqwest are correctly held back
    behind their semver-major boundaries.
  2. build(core): move the Bugzilla client to reqwest 0.13 — adds the
    now-opt-in query feature (required by the ?api_key= auth path),
    renames rustls-tls to rustls (adopting reqwest 0.13's new
    default: aws-lc-rs crypto provider + OS trust store via
    rustls-platform-verifier, instead of ring + bundled
    webpki-roots), and adds system-proxy so HTTPS_PROXY /
    HTTP_PROXY / NO_PROXY stay honored. This also collapses the
    pre-existing reqwest 0.12/0.13 duplicate-version pair in the
    lockfile down to one.

DESIGN.md invariants touched

  • I12 (API key never appears in logs/errors/results): unaffected.
    Error::without_url() is unchanged in 0.13; the existing
    api_key_absent_from_transport_error_i12 test already drives the
    query-based auth path (BugzillaClient::new(.., false, ..)), so
    no new test was needed.
  • Not an enumerated guard invariant, but operator-visible: the TLS
    trust anchor moves from bundled Mozilla webpki-roots to the OS
    trust store, and the crypto provider moves from ring to
    aws-lc-rs. Recorded in bugwarden-core/src/lib.rs and a new
    DESIGN.md paragraph. Deliberate and, for a Bugzilla instance behind
    a corporate/internal CA, an improvement — but it is a real behavior
    change from the previous release, not a transparent dependency bump.

Verification (both commits, independently)

  • cargo fmt --check
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo clippy -p bugwarden --features gen --all-targets -- -D warnings
  • cargo test --workspace --all-targets --locked (all green, 357
    tests; guard/attachment/user_agent wiremock suites specifically
    checked)
  • cargo deny check / cargo audit (clean; no new duplicate-version
    warnings beyond what already existed; aws-lc-sys's license was
    already allowed via the pre-existing reqwest 0.13 dev/test
    dependency, so no deny.toml change is needed)
  • cargo build --release --locked -p bugwarden on
    aarch64-apple-darwin

Not verified locally

  • cargo +1.88 build --workspace --locked (mirrors rust-msrv): no
    1.88 toolchain available on the machine this was built on; deferred
    to CI.
  • The x86_64-unknown-linux-gnu release leg: no Linux toolchain
    available locally. CI's ubuntu-latest rust job already compiles
    this same dependency graph (including aws-lc-sys) on every push,
    so this is validated by CI on this PR before merge.

mimi1vx added 2 commits August 7, 2026 15:24
A plain `cargo update` (not `--workspace`) moves 19 packages, all
semver-compatible, with no manifest edit required. `matchit` and
`reqwest` stay held back behind a semver-major boundary -- axum pins
`matchit = "=0.8.4"` exactly, and the reqwest 0.13 move is a separate,
behavior-changing PR per AGENTS.md's one-logical-change rule.

Two of the moves are not boring enough to wave through:

- `darling` 0.23 -> 0.24 now requires exactly rustc 1.88.0, the
  workspace's declared MSRV. There is zero headroom left: the next
  darling MSRV bump, however it arrives, breaks the rust-msrv job.
  Recorded here rather than silently absorbed, since it changes what
  "at MSRV" means for this workspace's proc-macro host compiler.
- `rmcp`/`rmcp-macros` 3.1.0 -> 3.1.1 touch tool-handler context and
  list_tools cache hints, both areas the rmcp usage notes reason about
  explicitly. Reviewed against the 3.1.1 source in the local registry:
  `ListToolsResult`'s field set (result_type, meta, next_cursor,
  ttl_ms, cache_scope, tools) is unchanged, so the hand-written struct
  literal in list_tools stays exhaustive and correct; every
  StreamableHttpServerConfig field is still the ten already tabulated;
  and message_has_per_request_protocol_version /
  skips_the_handshake still route on mere presence of the `_meta`
  key, not on which revision it names. The three stale rmcp-3.1.0
  citations in the usage notes are updated to 3.1.1 accordingly.

clap/clap_complete/clap_mangen also move, which feeds the committed man
page and shell completions that rust-assets-drift gates on CI.
Regenerated them with bugwarden-gen and the tree came back
byte-identical, as expected -- this CLI hand-writes its own synopsis and
uses none of the clap_mangen 0.3.1/0.3.2 synopsis changes.

Verified: cargo fmt --check, cargo clippy --workspace --all-targets and
cargo clippy -p bugwarden --features gen --all-targets (both -D
warnings), cargo test --workspace --all-targets --locked (all green,
including the guard/list_tools/handshake/http-transport suites called
out for extra scrutiny), cargo deny check and cargo audit (both clean,
with the same five pre-existing duplicate-version warnings as before
the update and no new ones).
The shipped binary linked reqwest 0.12 exclusively; 0.13 was already in
the graph through rmcp's dev-facing `reqwest` feature and this
workspace's own test dependencies. That duplication cost only
test-build time, but it meant the test process linked both rustls
crypto providers at once (ring via 0.12, aws-lc-rs via 0.13) -- the
classic rustls 0.23 "no process-level CryptoProvider" ambiguity,
sitting there waiting to be tripped by an unrelated change.

Three of reqwest 0.13's breaking changes land directly on
bugwarden-core/src/client.rs:

- `query` is now opt-in. `apply_auth`'s `?api_key=` mode and
  quicksearch_syntax_html both call `.query(...)` -- without the
  feature this is a compile error on the API-key path, so it has to be
  added, not routed around.
- `rustls-tls` is renamed `rustls`, and the new feature pulls
  rustls-platform-verifier: trust anchors move from the bundled Mozilla
  webpki-roots set to the OS trust store, and the default crypto
  provider becomes aws-lc-rs instead of ring. For a Bugzilla instance
  behind a corporate or internal CA this is usually the better default,
  but it is operator-visible, so it is recorded in both the module doc
  comment and a new DESIGN.md paragraph rather than absorbed silently
  as a feature rename.
- `system-proxy` becomes a feature. bugwarden-core already builds with
  `default-features = false`, and 0.12 honored `HTTPS_PROXY` /
  `HTTP_PROXY` / `NO_PROXY` unconditionally; migrating without adding
  this feature would silently stop honoring them in exactly the
  proxied corporate networks this server targets. Added alongside
  `query`, `json` and `rustls`.

`Error::without_url()` is unchanged, so I12's sanitization holds as
written; the existing `api_key_absent_from_transport_error_i12` test
already drives the query-path key (BugzillaClient::new(.., false, ..)
selects query auth), so no new test was needed to cover it. The
`Client::builder().timeout().user_agent().build()` call site in
client.rs needed no changes -- the 0.13 builder renames are
soft-deprecated, not breaking.

bugwarden's own dev-dependency on reqwest 0.13 (used directly by
http_transport_wiremock.rs for its bare-metal HTTP assertions) stays:
its feature set (`rustls` only) is a strict subset of
bugwarden-core's, so it does not reintroduce a second lockfile entry --
`cargo tree -p bugwarden -e normal` and the lockfile itself now show
exactly one `reqwest` version, down from the pre-existing 0.12/0.13
pair.

Verified: cargo fmt --check, both clippy invocations, cargo test
--workspace --all-targets --locked (all green, guard_wiremock's I12
tests and user_agent_wiremock included), cargo deny check and cargo
audit (both clean; aws-lc-sys's license set needed no new deny.toml
entry because it was already reachable through the pre-existing
reqwest 0.13 dev/test dependency), and `cargo build --release --locked
-p bugwarden` on aarch64-apple-darwin. The x86_64-unknown-linux-gnu
release leg was not built locally (no Linux toolchain on this
machine); CI's ubuntu-latest `rust` job already compiles this same
graph, including aws-lc-sys, on every push, so that leg is validated
before merge but was not separately reproduced here.
@plusky
plusky merged commit 354d1f9 into plusky:main Aug 7, 2026
11 checks passed
@mimi1vx
mimi1vx deleted the small_update branch August 7, 2026 13:48
plusky pushed a commit that referenced this pull request Aug 7, 2026
PR #64 moved bugwarden-core to reqwest 0.13, switching Bugzilla's
certificate validation from bundled webpki-roots to the OS trust store
via rustls-platform-verifier. DESIGN.md documented the upside only; an
operator building a scratch/distroless image got a TLS handshake error
with nothing pointing at the missing CA bundle, and the C-toolchain
build requirement and proxy behavior were undocumented for README
readers.

Extend the DESIGN.md TLS paragraph with the failure mode, the
operator's fix (install ca-certificates or mount the host bundle), and
the bundled-roots alternative considered and rejected. Add a README
'TLS trust anchors and proxies' subsection under Installation with the
same facts in current-state framing plus a copy-pasteable Containerfile
snippet, and note the aws-lc-sys C-toolchain requirement in the
From-source section.

Closes #65.
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.

2 participants