Add a `NonEmpty<T>` collection guaranteeing at least one element. The
first element (head) is stored inline, so a single-element `NonEmpty`
performs no heap allocation, and `first()` is infallible while `len()`
returns a `NonZeroUsize`, and callers never branch on an "is it empty?"
case.
Rename prebuilt binary assets to friendly os-arch names (e.g.
ironrdp-agent-<version>-linux-x64.tar.gz), dropping the Rust target
triple from the filename, and make the triple authoritative by passing
--target to cargo so a runner/target mismatch fails loudly instead of
silently mislabeling an asset.
Move the detailed download/verify instructions out of the READMEs and
into the GitHub Release body, generated by the workflow so they can
never drift from the actual assets. The block is injected idempotently
between sentinel markers, so re-running the workflow (the recovery path
for a failed matrix leg) replaces it in place rather than appending. The
READMEs are demoted to short evergreen pointers to the Releases page.
Extract the duplicated native-dependency install steps (Linux ALSA
headers, Windows NASM) into a shared .github/actions/install-build-deps
composite action reused by ci.yml and release-binaries.yml.
Corrects Network Auto-Detect framing and routing to match MS-RDPBCGR by
moving it off the I/O channel slow-path Share Data PDUs and onto the MCS
message channel with the required Basic Security Header
(SEC_AUTODETECT_REQ / SEC_AUTODETECT_RSP). This aligns IronRDP with
mstsc/xfreerdp behavior and enables both connect-time and continuous
auto-detection to actually function.
Removes the last ironrdp-connector coupling from ironrdp-session by
turning Deactivate-All handling into a bare signal and shifting ownership
of the Deactivation-Reactivation activation sequence back to each consumer.
It introduces a ConnectionActivationFactory (fresh sequence per reactivation)
and an ActiveStageBuilder so session construction no longer depends on
ConnectionResult.
Adds a way to run a single RDP connection over a byte stream whose
confidentiality is already provided by the embedder's transport, rather
than having ironrdp-server perform the inner TLS handshake itself when
X.224 selects PROTOCOL_SSL.
Adds an opt-in server/acceptor knob to negotiate the RDP session desktop size using the client’s originally requested resolution (from GCC Client Core Data) so the server can start at the client’s native size without a Deactivation–Reactivation resize round trip.
Co-authored-by: Clint Christopher Canada <clint.canada@clubitech.com>
Makes the ironrdp-tls rustls backend’s crypto provider selectable at compile time by restructuring Cargo features, avoiding forcing a single provider onto downstreams via tokio-rustls default features.
Adds the server-side RDPEUSB (URBDRC) protocol processors to ironrdp-rdpeusb, introduces a backend-facing rdpeusb::io data model shared by client/server, and refactors TS_URB representations to better separate headers from payload variants.
Fixes progressive RemoteFX (MS-RDPEGFX) decoding by no longer requiring a CONTEXT block on every WireToSurface2 progressive frame once a codec context has already been established (keyed by codec_context_id). This aligns the decoder with real-world server behavior and the spec’s “establish once, then reference” model for progressive contexts.