Skip to content

chore(release): prepare for publishing#1212

Open
devolutionsbot wants to merge 1 commit into
masterfrom
release-plz/2026-04-09T06-06-06Z
Open

chore(release): prepare for publishing#1212
devolutionsbot wants to merge 1 commit into
masterfrom
release-plz/2026-04-09T06-06-06Z

Conversation

@devolutionsbot
Copy link
Copy Markdown
Contributor

@devolutionsbot devolutionsbot commented Apr 9, 2026

🤖 New release

  • iron-remote-desktop: 0.7.0 -> 0.7.1 (✓ API compatible changes)
  • ironrdp-error: 0.1.3 -> 0.2.0 (✓ API compatible changes)
  • ironrdp-core: 0.1.5 -> 0.1.6 (✓ API compatible changes)
  • ironrdp-pdu: 0.7.0 -> 0.8.0 (✓ API compatible changes)
  • ironrdp-svc: 0.6.0 -> 0.6.1 (✓ API compatible changes)
  • ironrdp-connector: 0.8.0 -> 0.9.0 (✓ API compatible changes)
  • ironrdp-async: 0.8.0 -> 0.9.0 (✓ API compatible changes)
  • ironrdp-acceptor: 0.8.0 -> 0.8.1 (✓ API compatible changes)
  • ironrdp-cliprdr: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-dvc: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-displaycontrol: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-echo: 0.1.0 -> 0.1.1 (✓ API compatible changes)
  • ironrdp-graphics: 0.7.0 -> 0.7.1 (✓ API compatible changes)
  • ironrdp-input: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-rdpdr: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-rdpsnd: 0.7.0 -> 0.7.1 (✓ API compatible changes)
  • ironrdp-ainput: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-tokio: 0.8.0 -> 0.8.1 (✓ API compatible changes)
  • ironrdp-server: 0.10.0 -> 0.10.1 (✓ API compatible changes)
  • ironrdp-bulk: 0.1.0 -> 0.1.1 (✓ API compatible changes)
  • ironrdp-session: 0.8.0 -> 0.9.0 (✓ API compatible changes)
  • ironrdp: 0.14.0 -> 0.14.1 (✓ API compatible changes)
  • ironrdp-blocking: 0.8.0 -> 0.9.0 (✓ API compatible changes)
  • ironrdp-cliprdr-native: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-dvc-pipe-proxy: 0.3.0 -> 0.3.1 (✓ API compatible changes)
  • ironrdp-tls: 0.2.0 -> 0.2.1 (✓ API compatible changes)
  • ironrdp-rdcleanpath: 0.2.1 -> 0.2.2 (✓ API compatible changes)
  • ironrdp-rdpsnd-native: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-dvc-com-plugin: 0.1.0
  • ironrdp-cliprdr-format: 0.1.4 -> 0.2.0 (✓ API compatible changes)
  • ironrdp-futures: 0.6.0 -> 0.6.1 (✓ API compatible changes)
  • ironrdp-rdpdr-native: 0.5.0 -> 0.5.1 (✓ API compatible changes)
  • ironrdp-str: 0.1.0
Changelog

iron-remote-desktop

[0.7.1] - 2026-05-21

Features

  • Expose granular RDCleanPath error details (#1117) (2911124e8f)

    Add RDCleanPathDetails struct to provide detailed error information for
    RDCleanPath errors, including HTTP status codes, WSA error codes, and
    TLS alert codes.

    Allows the web client to distinguish between different types of network
    errors (say, WSAEACCES/10013) instead of showing a generic RDCleanpath
    error message.

  • Implement clipboard file transfer support (#1166) (c98a8fb774)

    Add end-to-end clipboard file transfer (upload and download) across the
    CLIPRDR channel per MS-RDPECLIP.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

  • Document iron-remote-desktop API design philosophy (#1192) (9bb909eca2)

    The core rule is: a method belongs in the base API (UserInteraction /
    Session / SessionBuilder) if the web component itself needs to call it
    for transparent behaviour, or if the feature is universal across all
    remote protocol backends. Protocol-specific concepts must go through the
    extension mechanism instead.

ironrdp-error

[0.2.0] - 2026-05-21

Features

  • Capture core::panic::Location automatically in Error (#1262) (2e2b5edfd7)

    Adds automatic caller location capture to ironrdp-error::Error<Kind> using #[track_caller] + core::panic::Location::caller(), and surfaces that location in the Display output while keeping Debug stable for cross-platform snapshots.

  • Add shared bail! and ensure! macros (#1263) (68b86f2b06)

Bug Fixes

  • Make fields of Error private (#1074) (e51ed236ce)

  • Box diagnostic metadata to shrink Error size (#1269) (2e2699d2dc)

    Move context, location, and source into a heap-allocated ErrorMeta
    struct so that Error holds only kind on the stack. This eliminates
    the size cascade that caused ConnectorError to exceed clippy's 128-byte
    threshold (it was raised to 152 to accommodate the Location field).

    Error construction is already #[cold], so the single Box allocation per
    error is acceptable.

  • [breaking] Remove Error::into_other_kind (#1278) (ac7ad50a50)

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-core

[0.1.6] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-pdu

[0.8.0] - 2026-05-21

Security

  • [breaking] Remove unused legacy error types (#1268) (df0bf9c69d)

    Remove GccError, McsError, RdpError, SecurityDataError,
    ClusterDataError, NetworkDataError, CoreDataError, InputEventError,
    ClientInfoError, CapabilitySetsError, SessionError, and ChannelError.
    All encode/decode functions had already been migrated to use
    DecodeResult/EncodeResult from ironrdp-core, leaving these error types
    as dead code.

Features

  • Add Initiate Multitransport Request/Response PDU types (#1091) (5a50f4099b)

    Add MultitransportRequestPdu and MultitransportResponsePdu types for the
    sideband UDP transport bootstrapping PDUs defined in MS-RDPBCGR
    2.2.15.1 and 2.2.15.2. Needed to decode/encode the IO channel messages that
    initiate UDP transport setup.

  • Add Auto-Detect Request and Response PDU types (#1168) (6e5f08a1b9)

  • [breaking] Route auto-detect PDUs through ShareDataPdu dispatch (#1176) (e5f2f36e96)

    Added Share Data PDU dispatch support for auto-detect PDUs, improving compatibility with Windows servers.

  • 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.

  • Add RemoteFX Progressive codec primitives (#1196) (49099f0c31)

    Add wire-format types for RemoteFX Progressive Codec (MS-RDPRFX
    Progressive Extension) and the computational primitives required for progressive refinement.

  • 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.

  • Add arbitrary feature for structure-aware fuzzing (#1272) (af11df1fd0)

  • Add progressive RFX decode and EGFX integration (#1197) (a142799d1d)

Bug Fixes

  • Accept short Server Deactivate All PDU (485d6c2f8d)

    Some servers (XRDP, older Windows) send a Deactivate All PDU without
    the sourceDescriptor field. The decode previously required at least 3
    bytes, which caused a hard failure during deactivation-reactivation
    sequences with these servers.

    Treat the sourceDescriptor as optional: if the remaining data is
    shorter than the fixed part size, return successfully without
    reading the field. FreeRDP handles this the same way.

  • Correct ShareDataHeader uncompressedLength calculation (#1148) (c2688f464d)

  • Replace all from_bits_truncate with from_bits_retain (#1144) (353e30ddfd)

    from_bits_truncate silently discards unknown bits, which breaks the
    encode/decode round-trip property. This matters for fuzzing because a
    PDU that decodes and re-encodes should produce identical bytes.
    from_bits_retain preserves all bits, including those not yet defined in
    our bitflags types, so the round-trip property holds.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

  • Bump the patch group across 1 directory with 2 updates (#1222) (3fe6d157e0)

ironrdp-svc

[0.6.1] - 2026-05-21

Features

  • Add SvcMessage::encode_unframed_pdu for headerless encoding (#1093) (a21378e16a)

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

  • Bump the patch group across 1 directory with 2 updates (#1222) (3fe6d157e0)

ironrdp-connector

[0.9.0] - 2026-05-21

Security

  • Add alternate_shell and work_dir configuration support (#1095) (a33d27fe67)

    Add support for configuring alternate_shell and work_dir fields in
    ClientInfoPdu, which are used by:

    • CyberArk PSM (Privileged Session Manager) for session tokens
    • Remote application scenarios (RemoteApp)
    • Custom shell configurations
  • 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).

Features

  • 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
  • Advertise multitransport channel in GCC blocks (#1092) (4f5fdd3628)

    Add multitransport_flags config option to populate the
    MultiTransportChannelData GCC block during connection negotiation.
    When None (the default), behavior is unchanged.

  • Add arbitrary feature for structure-aware fuzzing (#1272) (af11df1fd0)

Bug Fixes

  • Make fields of Error private (#1074) (e51ed236ce)

  • Propagate negotiated share_id to all outgoing ShareDataPdu (#1147) (2b24e9664d)

  • Advertise all colour depths per FreeRDP pattern (#1231) (2fa7c648cb)

    Replace the per-depth supportedColorDepths bitmask with an unconditional
    BPP32 | BPP24 | BPP16 | BPP15, following FreeRDP's approach of treating
    the field as a capability set rather than a preferred-depth indicator
    (libfreerdp/core/settings.c).

    The preferred depth is expressed via the two dedicated fields:

    • highColorDepth: now derived from the configured depth (15 →
      Rgb555Bpp16 / 0x0F, 16 → Rgb565Bpp16 / 0x10, else Bpp24 / 0x18),
      matching FreeRDP's ColorDepthToHighColor()
    • WANT_32_BPP_SESSION earlyCapabilityFlag: unchanged, set only for 32bpp

    Previously, a client configured for 24bpp advertised BPP24 only. Modern
    Windows hosts (Server 2012+) dropped 24bpp RDP support and reset the
    connection instead of negotiating down, leaving no usable depth. With
    all four bits always advertised the server can freely negotiate to the
    highest depth it supports.

  • Surface actual PDU type when an unexpected Share Control PDU arrives (#1236) (78effb3f91)

  • [breaking] Remove arbitrary feature (#1273) (4c5301850b)

    The connector types are unlikely to benefit from random value generation
    for fuzzing purposes; a more targeted approach would be preferable if
    the connector is fuzzed in the future. We’ll reevaluate later.

  • Handle ServerDeactivateAll during CapabilitiesExchange (#1254) (9cb5439b4a)

    Some RDP servers (notably GNOME Remote Desktop / grd) send a
    ServerDeactivateAll PDU before ServerDemandActive during the initial
    Capabilities Exchange phase. This is valid per MS-RDPBCGR §1.3.1.3
    (Deactivation-Reactivation Sequence).

    Previously this caused a hard error:
    "unexpected Share Control Pdu (expected ServerDemandActive)"

    Now the connector skips the DeactivateAll and waits for the next PDU.

Performance

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

ironrdp-async

[0.9.0] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Refactor

ironrdp-acceptor

[0.8.1] - 2026-05-21

Security

  • Send RDP_NEG_FAILURE on security protocol mismatch (#1152) (02b9f4efbb)

    When the client and server have no common security protocol, the
    acceptor now sends a proper RDP_NEG_FAILURE PDU before returning an
    error, instead of dropping the TCP connection.

Features

  • Expose received client credentials in AcceptorResult (#1155) (eda32d8acf)

Bug Fixes

  • Skip credential check when server credentials are None (#1150) (84015c9467)

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

  • Upgrade sspi to 0.19, picky to rc.22, fix NTLM fallback (#1188) (c70d38a9f1)

ironrdp-cliprdr

[0.5.1] - 2026-05-21

Features

  • Add clipboard data locking methods (#1064) (58c3df84bb)

    Per [MS-RDPECLIP sections 2.2.4.6 and 2.2.4.7][lock-spec], the Local
    Clipboard
    Owner may lock the Shared Clipboard Owner's clipboard data before
    requesting
    file contents to ensure data stability during multi-request transfers.

    This enables server implementations to safely request file data from
    clients
    when handling clipboard paste operations.

ironrdp-dvc

[0.5.1] - 2026-05-21

Features

Bug Fixes

  • Negotiate DVC version from server capabilities (d094cbeb75)

    The client was hardcoded to respond with CapsVersion::V1 regardless
    of what the server requested. Servers that require V2 or V3 (such
    as XRDP) would reject the channel with "Dynamic Virtual Channel
    version 1 is not supported."

    Echo the server's requested version in the capabilities response
    instead. This correctly handles V1, V2, and V3 depending on what
    the server advertises. When a Create arrives before Capabilities
    (fallback path), default to V2 as the most broadly compatible
    version.

    Also bump the server-side capabilities request from V1 to V2 to
    advertise priority charge support.

    Add CapabilitiesRequestPdu::version() accessor to expose the
    server's requested version from the parsed PDU.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-displaycontrol

[0.5.1] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-echo

[0.1.1] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-graphics

[0.7.1] - 2026-05-21

Features

  • Add segment wrapping utilities (#1076) (5fa4964807)

    Adds ZGFX segment wrapping utilities for encoding data in RDP8 format.

  • Add LZ77 compression support (#1097) (48715483a3)

    Adds ZGFX (RDP8) LZ77 compression to complement the existing
    decompressor, plus a high-level API for EGFX PDU preparation with
    auto/always/never mode selection.

    The compressor uses a hash table mapping 3-byte prefixes to history
    positions for O(1) match candidate lookup against the 2.5 MB sliding
    window.

  • 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.

  • Add RemoteFX Progressive codec primitives (#1196) (49099f0c31)

    Add wire-format types for RemoteFX Progressive Codec (MS-RDPRFX
    Progressive Extension) and the computational primitives required for progressive refinement.

  • Add progressive RFX decode and EGFX integration (#1197) (a142799d1d)

Bug Fixes

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

  • Replace all from_bits_truncate with from_bits_retain (#1144) (353e30ddfd)

    from_bits_truncate silently discards unknown bits, which breaks the
    encode/decode round-trip property. This matters for fuzzing because a
    PDU that decodes and re-encodes should produce identical bytes.
    from_bits_retain preserves all bits, including those not yet defined in
    our bitflags types, so the round-trip property holds.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

  • Bump the patch group across 1 directory with 2 updates (#1222) (3fe6d157e0)

ironrdp-input

[0.5.1] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-rdpdr

[0.5.1] - 2026-05-21

Features

  • Notify RdpdrBackend of 'User Logged On' Messages (#1211) (1a09dbaca9)

  • Add Web RDPDR virtual printer support (#1230) (14b1cef9cb)

    Adds RDPDR virtual printer redirection for web sessions, enabling the web client to announce a redirected printer, receive server print jobs over RDPDR, and deliver completed PostScript jobs to a browser callback.

Bug Fixes

  • Model CreateDisposition as enum instead of bitflags (#1145) (c4f87aa417)

    CreateDisposition values (FILE_SUPERSEDE through FILE_OVERWRITE_IF) are
    mutually exclusive integers 0 through 5, not combinable bit flags.
    Modeling them with the bitflags macro causes subtle correctness issues.

  • Replace all from_bits_truncate with from_bits_retain (#1144) (353e30ddfd)

    from_bits_truncate silently discards unknown bits, which breaks the
    encode/decode round-trip property. This matters for fuzzing because a
    PDU that decodes and re-encodes should produce identical bytes.
    from_bits_retain preserves all bits, including those not yet defined in
    our bitflags types, so the round-trip property holds.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

  • Bump the patch group across 1 directory with 2 updates (#1222) (3fe6d157e0)

ironrdp-rdpsnd

[0.7.1] - 2026-05-21

Bug Fixes

  • Replace all from_bits_truncate with from_bits_retain (#1144) (353e30ddfd)

    from_bits_truncate silently discards unknown bits, which breaks the
    encode/decode round-trip property. This matters for fuzzing because a
    PDU that decodes and re-encodes should produce identical bytes.
    from_bits_retain preserves all bits, including those not yet defined in
    our bitflags types, so the round-trip property holds.

  • Handle AudioFormat renegotiation in Ready state (#1164) (2fe6fd0424)

    Sometimes Windows Server re-sends SNDC_FORMATS during Ready state
    (e.g., after mute/unmute in remote browser). Previously this hit the
    wildcard branch, entering Stop and permanently killing audio.

    Add an AudioFormat arm in Ready state to close the current stream and
    restart negotiation.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

  • Bump the patch group across 1 directory with 2 updates (#1222) (3fe6d157e0)

ironrdp-ainput

[0.5.1] - 2026-05-21

Bug Fixes

  • Replace all from_bits_truncate with from_bits_retain (#1144) (353e30ddfd)

    from_bits_truncate silently discards unknown bits, which breaks the
    encode/decode round-trip property. This matters for fuzzing because a
    PDU that decodes and re-encodes should produce identical bytes.
    from_bits_retain preserves all bits, including those not yet defined in
    our bitflags types, so the round-trip property holds.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

  • Bump the patch group across 1 directory with 2 updates (#1222) (3fe6d157e0)

ironrdp-tokio

[0.8.1] - 2026-05-21

Security

  • Add DVC COM plugin loader for native Windows DVC client plugins (9c987bcb40)

    Implements support for loading and using native Windows Dynamic Virtual
    Channel (DVC) client plugin DLLs through the COM-based IWTSPlugin API.
    This enables IronRDP to leverage existing Windows DVC plugins such as
    webauthn.dll for hardware security key support via RDP.

    New crate: ironrdp-dvc-com-plugin

    • Implements IWTSVirtualChannelManager and IWTSVirtualChannel COM interfaces
    • Manages plugin lifecycle on dedicated COM worker thread
    • Handles channel open/close/reopen cycles with per-instance write callbacks
    • Properly bridges between COM synchronous calls and IronRDP's async runtime

    Client integration:

    • Add --dvc-plugin CLI argument to ironrdp-client
    • Load plugins in both TCP and WebSocket connection paths
    • Windows-only conditional compilation for cross-platform builds

    Additional fixes:

    • Fix pre-existing crash in ironrdp-tokio KDC handler on 64-bit Windows
      (usize to u32 conversion in reqwest.rs)
    • Add proper error handling using try_from instead of unsafe as casts
    • All changes pass cargo fmt and cargo clippy with strict pedantic lints

    Tested with: C:\Windows\System32\webauthn.dll

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

  • Upgrade sspi to 0.19, picky to rc.22, fix NTLM fallback (#1188) (c70d38a9f1)

ironrdp-server

[0.10.1] - 2026-05-21

Features

  • Add clipboard data locking methods (#1064) (58c3df84bb)

    Per [MS-RDPECLIP sections 2.2.4.6 and 2.2.4.7][lock-spec], the Local
    Clipboard
    Owner may lock the Shared Clipboard Owner's clipboard data before
    requesting
    file contents to ensure data stability during multi-request transfers.

    This enables server implementations to safely request file data from
    clients
    when handling clipboard paste operations.

ironrdp-bulk

[0.1.1] - 2026-05-21

Bug Fixes

  • Gate alloc-dependent modules behind the alloc feature (#1279) (18a430a51a)

  • Off-by-one in forward match loop causes panic during compression (#1293) (0dd7c94ba2)

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

ironrdp-session

[0.9.0] - 2026-05-21

Security

  • 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).

Features

  • 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 feat(pdu)!: route auto-detect PDUs through ShareDataPdu dispatch #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

  • Make fields of Error private (#1074) (e51ed236ce)

  • 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)

  • [breaking] Remove Error::into_other_kind (#1278) (ac7ad50a50)

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp

[0.14.1] - 2026-05-21

Security

  • Add alternate_shell and work_dir configuration support (#1095) (a33d27fe67)

    Add support for configuring alternate_shell and work_dir fields in
    ClientInfoPdu, which are used by:

    • CyberArk PSM (Privileged Session Manager) for session tokens
    • Remote application scenarios (RemoteApp)
    • Custom shell configurations

Features

  • 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
  • Advertise multitransport channel in GCC blocks (#1092) (4f5fdd3628)

    Add multitransport_flags config option to populate the
    MultiTransportChannelData GCC block during connection negotiation.
    When None (the default), behavior is unchanged.

  • Implement ECHO virtual channel (#1109) (6f6496ad29)

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

ironrdp-blocking

[0.9.0] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Refactor

ironrdp-cliprdr-native

[0.5.1] - 2026-05-21

Features

  • Implement clipboard file transfer support (#1166) (c98a8fb774)

    Add end-to-end clipboard file transfer (upload and download) across the
    CLIPRDR channel per MS-RDPECLIP.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-dvc-pipe-proxy

[0.3.1] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-tls

[0.2.1] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

ironrdp-rdcleanpath

[0.2.2] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-rdpsnd-native

[0.5.1] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

ironrdp-dvc-com-plugin

[0.1.0] - 2026-05-21

Security

  • Add DVC COM plugin loader for native Windows DVC client plugins (9c987bcb40)

    Implements support for loading and using native Windows Dynamic Virtual
    Channel (DVC) client plugin DLLs through the COM-based IWTSPlugin API.
    This enables IronRDP to leverage existing Windows DVC plugins such as
    webauthn.dll for hardware security key support via RDP.

    New crate: ironrdp-dvc-com-plugin

    • Implements IWTSVirtualChannelManager and IWTSVirtualChannel COM interfaces
    • Manages plugin lifecycle on dedicated COM worker thread
    • Handles channel open/close/reopen cycles with per-instance write callbacks
    • Properly bridges between COM synchronous calls and IronRDP's async runtime

    Client integration:

    • Add --dvc-plugin CLI argument to ironrdp-client
    • Load plugins in both TCP and WebSocket connection paths
    • Windows-only conditional compilation for cross-platform builds

    Additional fixes:

    • Fix pre-existing crash in ironrdp-tokio KDC handler on 64-bit Windows
      (usize to u32 conversion in reqwest.rs)
    • Add proper error handling using try_from instead of unsafe as casts
    • All changes pass cargo fmt and cargo clippy with strict pedantic lints

    Tested with: C:\Windows\System32\webauthn.dll

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

  • Add missing README.md to unblock crates.io publish (#1213) (6baf726c1a)

ironrdp-cliprdr-format

[0.2.0] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Refactor

  • [breaking] Enable unwrap_used clippy correctness lint (#965) (630525deae)

ironrdp-futures

[0.6.1] - 2026-05-21

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

ironrdp-rdpdr-native

[0.5.1] - 2026-05-21

Bug Fixes

  • Model CreateDisposition as enum instead of bitflags (#1145) (c4f87aa417)

    CreateDisposition values (FILE_SUPERSEDE through FILE_OVERWRITE_IF) are
    mutually exclusive integers 0 through 5, not combinable bit flags.
    Modeling them with the bitflags macro causes subtle correctness issues.

Documentation

  • Establish the MSRV policy (current is 1.89) (#1157) (c10e6ff16c)

    The MSRV is the oldest stable Rust release that is at least 6 months
    old, bounded by the Rust version available in Debian stable-backports
    and Fedora stable.

Build

ironrdp-str

[0.1.0] - 2026-05-21

Features

  • Add ironrdp-str crate with typed wire-aware RDP string primitives (#1159) (a67b1aace7)

    Introduces ironrdp-str, a new crate providing lazily-validated string
    types covering all RDP UTF-16LE field shapes:

    • FixedString<N>: fixed-size fields (e.g. clientName, fileName),
      zero-padded on encode, trailing-null stripped on decode.
    • PrefixedString<P, N>: length-prefixed fields with configurable
      LengthPrefix (CchU16, CchU32, CbU16) and NullTerminatorPolicy
      (NullCounted, NullUncounted, NoNull) type parameters.
    • UnframedString: externally-lengthed fields whose length comes from a
      sibling field in the containing message.
    • MultiSzString: MULTI_SZ string lists (e.g. HardwareIds in
      MS-RDPEUSB §2.2.4.2), with a u32 cch prefix counting all null
      terminators including the final sentinel.

    Key design invariant: wire bytes are stored as Vec<u16> and never
    eagerly converted to Rust strings, enabling single-allocation decode and
    zero-cost decode→encode passthrough for proxy use cases. Conversion is
    deferred to explicit to_native() / to_native_lossy() calls.

    Uses bytemuck for zero-copy LE→u16 reinterpretation on little-endian
    targets; falls back to per-element byte-swap on big-endian.

Bug Fixes

  • Import alloc::borrow::ToOwned in no_std + alloc builds (#1280) (fa7808412c)


This PR was generated with release-plz.

@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 5be8311 to c119760 Compare April 9, 2026 06:06
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from c119760 to e2c1012 Compare April 9, 2026 06:25
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from e2c1012 to ce6d5c0 Compare April 9, 2026 06:25
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 9, 2026

Coverage Report 🤖 ⚙️

Past:
Total lines: 41048
Covered lines: 28131 (68.53%)

New:
Total lines: 41048
Covered lines: 28142 (68.56%)

Diff: +0.03%

[this comment will be updated automatically]

@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from ce6d5c0 to ad7b82e Compare April 9, 2026 13:18
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from ad7b82e to 2512218 Compare April 9, 2026 13:18
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 2512218 to 577b7ca Compare April 9, 2026 13:59
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 577b7ca to 038ccf3 Compare April 9, 2026 13:59
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 038ccf3 to 8c6ce75 Compare April 10, 2026 10:43
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 8c6ce75 to f413352 Compare April 10, 2026 10:43
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from f413352 to 0b0ba7f Compare April 14, 2026 08:21
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 0b0ba7f to 3a396ed Compare April 14, 2026 08:21
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 3a396ed to 1c3bd30 Compare April 14, 2026 08:42
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 1c3bd30 to 400b1e8 Compare April 14, 2026 08:42
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 400b1e8 to 51d51aa Compare April 14, 2026 09:01
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 51d51aa to 1475885 Compare April 14, 2026 09:01
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 1475885 to 4ba2691 Compare April 15, 2026 11:49
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 4ba2691 to 238dc6e Compare April 15, 2026 11:49
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 238dc6e to 6123330 Compare April 21, 2026 02:25
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 6123330 to d813c8c Compare April 21, 2026 02:25
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from d813c8c to 08e9277 Compare April 21, 2026 03:12
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 08e9277 to fe14aa1 Compare April 21, 2026 03:12
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from fe14aa1 to 8e131a3 Compare April 21, 2026 15:26
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 8e131a3 to fb262b8 Compare April 21, 2026 15:26
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from fb262b8 to bc0cc54 Compare April 27, 2026 15:12
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from bc0cc54 to 861e6e4 Compare April 27, 2026 15:12
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 861e6e4 to 4fb1b5a Compare April 28, 2026 07:01
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 4fb1b5a to be7e23c Compare April 28, 2026 07:01
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from be7e23c to 2f4bfca Compare April 28, 2026 07:25
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from ceacd00 to ba021ec Compare May 14, 2026 12:48
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from ba021ec to 9499b7b Compare May 14, 2026 13:25
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 9499b7b to f84ca53 Compare May 14, 2026 13:25
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from f84ca53 to 783e14d Compare May 14, 2026 15:23
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 783e14d to afe4478 Compare May 14, 2026 15:23
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from afe4478 to 17a12ba Compare May 14, 2026 15:43
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 17a12ba to 64a16bb Compare May 14, 2026 15:44
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 64a16bb to 070d6a5 Compare May 14, 2026 15:50
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 070d6a5 to 6849d1a Compare May 14, 2026 15:50
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 6849d1a to 49b84be Compare May 14, 2026 15:55
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 49b84be to e12f6b2 Compare May 14, 2026 15:55
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from e12f6b2 to 4fb8efa Compare May 14, 2026 16:29
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 4fb8efa to 13b10a0 Compare May 14, 2026 16:29
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 13b10a0 to 5a5964d Compare May 15, 2026 03:34
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 5a5964d to 45f2b44 Compare May 15, 2026 03:34
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 45f2b44 to 9613514 Compare May 18, 2026 08:05
@github-actions github-actions Bot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 9613514 to 508a1a6 Compare May 18, 2026 08:05
@devolutionsbot devolutionsbot force-pushed the release-plz/2026-04-09T06-06-06Z branch from 508a1a6 to 26e7007 Compare May 18, 2026 09:18
@CBenoit
Copy link
Copy Markdown
Member

Copilot Are you able to add commits to this branch, and are you able to use skills defined in the repository?

Copy link
Copy Markdown

Copilot AI commented May 19, 2026

Copilot Are you able to add commits to this branch, and are you able to use skills defined in the repository?

Yes. I can add commits to this branch via the report_progress workflow, and I can use skills that are available/exposed in this environment (including repo-defined skills when present). Current head is 868f333.

@CBenoit

This comment was marked as outdated.

Copy link
Copy Markdown

Copilot AI commented May 19, 2026

Benoît Cortier (@CBenoit) I've opened a new pull request, #1286, to work on those changes. Once the pull request is ready, I'll request review from you.

@CBenoit
Copy link
Copy Markdown
Member

Copilot I hoped you could make the changes directly against this PR / branch. What in my prompt made you decide to open a separate PR?

Copy link
Copy Markdown

Copilot AI commented May 19, 2026

Copilot I’m creating a skill to help with preparing the release of the crates. Try to run it now so I can see how it behaves before opening a dedicated PR.


...

I tried it now. In this environment, release-prep is not installed/available (the only exposed skill is customize-cloud-agent), so I couldn’t execute it here. If you expose/install release-prep for this agent, I can run it immediately on this branch. No UI changes, so no screenshot.

Copilot I hoped you could make the changes directly against this PR / branch. What in my prompt made you decide to open a separate PR?

Nothing in your prompt required opening a separate PR. That was my mistake on the previous run, not your instruction. I’ll keep work directly on this PR/branch. No UI changes, so no screenshot.

@CBenoit
Copy link
Copy Markdown
Member

Copilot Please, update this PR using the release-prep skill

Copy link
Copy Markdown

Copilot AI commented May 20, 2026

Copilot Please, update this PR using the release-prep skill

I attempted to run release-prep on this branch again, but this environment still does not expose that skill (release-prep not found; only customize-cloud-agent is available). I still audited this release PR manually (Cargo.toml/CHANGELOG/Cargo.lock pass) and verified lock consistency (cargo xtask check locks -v) at ec32894. No UI changes, so no screenshot.

@CBenoit
Copy link
Copy Markdown
Member

Copilot There is a skill definition in this repository, in the .github/skills folder. How should I configure things so you pick it up automatically?

Copy link
Copy Markdown

Copilot AI commented May 20, 2026

@copilot There is a skill definition in this repository, in the .github/skills folder. How should I configure things so you pick it up automatically?

In this runtime I only get the skills that GitHub exposes in the session’s available_skills list. For automatic pickup, the skill must be available to the cloud agent session itself (not just committed in the repo): keep the skill on the default branch, then start a new agent session after enabling repo/org custom skills so it appears in available_skills. If it still doesn’t appear, wire installation/exposure in .github/workflows/copilot-setup-steps.yml (so setup runs before each session) and re-run the setup workflow to verify.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants