Files
freemkv-keysources/docs/online-agent-cache.md
T
Matthew Jackson 599422ef22 release: 1.7.0
CI/lint hardening since v1.6.14: clippy on stable with the MSRV single-sourced
from Cargo.toml, cargo-deny dependency-audit gate with first-party git sources
allowed (#15), and audience-based comment-guard (#17). No library code changes.
2026-09-02 12:27:48 -07:00

1.9 KiB

src/online.rs — OnlineSource::agent caching

Why cache at all

query used to build a FRESH ureq::Agent every call, and an FMTS disc makes two calls per rip (get_unit_keys + get_fmts_indexes), so it paid two TLS handshakes to the same host for no reason — an agent owns the connection pool, and a discarded agent discards the pooled, already negotiated TLS connection with it.

Security invariant

The agent is reused ONLY when the freshly resolved + guarded address SET is identical to the one the cached agent is pinned to. Every query still re-resolves and re-runs the SSRF guard — that is the whole anti-rebinding defence and is deliberately not cached; what is reused is the connection, and only to addresses just re-validated this call.

Why the cache key is a sorted, deduped SET, not an ordered sequence

to_socket_addrs hands back whatever order the resolver felt like, and a round-robin keyserver reorders its A/AAAA records on essentially every lookup — an ordered == therefore missed the cache every single time against exactly the deployment that most needs it, silently degrading to the per-query TLS handshake this field exists to avoid.

Set equality is also the honest predicate: the security property being asserted is "these are the same validated addresses", which says nothing about their order. The agent itself stays pinned to the order it was BUILT with; that is safe because an equal set means every address it holds was re-resolved and re-guarded this call.

a_reordered_but_identical_address_set_reuses_the_agent

Catches the mutation that drops the sort/dedup from agent_for's key (the reversed order would then build a second agent) and, via the second half of the test, the mutation that "fixes" order-sensitivity by comparing only lengths or the first element — which would wrongly reuse an agent pinned to a DIFFERENT address.