feat(agent): add clipboard HTML support - #1878
Open
Greg Lamberson (glamberson) wants to merge 2 commits into
Open
feat(agent): add clipboard HTML support#1878Greg Lamberson (glamberson) wants to merge 2 commits into
Greg Lamberson (glamberson) wants to merge 2 commits into
Conversation
Extends the daemon clipboard-get/clipboard-set operations added in Devolutions#1863 to images: clipboard-get-image writes the last image received from the remote clipboard to a PNG file, clipboard-set-image reads a PNG file and advertises it to the remote as CF_DIB/CF_DIBV5. The daemon stores images as PNG bytes and converts to/from the wire's DIB byte layout via ironrdp-cliprdr-format's existing png_to_cf_dib(v5) and dib(v5)_to_png, so no new pixel-format code is needed here. Both DIB variants are advertised when offering an image (DIBV5 is richer but not every peer understands it); on paste, DIBV5 is preferred over DIB, and image is preferred over text when the remote offers both. Replaces ClipboardState's two Option<String> fields with a small ClipboardContent enum (Text/Image) so local and remote clipboard content is a single logical item, matching how each clipboard-set* call replaces whatever was there before. Adds a PendingPaste field to the CLIPRDR backend to track which format was requested, since FormatDataResponse does not itself carry the format it answers and MS-RDPECLIP allows only one outstanding request at a time. New Request::ClipboardGetImage/ClipboardSetImage and Payload::ClipboardImage wire variants, bounded at 64 MiB (matching ironrdp-cliprdr-format's own internal cap) both in the CLI parser and on wire decode. clipboard_set_image validates the PNG up front by attempting the DIB conversion, so a bad set fails immediately rather than only once the remote asks for it. Adds the two new variants to ironrdp-activex's exhaustive match on Request, same treatment as the existing ClipboardGet/ClipboardSet arm (unavailable through the ActiveX automation surface). Adds wire round-trip and Debug-redaction test coverage for all four clipboard Request/Payload variants, including the two existing text ones that had none before. Behavior change: clipboard-get now prints (empty) if the last remote copy was an image rather than text, since local/remote content is a single logical item. Previously it always reflected the last text. Known limitation: FormatDataResponse does not carry a request-correlation ID, so a stale response to a superseded paste request (a second remote copy landing before the first paste response arrives) is fed through whatever PendingPaste variant is current at the time. The failure mode is graceful: the mismatched conversion (dib_to_png/dibv5_to_png on the wrong byte layout) returns an error and the response is dropped, not misinterpreted as valid data. cargo xtask check fmt/lints/tests/typos/locks all pass, including new wire round-trip and Debug-redaction coverage for both DIB and DIBV5 paths. Not yet verified against a live remote client; that check is still owed before merge.
Depends on Devolutions#1877 (clipboard image support), which this branch is stacked on: it introduces the ClipboardContent enum this PR extends with an Html variant. Diff is cumulative against master per the usual stacking note; the image-only diff is Devolutions#1877's own. Extends the daemon clipboard-get/clipboard-set operations to HTML fragments: clipboard-get-html prints the last HTML fragment received from the remote clipboard, clipboard-set-html sets one and advertises it to the remote as the registered HTML Format. Stores the fragment as plain text (not yet CF_HTML-wrapped) and converts at the point of use via ironrdp-cliprdr-format's existing plain_html_to_cf_html/cf_html_to_plain_html, so no new markup handling is needed here, mirroring the image PR's use of the crate's existing bitmap conversions. HTML Format is a registered, not fixed-ID, clipboard format: the offering side picks a private-range ID (0xC000 here) and pairs it with the name; the receiver learns the ID-to-name mapping from the FormatList. When receiving, matches the remote's offer by name and uses whatever ID it assigned, not the locally-chosen one, since those only apply to formats this backend itself offers. Extends the remote-copy priority order to image, then HTML, then text (richest representation first), and the PendingPaste tracking added in Devolutions#1877 with an Html variant so a returned FormatDataResponse is decoded correctly regardless of which of the three was requested. New Request::ClipboardGetHtml/ClipboardSetHtml and Payload::ClipboardHtml wire variants, bounded at 256 KiB in the CLI parser and on wire decode. Extends ironrdp-activex's exhaustive match on Request with the same treatment as the other clipboard operations. Extends the wire round-trip and Debug-redaction test coverage added in Devolutions#1877 to the two new variants. cargo xtask check fmt/lints/tests/typos/locks all pass. Not yet verified against a live remote client, same as Devolutions#1877.
Greg Lamberson (glamberson)
temporarily deployed
to
llm-providers
September 2, 2026 02:00 — with
GitHub Actions
Inactive
Benoît Cortier (CBenoit)
temporarily deployed
to
llm-providers
September 2, 2026 13:58 — with
GitHub Actions
Inactive
Contributor
|
Potential duplicate detected: #1877. Candidate Maintainer review is required. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Depends on #1877 (clipboard image support), which this branch is stacked on:
it introduces the ClipboardContent enum this PR extends with an Html
variant. Diff is cumulative against master per the usual stacking note; the
image-only diff is #1877's own.
Extends the daemon clipboard-get/clipboard-set operations to HTML fragments:
clipboard-get-html prints the last HTML fragment received from the remote
clipboard, clipboard-set-html sets one and advertises it to the remote as
the registered HTML Format.
Stores the fragment as plain text (not yet CF_HTML-wrapped) and converts at
the point of use via ironrdp-cliprdr-format's existing
plain_html_to_cf_html/cf_html_to_plain_html, so no new markup handling is
needed here, mirroring the image PR's use of the crate's existing bitmap
conversions.
HTML Format is a registered, not fixed-ID, clipboard format: the offering
side picks a private-range ID (0xC000 here) and pairs it with the name; the
receiver learns the ID-to-name mapping from the FormatList. When receiving,
matches the remote's offer by name and uses whatever ID it assigned, not the
locally-chosen one, since those only apply to formats this backend itself
offers.
Extends the remote-copy priority order to image, then HTML, then text
(richest representation first), and the PendingPaste tracking added in
#1877 with an Html variant so a returned FormatDataResponse is decoded
correctly regardless of which of the three was requested.
New Request::ClipboardGetHtml/ClipboardSetHtml and Payload::ClipboardHtml
wire variants, bounded at 256 KiB in the CLI parser and on wire decode.
Extends ironrdp-activex's exhaustive match on Request with the same
treatment as the other clipboard operations. Extends the wire round-trip
and Debug-redaction test coverage added in #1877 to the two new variants.
cargo xtask check fmt/lints/tests/typos/locks all pass. Not yet verified
against a live remote client, same as #1877.