Sync with upstream and fix slow-path bitmap stride for xrdp - #2
Conversation
All crates migrated: - ironrdp - ironrdp-acceptor - ironrdp-ainput - ironrdp-async - ironrdp-blocking - ironrdp-cliprdr - ironrdp-cliprdr-format - ironrdp-cliprdr-native - ironrdp-connector - ironrdp-core - ironrdp-displaycontrol - ironrdp-dvc - ironrdp-dvc-pipe-proxy - ironrdp-error - ironrdp-futures - ironrdp-graphics - ironrdp-input - ironrdp-pdu - ironrdp-rdcleanpath - ironrdp-rdpdr - ironrdp-rdpdr-native - ironrdp-rdpsnd - ironrdp-rdpsnd-native - ironrdp-server - ironrdp-session - ironrdp-svc - ironrdp-tls - ironrdp-tokio - iron-remote-desktop
…olutions#1043) - Rename `AsyncNetworkClient` to `NetworkClient` - Replace dynamic dispatch (`Option<&mut dyn ...>`) with static dispatch using generics (`&mut N where N: NetworkClient`) - Reorder `connect_finalize` parameters for consistency across crates
Bumps [criterion](https://github.com/criterion-rs/criterion.rs) from 0.7.0 to 0.8.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/criterion-rs/criterion.rs/releases">criterion's releases</a>.</em></p> <blockquote> <h2>criterion-plot-v0.8.0</h2> <p>No release notes provided.</p> <h2>criterion-v0.8.0</h2> <h3>BREAKING</h3> <ul> <li>Drop async-std support</li> </ul> <h3>Changed</h3> <ul> <li>Bump MSRV to 1.86, stable to 1.91.1</li> </ul> <h3>Added</h3> <ul> <li>Add ability to plot throughput on summary page.</li> <li>Add support for reporting throughput in elements and bytes - <code>Throughput::ElementsAndBytes</code> allows the text summary to report throughput in both units simultaneously.</li> <li>Add alloca-based memory layout randomisation to mitigate memory effects on measurements.</li> <li>Add doc comment to benchmark runner in criterion_group macro (removes linter warnings)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix plotting NaN bug</li> </ul> <h3>Other</h3> <ul> <li>Remove Master API Docs links temporarily while we restore the docs publishing.</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/criterion-rs/criterion.rs/blob/master/CHANGELOG.md">criterion's changelog</a>.</em></p> <blockquote> <h2><a href="https://github.com/criterion-rs/criterion.rs/compare/criterion-v0.7.0...criterion-v0.8.0">0.8.0</a> - 2025-11-29</h2> <h3>BREAKING</h3> <ul> <li>Drop async-std support</li> </ul> <h3>Changed</h3> <ul> <li>Bump MSRV to 1.86, stable to 1.91.1</li> </ul> <h3>Added</h3> <ul> <li>Add ability to plot throughput on summary page.</li> <li>Add support for reporting throughput in elements and bytes - <code>Throughput::ElementsAndBytes</code> allows the text summary to report throughput in both units simultaneously.</li> <li>Add alloca-based memory layout randomisation to mitigate memory effects on measurements.</li> <li>Add doc comment to benchmark runner in criterion_group macro (removes linter warnings)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix plotting NaN bug</li> </ul> <h3>Other</h3> <ul> <li>Remove Master API Docs links temporarily while we restore the docs publishing.</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/criterion-rs/criterion.rs/commit/b49ade728c064f49cb2a70b0368658a15cf21833"><code>b49ade7</code></a> chore: release v0.8.0</li> <li>See full diff in <a href="https://github.com/criterion-rs/criterion.rs/compare/criterion-plot-v0.7.0...criterion-v0.8.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
> It checks for the size of a Future created by async fn or async {}.
The maximum byte size a `Future` can have, before it triggers the
clippy::large_futures lint is by default 16384, but we can adjust it.
…sions (Devolutions#1047) When starting a second clipboard session, `RegisterClassA` would fail with `ERROR_CLASS_ALREADY_EXISTS` because window classes are global to the process. Now checks if the class is already registered before attempting registration, allowing multiple WinClipboard instances to coexist.
…ions#1048) We still don't have a means to set the nuget version directly in the workflow. I thought of adding it, but on closer inspection we have logic to handle package and product version differently (and the same is true of sspi-rs etc) and probably needs a closer look. It can be troublesome to deploy a newer nuget package that doesn't increment the assembly versions (for example - and it shouldn't be an issue for Devolutions, but maybe for other consumers - Windows Installers generally might not overwrite a DLL if the version number is not newer than what is already installed. For now, I just bump the package version manually.
The `net8.0-ios` workload is out of support and won't build out-of-the-box anymore. Bump the target framework to `net9.0-ios`.
…s#1050) Replaced generic From implementation that used to_string() with specific implementations for each error type to ensure source error chains are preserved. IronRDP errors now use .report() for full context, while standard library errors are converted to anyhow::Error for proper alternate formatting with {:#}.
…ons#1053) Servers can now send Format List PDU via initiate_copy() regardless of internal state. The existing state machine was designed for clients where clipboard initialization must complete before announcing ownership. MS-RDPECLIP Section 2.2.3.1 specifies that Format List PDU is sent by either client or server when the local clipboard is updated. Servers should be able to announce clipboard changes immediately after channel negotiation. This change enables RDP servers to properly announce clipboard ownership by bypassing the Initialization/Ready state check when R::is_server() is true. Client behavior remains unchanged. Co-authored-by: lamco-office <office@lamco.io>
…olutions#1054) This allows client applications to verify details of the certificate, possibly with the user, when connecting to a server using TLS.
…evolutions#1059) - Clean up permissions and remove unnecessary fetch-depth settings from release workflow. - Clean up unused peer dependency entries from package-lock.json files.
Devolutions#1069) Makes Error::context and Error::kind public again to fix a breaking change that wasn't properly reported. This is a temporary workaround to allow crate publishing to proceed.
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. --------- Co-authored-by: lamco-office <office@lamco.io>
Per [MS-RDPECLIP section 2.2.5.3][file-contents-spec], the Local Clipboard Owner sends File Contents Request PDU to retrieve file data from the Shared Clipboard Owner during paste operations. This enables server implementations to request file contents from clients, completing the bidirectional file transfer capability. [file-contents-spec]: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpeclip/cbc851d3-4e68-45f4-9292-26872a9209f2 Co-authored-by: lamco-office <office@lamco.io>
…ons#1066) Adds `SendFileContentsResponse` to `ClipboardMessage` enum, enabling clipboard backends to signal when file data is ready to send via `submit_file_contents()`. This provides the message-based interface pattern used consistently by server implementations for clipboard operations. Co-authored-by: lamco-office <office@lamco.io>
…lutions#1078) Already enabled in cliff.toml. Refs: d202d05.
…rs (Devolutions#1392) 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.
The debug! logging in insert/remove/get stringified raw keys and values on every access, which exposed secrets such as ClearTextPassword, gateway_password and rdcleanpath_token in logs. Observed debugging value was low, so the logging is removed entirely rather than redacted, and the tracing dependency is dropped.
Add a CLI-driven, daemon-backed RDP client designed for programmatic (e.g. LLM) consumption. A single binary plays two roles: a long-lived daemon that owns the ironrdp-client engine and one RDP session, and a short-lived CLI that drives it over a local IPC transport (Unix domain socket / Windows named pipe). Highlights: - Binary, length-delimited IPC protocol using ironrdp-core's Encode/Decode traits (no JSON). Connection config travels as a binary-encoded PropertySet inside a strictly-typed Request::Connect; runtime input/query operations are strictly-typed messages. - Secrets never reach the IPC reader: ConfigBuilder::build strips every ironrdp_cfg::is_secret_key property, and the daemon seeds its live bag from the post-build config, so dumps/status/logs cannot leak them. - Operator overlay: daemon-start --overlay FILE preloads a .rdp file applied on top of every connect (overlay wins) to provision any setting out of band, credentials in particular. Status reports credentials_loaded so a caller knows whether it must supply a password. - Separate logging: the daemon's own logs go to stderr (default INFO, IRONRDP_LOG), while each RDP session's logs are captured into a small queryable ring buffer (default DEBUG) via a thread-local subscriber, refinable per-connect with --log-directive for troubleshooting. - --help-agent prints a structured, LLM-friendly operation guide.
…ndler (Devolutions#1359) Move the negotiation into the crate and split selection from lifecycle: ```rust fn choose_format<'a>(&mut self, common: &'a [NegotiatedFormat]) -> Option<&'a NegotiatedFormat>; fn start(&mut self, format: &NegotiatedFormat); ``` Co-authored-by: Clint Christopher Canada <clint.canada@clubitech.com>
…Devolutions#1395) 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.
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.
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.
…1373) 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>
…Devolutions#1281) 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.
…volutions#1403) Signed-off-by: uchouT <i@uchout.moe>
Removes the leftover legacy modules and moves actually useful utilities to ironrdp-pdu crate.
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.
…utions#1348) 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.
…ions#1439) 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.
Co-authored-by: Benoît Cortier <3809077+CBenoit@users.noreply.github.com>
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.
…c-bitmap-fix # Conflicts: # .github/workflows/npm-publish.yml # .github/workflows/nuget-publish.yml # .github/workflows/release-crates.yml # Cargo.lock # crates/ironrdp-client/Cargo.toml
|
Important Review skippedToo many files! This PR contains 692 files, which is 542 over the limit of 150. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (81)
📒 Files selected for processing (692)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Syncs the fork with upstream Devolutions/IronRDP and adds a fix for slow-path bitmap rendering against xrdp.