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>
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 {:#}.
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.
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.
> 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.
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="b49ade728c"><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>
- 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
- Fixes the Cliprdr `SvcProcessor` impl. to support handling a
`TemporaryDirectory` Clipboard PDU.
- Removes `ClipboardError::UnimplementedPdu` since it is no longer used
The `ironrdp-tokio` crate currently provides the following two
`Framed<S>` implementations using the standard `tokio::io` traits:
- `type TokioFramed<S> = Framed<TokioStream<S>>` where `S: Send + Sync +
Unpin`
- `type LocalTokioFramed<S> = Framed<LocalTokioStream<S>>` where `S:
Unpin`
The former is meant for multi-threaded runtimes and the latter is meant
for single-threaded runtimes.
This PR adds a third `Framed<S>` implementation:
`pub type MovableTokioFramed<S> = Framed<MovableTokioStream<S>>` where
`S: Send + Unpin`
This is a valid usecase as some implementations of the `tokio::io`
traits are `Send` but `!Sync`. Without this new third type, consumers of
`Framed<S>` who have a `S: Send + !Sync` trait for their streams are
forced to downgrade to `LocalTokioFramed` and do some hacky workaround
with `tokio::task::spawn_blocking` since the defined associated futures,
`ReadFut` and `WriteAllFut`, are neither `Send` nor `Sync`.
When parsing Network Data Representation (NDR) messages, we're supposed
to account for padding at the end of strings to remain aligned on a
4-byte boundary. The existing code doesn't seem to cover all cases, and
the resulting misalignment causes misleading errors when processing the
rest of the message.
> Checks the doc comments of publicly visible functions that may panic
and warns if there is no # Panics section.
Co-authored-by: Benoît Cortier <3809077+CBenoit@users.noreply.github.com>
More munging to give human-readable webclient-side errors for
RDCleanPath general/negotiation errors, including strings for WSA and
TLS and HTTP error conditions.
leading zero in Nuget version caused CI to fail on ffi crate build:
```
error: invalid leading zero in minor version number
--> ffi/Cargo.toml:3:11
|
3 | version = "2025.09.24"
| ^^^^^^^^^^^^
|
error: failed to load manifest for workspace member `/Users/runner/work/IronRDP/IronRDP/ffi`
referenced by workspace at `/Users/runner/work/IronRDP/IronRDP/Cargo.toml`
```