Files
Andy Dixon 50c0104d57 feat(core): RDP client on IronRDP
clients::rdp connects over any caller-dialled TCP stream (direct, proxy
or SSH tunnel), upgrades to TLS and logs on with NLA (CredSSP/NTLM),
optionally falling back to TLS-only logon for servers without NLA such
as xrdp (credentials are passed so they log straight in). The server
certificate is pinned through a caller check on its SHA256 fingerprint
before any credentials are sent. The desktop decodes into the VNC
client's RGBA framebuffer; input (IronRDP's scancode/Unicode/mouse
operations), Display Control resizes and the deactivation-reactivation
sequence run on the session thread.

IronRDP's releases need three vendored patches (vendor/README.md):
picky and sspi with their RustCrypto release-candidate pins relaxed so
they share russh's stable versions (their own suites, 402 tests, pass
against them), and ironrdp-session with two unreleased upstream bitmap
fixes (#1486 stride, #1524 RDP6 orientation) without which xrdp desktops
render sheared.

Verified live against xrdp (scottyhardy/docker-remote-desktop): logon,
full desktop rendering, keyboard and mouse input.
2026-10-12 10:50:24 +01:00

12 KiB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.11.0] - 2026-07-10

Security

  • [breaking] Send NetworkAutoDetect over the MCS message channel (#1348) (8a1fd0118e)

    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.

Bug Fixes

  • Propagate caller location through error constructor helpers (#1392) (d6990d81a1)

    The error constructor helpers in several crates wrap the #[track_caller] ironrdp_error::Error::new, but were not themselves marked #[track_caller]. As a result, the captured location pointed at the helper body instead of the real call site, giving misleading "@ file:line" info in error reports.

  • Reduce dependency on ironrdp-connector (#1419) (5c22f86a71)

    Drops session's reliance on ironrdp-connector legacy helpers, now sourced from ironrdp-pdu.

  • [breaking] Remove ironrdp-connector dependency (#1435) (c6a0286dcb)

    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.

[0.10.0] - 2026-06-05

Bug Fixes

  • Decode RGBA QOI bitmaps instead of dropping the frame (#1341) (ef20ea4e90)

    Fixes the client-side QOI decode path in ironrdp-session so RGBA-channel QOI frames are decoded and applied to the framebuffer instead of being dropped, improving interoperability with third-party RDP servers and older ironrdp-server builds that emit RGBA QOI.

Build

  • [breaking] Update ironrdp-dvc public dependency

[0.9.0] - 2026-05-27

Features

  • Dispatch multitransport PDUs on IO channel (#1096) (7853e3cc6f)

    decode_io_channel() assumes all IO channel PDUs begin with aShareControlHeader. Multitransport Request PDUs use a BasicSecurityHeader with SEC_TRANSPORT_REQ instead ([MS-RDPBCGR] 2.2.15.1).

    This adds a peek-based dispatch: check the first u16 forTRANSPORT_REQ, decode as MultitransportRequestPdu if set, otherwise fall through to the existing decode_share_control() path unchanged.

    The new variant is propagated through ProcessorOutput and 'ActiveStageOutput` so applications can handle multitransport requests. Client and web consumers log the request (no UDP transport yet).

  • Add bulk compression and wire negotiation (ebf5da5f33)

    • add ironrdp-bulk crate with MPPC/NCRUSH/XCRUSH, bitstream, benches, and metrics
    • advertise compression in Client Info and plumb compression_type through connector
    • decode compressed FastPath/ShareData updates using BulkCompressor
    • update CLI to numeric compression flags (enabled by default, level 0-3)
    • extend screenshot example with compression options and negotiated logging
    • refresh tests, FFI/web configs, typos, and Cargo.lock
  • Complete pixel format support for bitmap updates (#1134) (a6b41093ce)

    Wires missing bitmap pixel formats (8/15/24bpp) into the session rendering pipeline so bitmap updates at those depths are rendered instead of being dropped, and adds fast-path palette update parsing to support 8bpp indexed color sessions.

  • Handle Auto-Detect Request PDUs from server (#1178) (4dcad09980)

    Fixes a crash when the server sends Auto-Detect Request PDUs during an active session. After #1176 added ShareDataPdu::AutoDetectReq routing, these PDUs decode correctly but hit the catch-all error path in the x224 processor: "unhandled PDU: Auto-Detect Request PDU".

  • Handle slow-path graphics and pointer updates (#1132) (9383380292)

    Adds support for slow-path graphics and pointer updates to IronRDP, fixing connectivity issues with servers like XRDP that use slow-path output instead of fast-path. The implementation parses slow-path framing headers and routes the inner payload structures through the existing fast-path processing pipeline by extracting shared bitmap and pointer processing methods.

Bug Fixes

  • Fix pixel format handling in bitmap decoders (#1101) (75863245ab)

  • Handle row padding in uncompressed bitmap updates (4262ae75ff)

    Uncompressed bitmap data has rows padded to 4-byte boundaries per [MS-RDPBCGR] 2.2.9.1.1.3.1.2.2, but the bitmap apply functions expect tightly packed pixel data. Strip the per-row padding before passing raw bitmap data to the apply functions.

    This fixes garbled bitmap rendering when connecting to servers that send uncompressed bitmaps with non-aligned row widths, such as XRDP at 16 bpp.

  • Skip bitmap updates that exceed bounds (#1146) (2b97a95e6d)

    After a desktop resize, an RDP server can send a burst of bitmap updates for the old resolution before its rendering pipeline has fully transitioned to the new one. These updates reference coordinates beyond the current image buffer in DecodedImage, causing index-out-of-bounds panics in the apply_* methods. On the server side, the same stale bitmaps can reach the encoder with dimensions exceeding the negotiated desktop size, panicking in NoneHandler::handle().

    This commit adds bounds checks at two levels:

    • DecodedImage::rect_fits() guard at the entry of each apply_* method, returning an empty rectangle when the update doesn't fit
    • Encoder-level guard in EncoderIter::next() that drops BitmapUpdates exceeding the current desktop size
  • Propagate negotiated share_id to all outgoing ShareDataPdu (#1147) (2b24e9664d)

[0.8.0] - 2025-12-18

[0.6.0] - 2025-08-29

Features

  • Add QOI image codec (613fd51f26)

    The Quite OK Image format ([1]) losslessly compresses images to a similar size of PNG, while offering 20x-50x faster encoding and 3x-4x faster decoding.

  • Add QOIZ image codec (87df67fdc7)

    Add a new QOIZ codec for SetSurface command. The PDU data contains the same data as the QOI codec, with zstd compression.

[0.4.1] - 2025-06-27

Features

  • More functions on ActiveStage (#791) (5482365655)
    • get_dvc_by_channel_id
    • encode_dvc_messages

[0.4.0] - 2025-05-27

Features

Bug Fixes

  • Update rectangle when applying None codecs updates (#728) (a50cd643dc)

  • Return the correct updated region (7507a152f1)

    "update_rectangle" is set to empty(). The surface updates are then added by "union". But a union with an empty rectangle at (0,0) is still a rectangle at (0,0). We end up with big region updates rooted at (0,0)...

  • Decrease verbosity of Rfx frame_index (b31b99eafb)

  • Decrease verbosity of FastPath header (f9b6992e74)

[0.3.0] - 2025-03-12

Build

  • Bump ironrdp-pdu

[0.2.3] - 2025-03-12

Build

[0.2.2] - 2025-01-28

Documentation

  • Use CDN URLs instead of the blob storage URLs for Devolutions logo (#631) (dd249909a8)

[0.2.1] - 2024-12-14

Other