├── .cargo └── config.toml ├── .gitattribute ├── .github ├── CODEOWNERS ├── dependabot.yml └── workflows │ ├── ci.yml │ ├── coverage.yml │ ├── fuzz.yml │ ├── npm-publish.yml │ ├── nuget-publish.yml │ └── release-crates.yml ├── .gitignore ├── ARCHITECTURE.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── STYLE.md ├── benches ├── Cargo.toml └── src │ └── perfenc.rs ├── cliff.toml ├── clippy.toml ├── crates ├── iron-remote-desktop │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── clipboard.rs │ │ ├── cursor.rs │ │ ├── desktop_size.rs │ │ ├── error.rs │ │ ├── extension.rs │ │ ├── input.rs │ │ ├── lib.rs │ │ └── session.rs ├── ironrdp-acceptor │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── channel_connection.rs │ │ ├── connection.rs │ │ ├── credssp.rs │ │ ├── finalization.rs │ │ ├── lib.rs │ │ └── util.rs ├── ironrdp-ainput │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ └── lib.rs ├── ironrdp-async │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── connector.rs │ │ ├── framed.rs │ │ ├── lib.rs │ │ └── session.rs ├── ironrdp-bench │ ├── Cargo.toml │ └── benches │ │ └── bench.rs ├── ironrdp-blocking │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── connector.rs │ │ ├── framed.rs │ │ ├── lib.rs │ │ └── session.rs ├── ironrdp-client-glutin │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── config.rs │ │ ├── gui.rs │ │ ├── gui │ │ └── input.rs │ │ └── main.rs ├── ironrdp-client │ ├── Cargo.toml │ ├── README.md │ └── src │ │ ├── app.rs │ │ ├── clipboard.rs │ │ ├── config.rs │ │ ├── lib.rs │ │ ├── main.rs │ │ ├── rdp.rs │ │ └── ws.rs ├── ironrdp-cliprdr-format │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── bitmap.rs │ │ ├── html.rs │ │ └── lib.rs ├── ironrdp-cliprdr-native │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── lib.rs │ │ ├── stub.rs │ │ ├── windows.rs │ │ └── windows │ │ ├── clipboard_data_ref.rs │ │ ├── clipboard_impl.rs │ │ ├── cliprdr_backend.rs │ │ ├── os_clipboard.rs │ │ ├── remote_format_registry.rs │ │ └── utils.rs ├── ironrdp-cliprdr │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── backend.rs │ │ ├── lib.rs │ │ └── pdu │ │ ├── capabilities.rs │ │ ├── client_temporary_directory.rs │ │ ├── file_contents.rs │ │ ├── format_data │ │ ├── file_list.rs │ │ ├── metafile.rs │ │ ├── mod.rs │ │ └── palette.rs │ │ ├── format_list.rs │ │ ├── lock.rs │ │ └── mod.rs ├── ironrdp-connector │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── channel_connection.rs │ │ ├── connection.rs │ │ ├── connection_activation.rs │ │ ├── connection_finalization.rs │ │ ├── credssp.rs │ │ ├── legacy.rs │ │ ├── lib.rs │ │ ├── license_exchange.rs │ │ ├── macros.rs │ │ └── server_name.rs ├── ironrdp-core │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── as_any.rs │ │ ├── cursor.rs │ │ ├── decode.rs │ │ ├── encode.rs │ │ ├── error.rs │ │ ├── into_owned.rs │ │ ├── lib.rs │ │ ├── macros.rs │ │ ├── padding.rs │ │ └── write_buf.rs ├── ironrdp-displaycontrol │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── client.rs │ │ ├── lib.rs │ │ ├── pdu │ │ └── mod.rs │ │ └── server.rs ├── ironrdp-dvc │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── client.rs │ │ ├── complete_data.rs │ │ ├── lib.rs │ │ ├── pdu.rs │ │ └── server.rs ├── ironrdp-error │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ └── lib.rs ├── ironrdp-futures │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ └── lib.rs ├── ironrdp-fuzzing │ ├── Cargo.toml │ └── src │ │ ├── generators │ │ └── mod.rs │ │ ├── lib.rs │ │ └── oracles │ │ └── mod.rs ├── ironrdp-glutin-renderer │ ├── Cargo.toml │ ├── shaders │ │ ├── avc.vert │ │ ├── avc420.frag │ │ ├── avc444.frag │ │ ├── avc444v2.frag │ │ ├── texture_shader.frag │ │ └── texture_shader.vert │ └── src │ │ ├── draw.rs │ │ ├── lib.rs │ │ ├── renderer.rs │ │ └── surface.rs ├── ironrdp-graphics │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── color_conversion.rs │ │ ├── diff.rs │ │ ├── dwt.rs │ │ ├── image_processing.rs │ │ ├── lib.rs │ │ ├── pointer.rs │ │ ├── quantization.rs │ │ ├── rdp6 │ │ ├── bitmap_stream │ │ │ ├── decoder.rs │ │ │ ├── encoder.rs │ │ │ └── mod.rs │ │ ├── mod.rs │ │ ├── rle.rs │ │ └── test_assets │ │ │ ├── 32x64_rgb_raw.bin │ │ │ ├── 32x64_rgb_raw.bmp │ │ │ ├── 64x24_argb_rle.bin │ │ │ ├── 64x24_argb_rle.bmp │ │ │ ├── 64x35_ycocg_rle_ss.bin │ │ │ ├── 64x35_ycocg_rle_ss.bmp │ │ │ ├── 64x64_aycocg_rle.bin │ │ │ ├── 64x64_aycocg_rle.bmp │ │ │ ├── 64x64_ycocg_raw_ss.bin │ │ │ ├── 64x64_ycocg_raw_ss.bmp │ │ │ ├── 64x64_ycocg_rle_ss.bin │ │ │ └── 64x64_ycocg_rle_ss.bmp │ │ ├── rectangle_processing.rs │ │ ├── rle.rs │ │ ├── rlgr.rs │ │ ├── subband_reconstruction.rs │ │ ├── utils.rs │ │ └── zgfx │ │ ├── circular_buffer.rs │ │ ├── control_messages.rs │ │ ├── mod.rs │ │ └── test_assets │ │ ├── decoded.0.bin │ │ ├── decoded.1.bin │ │ ├── decoded.2.bin │ │ ├── decoded.3.bin │ │ ├── decoded.4.bin │ │ ├── encoded.0.bin │ │ ├── encoded.1.bin │ │ ├── encoded.2.bin │ │ ├── encoded.3.bin │ │ └── encoded.4.bin ├── ironrdp-input │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ └── lib.rs ├── ironrdp-pdu-generators │ ├── Cargo.toml │ ├── README.md │ └── src │ │ └── lib.rs ├── ironrdp-pdu │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── basic_output.rs │ │ ├── basic_output │ │ ├── bitmap.rs │ │ ├── bitmap │ │ │ ├── rdp6.rs │ │ │ └── tests.rs │ │ ├── fast_path.rs │ │ ├── fast_path │ │ │ └── tests.rs │ │ ├── pointer.rs │ │ ├── surface_commands.rs │ │ └── surface_commands │ │ │ └── tests.rs │ │ ├── ber.rs │ │ ├── codecs.rs │ │ ├── codecs │ │ ├── rfx.rs │ │ └── rfx │ │ │ ├── data_messages.rs │ │ │ └── header_messages.rs │ │ ├── crypto.rs │ │ ├── crypto │ │ ├── rc4.rs │ │ └── rsa.rs │ │ ├── gcc.rs │ │ ├── gcc │ │ ├── cluster_data.rs │ │ ├── conference_create.rs │ │ ├── core_data.rs │ │ ├── core_data │ │ │ ├── client.rs │ │ │ └── server.rs │ │ ├── message_channel_data.rs │ │ ├── monitor_data.rs │ │ ├── monitor_extended_data.rs │ │ ├── multi_transport_channel_data.rs │ │ ├── network_data.rs │ │ └── security_data.rs │ │ ├── geometry.rs │ │ ├── input │ │ ├── fast_path.rs │ │ ├── mod.rs │ │ ├── mouse.rs │ │ ├── mouse_rel.rs │ │ ├── mouse_x.rs │ │ ├── scan_code.rs │ │ ├── sync.rs │ │ ├── unicode.rs │ │ └── unused.rs │ │ ├── lib.rs │ │ ├── macros.rs │ │ ├── mcs.rs │ │ ├── nego.rs │ │ ├── pcb.rs │ │ ├── per.rs │ │ ├── rdp.rs │ │ ├── rdp │ │ ├── capability_sets.rs │ │ ├── capability_sets │ │ │ ├── bitmap.rs │ │ │ ├── bitmap │ │ │ │ └── tests.rs │ │ │ ├── bitmap_cache.rs │ │ │ ├── bitmap_cache │ │ │ │ └── tests.rs │ │ │ ├── bitmap_codecs.rs │ │ │ ├── bitmap_codecs │ │ │ │ └── tests.rs │ │ │ ├── brush.rs │ │ │ ├── brush │ │ │ │ └── tests.rs │ │ │ ├── frame_acknowledge.rs │ │ │ ├── general.rs │ │ │ ├── general │ │ │ │ └── tests.rs │ │ │ ├── glyph_cache.rs │ │ │ ├── glyph_cache │ │ │ │ └── tests.rs │ │ │ ├── input.rs │ │ │ ├── input │ │ │ │ └── tests.rs │ │ │ ├── large_pointer.rs │ │ │ ├── multifragment_update.rs │ │ │ ├── offscreen_bitmap_cache.rs │ │ │ ├── offscreen_bitmap_cache │ │ │ │ └── tests.rs │ │ │ ├── order.rs │ │ │ ├── order │ │ │ │ └── tests.rs │ │ │ ├── pointer.rs │ │ │ ├── pointer │ │ │ │ └── tests.rs │ │ │ ├── sound.rs │ │ │ ├── sound │ │ │ │ └── tests.rs │ │ │ ├── surface_commands.rs │ │ │ ├── surface_commands │ │ │ │ └── tests.rs │ │ │ ├── virtual_channel.rs │ │ │ └── virtual_channel │ │ │ │ └── tests.rs │ │ ├── client_info.rs │ │ ├── finalization_messages.rs │ │ ├── headers.rs │ │ ├── refresh_rectangle.rs │ │ ├── server_error_info.rs │ │ ├── server_license.rs │ │ ├── server_license │ │ │ ├── client_license_info.rs │ │ │ ├── client_new_license_request.rs │ │ │ ├── client_new_license_request │ │ │ │ └── tests.rs │ │ │ ├── client_platform_challenge_response.rs │ │ │ ├── client_platform_challenge_response │ │ │ │ └── test.rs │ │ │ ├── licensing_error_message.rs │ │ │ ├── licensing_error_message │ │ │ │ └── test.rs │ │ │ ├── server_license_request.rs │ │ │ ├── server_license_request │ │ │ │ ├── cert.rs │ │ │ │ └── tests.rs │ │ │ ├── server_platform_challenge.rs │ │ │ ├── server_platform_challenge │ │ │ │ └── test.rs │ │ │ ├── server_upgrade_license.rs │ │ │ ├── server_upgrade_license │ │ │ │ └── tests.rs │ │ │ └── tests.rs │ │ ├── session_info.rs │ │ ├── session_info │ │ │ ├── logon_extended.rs │ │ │ ├── logon_info.rs │ │ │ └── tests.rs │ │ ├── suppress_output.rs │ │ ├── vc.rs │ │ └── vc │ │ │ ├── dvc.rs │ │ │ ├── dvc │ │ │ ├── gfx.rs │ │ │ └── gfx │ │ │ │ ├── graphics_messages.rs │ │ │ │ └── graphics_messages │ │ │ │ ├── avc_messages.rs │ │ │ │ ├── client.rs │ │ │ │ └── server.rs │ │ │ └── tests.rs │ │ ├── tpdu.rs │ │ ├── tpkt.rs │ │ ├── utf16.rs │ │ ├── utils.rs │ │ └── x224.rs ├── ironrdp-rdcleanpath │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ └── lib.rs ├── ironrdp-rdpdr-native │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── lib.rs │ │ └── nix │ │ ├── backend.rs │ │ └── mod.rs ├── ironrdp-rdpdr │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── backend │ │ ├── mod.rs │ │ └── noop.rs │ │ ├── lib.rs │ │ └── pdu │ │ ├── efs.rs │ │ ├── esc.rs │ │ ├── esc │ │ ├── ndr.rs │ │ └── rpce.rs │ │ └── mod.rs ├── ironrdp-rdpsnd-native │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ ├── examples │ │ └── cpal.rs │ └── src │ │ ├── cpal.rs │ │ └── lib.rs ├── ironrdp-rdpsnd │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── client.rs │ │ ├── lib.rs │ │ ├── pdu │ │ └── mod.rs │ │ └── server.rs ├── ironrdp-replay-client │ ├── Cargo.toml │ ├── README.md │ ├── scripts │ │ └── runtests.ps1 │ ├── src │ │ └── main.rs │ └── test_data │ │ ├── README.md │ │ ├── sample1_avc444.data │ │ ├── sample1_avc444v2.data │ │ ├── sample2_avc444.data │ │ └── sample2_avc444v2.data ├── ironrdp-server │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── builder.rs │ │ ├── capabilities.rs │ │ ├── clipboard.rs │ │ ├── display.rs │ │ ├── encoder │ │ ├── bitmap.rs │ │ ├── fast_path.rs │ │ ├── mod.rs │ │ └── rfx.rs │ │ ├── handler.rs │ │ ├── helper.rs │ │ ├── lib.rs │ │ ├── macros.rs │ │ ├── server.rs │ │ └── sound.rs ├── ironrdp-session-generators │ ├── Cargo.toml │ ├── README.md │ └── src │ │ └── lib.rs ├── ironrdp-session │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── active_stage.rs │ │ ├── fast_path.rs │ │ ├── image.rs │ │ ├── legacy.rs │ │ ├── lib.rs │ │ ├── macros.rs │ │ ├── pointer.rs │ │ ├── rfx.rs │ │ └── x224 │ │ └── mod.rs ├── ironrdp-svc │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ └── lib.rs ├── ironrdp-testsuite-core │ ├── Cargo.toml │ ├── src │ │ ├── capsets.rs │ │ ├── client_info.rs │ │ ├── cluster_data.rs │ │ ├── conference_create.rs │ │ ├── core_data.rs │ │ ├── gcc.rs │ │ ├── gfx.rs │ │ ├── graphics_messages.rs │ │ ├── lib.rs │ │ ├── macros.rs │ │ ├── mcs.rs │ │ ├── message_channel_data.rs │ │ ├── monitor_data.rs │ │ ├── monitor_extended_data.rs │ │ ├── multi_transport_channel_data.rs │ │ ├── network_data.rs │ │ ├── rdp.rs │ │ └── security_data.rs │ ├── test_data │ │ ├── fuzz_regression │ │ │ ├── channel_processing │ │ │ │ └── minimized-from-46dc7754493e2231055dddc1c56c88b4b38e7a6e │ │ │ ├── cliprdr_format │ │ │ │ ├── crash-0e7b5df5737a7ffc553c46c2425609f543b89498 │ │ │ │ ├── minimized-from-a587e617baf5354b27cf9e6cbe92dc5d1b5cab7b │ │ │ │ └── minimized-from-ae5d7850120bbeb84e519a5a0c29c2c93adddb80 │ │ │ └── pdu_decode │ │ │ │ ├── crash-384d5ec1d99a93a3a53d206c9f808490d9b33d48 │ │ │ │ ├── crash-3cf2ef026fc908048c16c4e816178b5b3002f7b1 │ │ │ │ ├── crash-43677392fa06dda5f014e42dd06c9ae05cd19469 │ │ │ │ ├── crash-4485719597c99b83b2b761e497d03bf062b2461b │ │ │ │ ├── crash-638bb782419774c536a3455183fdbf172e5b830b │ │ │ │ ├── crash-65a50aad850d86155cae8c4c28f2937812cce53e │ │ │ │ ├── crash-661a3fc68cec8096fb13ac76f3b50b85ad4c7ded │ │ │ │ ├── crash-801238c30741729c04951985d7ea1238e930bf80 │ │ │ │ ├── crash-93696ce8c9eec6824d9a3f99f960799d47b5d173 │ │ │ │ ├── crash-ce45f9ebf4ab1a51fcd0175952b22ab0fbcdc392 │ │ │ │ ├── crash-d58836860f9f3b70b3099cfbbed09f763d05eb4d │ │ │ │ └── crash-f8dc2df3f2aba63122b8912dff23e13210b408e9 │ │ ├── pdu │ │ │ ├── clipboard │ │ │ │ ├── cf_dib.pdu │ │ │ │ ├── cf_dibv5.pdu │ │ │ │ ├── cf_html.pdu │ │ │ │ ├── client_temp_dir.pdu │ │ │ │ ├── file_list.pdu │ │ │ │ ├── format_list.pdu │ │ │ │ ├── format_list_2.pdu │ │ │ │ ├── metafile.pdu │ │ │ │ └── palette.pdu │ │ │ └── pointer │ │ │ │ ├── cached_pointer.bin │ │ │ │ ├── color_pointer_16bpp.png │ │ │ │ ├── color_pointer_1bpp.png │ │ │ │ ├── color_pointer_24bpp.bin │ │ │ │ ├── color_pointer_24bpp.png │ │ │ │ ├── large_pointer_32bpp.bin │ │ │ │ ├── large_pointer_32bpp.png │ │ │ │ ├── new_pointer_32bpp.bin │ │ │ │ └── new_pointer_32bpp.png │ │ └── rle │ │ │ ├── tile-27019fd9f222cebce9dfebcddb12bfa0-compressed.bin │ │ │ ├── tile-27019fd9f222cebce9dfebcddb12bfa0-decompressed.bin │ │ │ ├── tile-284f668a9366a95e45f15b6bf634a633-compressed.bin │ │ │ ├── tile-284f668a9366a95e45f15b6bf634a633-decompressed.bin │ │ │ ├── tile-28c08e75c82ab598c5ab85d1bfc00253-compressed.bin │ │ │ ├── tile-28c08e75c82ab598c5ab85d1bfc00253-decompressed.bin │ │ │ ├── tile-2de3f3262a5eeecc3152552c178b782a-compressed.bin │ │ │ ├── tile-2de3f3262a5eeecc3152552c178b782a-decompressed.bin │ │ │ ├── tile-3fc8124af9be2fe88b445db60c36eddc-compressed.bin │ │ │ ├── tile-3fc8124af9be2fe88b445db60c36eddc-decompressed.bin │ │ │ ├── tile-4d75aa6a18c435c6230ba739b802a861-compressed.bin │ │ │ ├── tile-4d75aa6a18c435c6230ba739b802a861-decompressed.bin │ │ │ ├── tile-8b8ccc77526730d0cd8989901cc031ec-compressed.bin │ │ │ ├── tile-8b8ccc77526730d0cd8989901cc031ec-decompressed.bin │ │ │ ├── tile-94bb5b131eb3bc110905dfcb0f60da79-compressed.bin │ │ │ ├── tile-94bb5b131eb3bc110905dfcb0f60da79-decompressed.bin │ │ │ ├── tile-9b06660a1da806d2d48ce3f46b45d571-compressed.bin │ │ │ ├── tile-9b06660a1da806d2d48ce3f46b45d571-decompressed.bin │ │ │ ├── tile-a412fbe2b435ac627ce39048aa3d3fb3-compressed.bin │ │ │ ├── tile-a412fbe2b435ac627ce39048aa3d3fb3-decompressed.bin │ │ │ ├── tile-aa326e7a536cc8a0420c44bdf4ef8d97-compressed.bin │ │ │ ├── tile-aa326e7a536cc8a0420c44bdf4ef8d97-decompressed.bin │ │ │ ├── tile-fbcefc9af4db651aefd91bcabc8ea9fc-compressed.bin │ │ │ └── tile-fbcefc9af4db651aefd91bcabc8ea9fc-decompressed.bin │ └── tests │ │ ├── clipboard │ │ ├── format.rs │ │ └── mod.rs │ │ ├── displaycontrol │ │ └── mod.rs │ │ ├── dvc │ │ ├── capabilities.rs │ │ ├── close.rs │ │ ├── create.rs │ │ ├── data.rs │ │ ├── data_first.rs │ │ └── mod.rs │ │ ├── fuzz_regression.rs │ │ ├── graphics │ │ ├── color_conversion.rs │ │ ├── dwt.rs │ │ ├── image_processing.rs │ │ ├── mod.rs │ │ ├── rle.rs │ │ └── rlgr.rs │ │ ├── input │ │ ├── fastpath_packets.rs │ │ ├── mod.rs │ │ └── smoke.rs │ │ ├── main.rs │ │ ├── pcb.rs │ │ ├── pdu │ │ ├── gcc.rs │ │ ├── gfx.rs │ │ ├── input.rs │ │ ├── mcs.rs │ │ ├── mod.rs │ │ ├── pointer.rs │ │ ├── rdp.rs │ │ ├── rfx.rs │ │ └── x224.rs │ │ ├── rdcleanpath.rs │ │ ├── rdpsnd │ │ └── mod.rs │ │ ├── server │ │ ├── fast_path.rs │ │ └── mod.rs │ │ ├── server_name.rs │ │ └── session │ │ ├── mod.rs │ │ └── rfx.rs ├── ironrdp-testsuite-extra │ ├── Cargo.toml │ ├── src │ │ └── lib.rs │ └── tests │ │ ├── certs │ │ ├── Makefile │ │ ├── README.md │ │ ├── server-cert.pem │ │ └── server-key.pem │ │ └── tests.rs ├── ironrdp-tls │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── lib.rs │ │ ├── native_tls.rs │ │ ├── rustls.rs │ │ └── stub.rs ├── ironrdp-tokio │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ └── src │ │ ├── lib.rs │ │ └── reqwest.rs ├── ironrdp-web │ ├── .gitignore │ ├── Cargo.toml │ ├── README.md │ ├── rust-toolchain.toml │ └── src │ │ ├── canvas.rs │ │ ├── clipboard.rs │ │ ├── error.rs │ │ ├── image.rs │ │ ├── input.rs │ │ ├── lib.rs │ │ ├── network_client.rs │ │ ├── session.rs │ │ └── utils.rs └── ironrdp │ ├── CHANGELOG.md │ ├── Cargo.toml │ ├── LICENSE-APACHE │ ├── LICENSE-MIT │ ├── README.md │ ├── examples │ ├── screenshot.rs │ └── server.rs │ └── src │ └── lib.rs ├── ffi ├── Cargo.toml ├── README.md ├── build.rs ├── dotnet-interop-conf.toml ├── dotnet │ ├── .editorconfig │ ├── .gitignore │ ├── Devolutions.IronRdp.AvaloniaExample │ │ ├── .gitignore │ │ ├── App.axaml │ │ ├── App.axaml.cs │ │ ├── Devolutions.IronRdp.AvaloniaExample.csproj │ │ ├── Devolutions.IronRdp.AvaloniaExample.sln │ │ ├── KeyCodeMapper.cs │ │ ├── MainWindow.axaml │ │ ├── MainWindow.axaml.cs │ │ ├── Program.cs │ │ ├── app.manifest │ │ └── packages-microsoft-prod.deb │ ├── Devolutions.IronRdp.ConnectExample │ │ ├── .gitignore │ │ ├── Devolutions.IronRdp.ConnectExample.csproj │ │ ├── Devolutions.IronRdp.ConnectExample.sln │ │ └── Program.cs │ ├── Devolutions.IronRdp │ │ ├── .gitignore │ │ ├── Devolutions.IronRdp.Build.iOS.props │ │ ├── Devolutions.IronRdp.Build.props │ │ ├── Devolutions.IronRdp.csproj │ │ ├── Devolutions.IronRdp.iOS.props │ │ ├── Devolutions.IronRdp.targets │ │ ├── Generated │ │ │ ├── Action.cs │ │ │ ├── ActiveStage.cs │ │ │ ├── ActiveStageOutput.cs │ │ │ ├── ActiveStageOutputIterator.cs │ │ │ ├── ActiveStageOutputType.cs │ │ │ ├── BitmapConfig.cs │ │ │ ├── BytesSlice.cs │ │ │ ├── ChannelConnectionSequence.cs │ │ │ ├── Char.cs │ │ │ ├── ClientConnector.cs │ │ │ ├── ClientConnectorState.cs │ │ │ ├── ClientConnectorStateType.cs │ │ │ ├── ClientState.cs │ │ │ ├── ClipboardFormatId.cs │ │ │ ├── ClipboardFormatIterator.cs │ │ │ ├── ClipboardMessage.cs │ │ │ ├── ClipboardMessageType.cs │ │ │ ├── ClipboardSvgMessage.cs │ │ │ ├── Cliprdr.cs │ │ │ ├── CliprdrBackendFactory.cs │ │ │ ├── Config.cs │ │ │ ├── ConfigBuilder.cs │ │ │ ├── ConnectInitial.cs │ │ │ ├── ConnectionActivationSequence.cs │ │ │ ├── ConnectionActivationState.cs │ │ │ ├── ConnectionActivationStateCapabilitiesExchange.cs │ │ │ ├── ConnectionActivationStateConnectionFinalization.cs │ │ │ ├── ConnectionActivationStateFinalized.cs │ │ │ ├── ConnectionActivationStateType.cs │ │ │ ├── ConnectionResult.cs │ │ │ ├── CredsspProcessGenerator.cs │ │ │ ├── CredsspSequence.cs │ │ │ ├── CredsspSequenceInitResult.cs │ │ │ ├── DecodedImage.cs │ │ │ ├── DecodedPointer.cs │ │ │ ├── DesktopSize.cs │ │ │ ├── DiplomatRuntime.cs │ │ │ ├── DrdynvcChannel.cs │ │ │ ├── DynState.cs │ │ │ ├── FastPathInputEvent.cs │ │ │ ├── FastPathInputEventIterator.cs │ │ │ ├── FormatDataResponse.cs │ │ │ ├── GeneratorState.cs │ │ │ ├── GracefulDisconnectReason.cs │ │ │ ├── InclusiveRectangle.cs │ │ │ ├── InputDatabase.cs │ │ │ ├── IronRdpError.cs │ │ │ ├── IronRdpErrorKind.cs │ │ │ ├── IronRdpException.cs │ │ │ ├── IronRdpPdu.cs │ │ │ ├── KerberosConfig.cs │ │ │ ├── KeyboardType.cs │ │ │ ├── LicenseExchangeSequence.cs │ │ │ ├── Log.cs │ │ │ ├── MouseButton.cs │ │ │ ├── MouseButtonType.cs │ │ │ ├── MousePosition.cs │ │ │ ├── NetworkRequest.cs │ │ │ ├── NetworkRequestProtocol.cs │ │ │ ├── Operation.cs │ │ │ ├── OperationType.cs │ │ │ ├── OptionalUsize.cs │ │ │ ├── PduHint.cs │ │ │ ├── PduInfo.cs │ │ │ ├── PerformanceFlags.cs │ │ │ ├── PerformanceFlagsType.cs │ │ │ ├── PixelFormat.cs │ │ │ ├── Position.cs │ │ │ ├── RawAction.cs │ │ │ ├── RawActiveStage.cs │ │ │ ├── RawActiveStageOutput.cs │ │ │ ├── RawActiveStageOutputIterator.cs │ │ │ ├── RawActiveStageOutputType.cs │ │ │ ├── RawBitmapConfig.cs │ │ │ ├── RawBytesSlice.cs │ │ │ ├── RawChannelConnectionSequence.cs │ │ │ ├── RawChar.cs │ │ │ ├── RawClientConnector.cs │ │ │ ├── RawClientConnectorState.cs │ │ │ ├── RawClientConnectorStateType.cs │ │ │ ├── RawClientState.cs │ │ │ ├── RawClipboardFormatId.cs │ │ │ ├── RawClipboardFormatIterator.cs │ │ │ ├── RawClipboardMessage.cs │ │ │ ├── RawClipboardMessageType.cs │ │ │ ├── RawClipboardSvgMessage.cs │ │ │ ├── RawClipboardWindowsFfiResultBoxClipboardMessageBoxIronRdpError.cs │ │ │ ├── RawClipboardWindowsFfiResultBoxCliprdrBackendFactoryBoxIronRdpError.cs │ │ │ ├── RawClipboardWindowsFfiResultBoxWinCliprdrBoxIronRdpError.cs │ │ │ ├── RawClipboardWindowsFfiResultOptBoxClipboardMessageBoxIronRdpError.cs │ │ │ ├── RawCliprdr.cs │ │ │ ├── RawCliprdrBackendFactory.cs │ │ │ ├── RawConfig.cs │ │ │ ├── RawConfigBuilder.cs │ │ │ ├── RawConnectInitial.cs │ │ │ ├── RawConnectionActivationSequence.cs │ │ │ ├── RawConnectionActivationState.cs │ │ │ ├── RawConnectionActivationStateCapabilitiesExchange.cs │ │ │ ├── RawConnectionActivationStateConnectionFinalization.cs │ │ │ ├── RawConnectionActivationStateFinalized.cs │ │ │ ├── RawConnectionActivationStateType.cs │ │ │ ├── RawConnectionResult.cs │ │ │ ├── RawConnectorActivationFfiResultBoxConnectionActivationStateCapabilitiesExchangeBoxIronRdpError.cs │ │ │ ├── RawConnectorActivationFfiResultBoxConnectionActivationStateConnectionFinalizationBoxIronRdpError.cs │ │ │ ├── RawConnectorActivationFfiResultBoxConnectionActivationStateFinalizedBoxIronRdpError.cs │ │ │ ├── RawConnectorActivationFfiResultBoxWrittenBoxIronRdpError.cs │ │ │ ├── RawConnectorActivationFfiResultOptBoxPduHintBoxIronRdpError.cs │ │ │ ├── RawConnectorConfigFfiResultBoxConfigBoxIronRdpError.cs │ │ │ ├── RawConnectorFfiResultBoolBoxIronRdpError.cs │ │ │ ├── RawConnectorFfiResultBoxClientConnectorBoxIronRdpError.cs │ │ │ ├── RawConnectorFfiResultBoxClientConnectorStateBoxIronRdpError.cs │ │ │ ├── RawConnectorFfiResultBoxDynStateBoxIronRdpError.cs │ │ │ ├── RawConnectorFfiResultBoxOptionalUsizeBoxIronRdpError.cs │ │ │ ├── RawConnectorFfiResultBoxWrittenBoxIronRdpError.cs │ │ │ ├── RawConnectorFfiResultOptBoxPduHintBoxIronRdpError.cs │ │ │ ├── RawConnectorFfiResultVoidBoxIronRdpError.cs │ │ │ ├── RawConnectorResultFfiResultBoolBoxIronRdpError.cs │ │ │ ├── RawConnectorResultFfiResultBoxDesktopSizeBoxIronRdpError.cs │ │ │ ├── RawConnectorResultFfiResultU16BoxIronRdpError.cs │ │ │ ├── RawConnectorStateFfiResultBoxConnectInitialBoxIronRdpError.cs │ │ │ ├── RawConnectorStateFfiResultBoxConnectionActivationSequenceBoxIronRdpError.cs │ │ │ ├── RawConnectorStateFfiResultBoxConnectionResultBoxIronRdpError.cs │ │ │ ├── RawConnectorStateFfiResultBoxSecurityProtocolBoxIronRdpError.cs │ │ │ ├── RawConnectorStateFfiResultClientConnectorStateTypeBoxIronRdpError.cs │ │ │ ├── RawCredsspFfiResultBoxCredsspProcessGeneratorBoxIronRdpError.cs │ │ │ ├── RawCredsspFfiResultBoxCredsspSequenceBoxIronRdpError.cs │ │ │ ├── RawCredsspFfiResultBoxCredsspSequenceInitResultBoxIronRdpError.cs │ │ │ ├── RawCredsspFfiResultBoxTsRequestBoxIronRdpError.cs │ │ │ ├── RawCredsspFfiResultBoxWrittenBoxIronRdpError.cs │ │ │ ├── RawCredsspFfiResultOptBoxTsRequestBoxIronRdpError.cs │ │ │ ├── RawCredsspNetworkFfiResultBoxClientStateBoxIronRdpError.cs │ │ │ ├── RawCredsspNetworkFfiResultBoxGeneratorStateBoxIronRdpError.cs │ │ │ ├── RawCredsspNetworkFfiResultBoxTsRequestBoxIronRdpError.cs │ │ │ ├── RawCredsspNetworkFfiResultVoidBoxIronRdpError.cs │ │ │ ├── RawCredsspProcessGenerator.cs │ │ │ ├── RawCredsspSequence.cs │ │ │ ├── RawCredsspSequenceInitResult.cs │ │ │ ├── RawDecodedImage.cs │ │ │ ├── RawDecodedPointer.cs │ │ │ ├── RawDesktopSize.cs │ │ │ ├── RawDrdynvcChannel.cs │ │ │ ├── RawDynState.cs │ │ │ ├── RawFastPathInputEvent.cs │ │ │ ├── RawFastPathInputEventIterator.cs │ │ │ ├── RawFormatDataResponse.cs │ │ │ ├── RawGeneratorState.cs │ │ │ ├── RawGracefulDisconnectReason.cs │ │ │ ├── RawInclusiveRectangle.cs │ │ │ ├── RawInputDatabase.cs │ │ │ ├── RawInputFfiResultBoxCharBoxIronRdpError.cs │ │ │ ├── RawIronRdpError.cs │ │ │ ├── RawIronRdpErrorKind.cs │ │ │ ├── RawIronRdpPdu.cs │ │ │ ├── RawKerberosConfig.cs │ │ │ ├── RawKeyboardType.cs │ │ │ ├── RawLicenseExchangeSequence.cs │ │ │ ├── RawLog.cs │ │ │ ├── RawMouseButton.cs │ │ │ ├── RawMouseButtonType.cs │ │ │ ├── RawMousePosition.cs │ │ │ ├── RawNetworkRequest.cs │ │ │ ├── RawNetworkRequestProtocol.cs │ │ │ ├── RawOperation.cs │ │ │ ├── RawOperationType.cs │ │ │ ├── RawOptionalUsize.cs │ │ │ ├── RawPduFfiResultOptBoxPduInfoBoxIronRdpError.cs │ │ │ ├── RawPduFfiResultVoidBoxIronRdpError.cs │ │ │ ├── RawPduHint.cs │ │ │ ├── RawPduInfo.cs │ │ │ ├── RawPerformanceFlags.cs │ │ │ ├── RawPerformanceFlagsType.cs │ │ │ ├── RawPixelFormat.cs │ │ │ ├── RawPosition.cs │ │ │ ├── RawScancode.cs │ │ │ ├── RawSecurityProtocol.cs │ │ │ ├── RawSessionFfiResultBoxActiveStageBoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultBoxActiveStageOutputIteratorBoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultBoxBytesSliceBoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultBoxConnectionActivationSequenceBoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultBoxDecodedPointerBoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultBoxGracefulDisconnectReasonBoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultBoxInclusiveRectangleBoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultBoxVecU8BoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultOptBoxActiveStageOutputIteratorBoxIronRdpError.cs │ │ │ ├── RawSessionFfiResultPositionBoxIronRdpError.cs │ │ │ ├── RawStaticChannelSet.cs │ │ │ ├── RawTsRequest.cs │ │ │ ├── RawU32Slice.cs │ │ │ ├── RawUtilsFfiResultUsizeBoxIronRdpError.cs │ │ │ ├── RawUtilsFfiResultVoidBoxIronRdpError.cs │ │ │ ├── RawVecU8.cs │ │ │ ├── RawWheelRotations.cs │ │ │ ├── RawWinCliprdr.cs │ │ │ ├── RawWriteBuf.cs │ │ │ ├── RawWritten.cs │ │ │ ├── RawWrittenType.cs │ │ │ ├── Scancode.cs │ │ │ ├── SecurityProtocol.cs │ │ │ ├── StaticChannelSet.cs │ │ │ ├── TsRequest.cs │ │ │ ├── U32Slice.cs │ │ │ ├── VecU8.cs │ │ │ ├── WheelRotations.cs │ │ │ ├── WinCliprdr.cs │ │ │ ├── WriteBuf.cs │ │ │ ├── Written.cs │ │ │ └── WrittenType.cs │ │ ├── Info.plist │ │ └── src │ │ │ ├── ClientConnector.Addons.cs │ │ │ ├── Connection.cs │ │ │ ├── ConnectionActivationSequence.Addons.cs │ │ │ ├── Exceptions.cs │ │ │ ├── Framed.cs │ │ │ └── ISequence.cs │ └── IronRdp.sln └── src │ ├── clipboard │ ├── message.rs │ ├── mod.rs │ └── windows.rs │ ├── connector │ ├── activation.rs │ ├── config.rs │ ├── mod.rs │ ├── result.rs │ └── state.rs │ ├── credssp │ ├── mod.rs │ └── network.rs │ ├── dvc.rs │ ├── error.rs │ ├── graphics.rs │ ├── input.rs │ ├── lib.rs │ ├── log.rs │ ├── pdu.rs │ ├── session │ ├── image.rs │ └── mod.rs │ ├── svc.rs │ └── utils │ └── mod.rs ├── fuzz ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── fuzz_targets │ ├── bitmap_stream.rs │ ├── channel_processing.rs │ ├── cliprdr_format.rs │ ├── pdu_decoding.rs │ └── rle_decompression.rs └── rust-toolchain.toml ├── release-plz.toml ├── rust-toolchain.toml ├── rustfmt.toml ├── typos.toml ├── web-client ├── .gitignore ├── .prettierrc.yaml ├── README.md ├── iron-remote-desktop-rdp │ ├── .gitignore │ ├── .npmrc │ ├── .prettierignore │ ├── .prettierrc.yaml │ ├── README.md │ ├── eslint.config.mjs │ ├── package-lock.json │ ├── package.json │ ├── pre-build.js │ ├── public │ │ └── package.json │ ├── src │ │ ├── main.ts │ │ └── vite-env.d.ts │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts ├── iron-remote-desktop │ ├── .gitignore │ ├── .npmrc │ ├── .prettierignore │ ├── README.md │ ├── eslint.config.mjs │ ├── index.html │ ├── package-lock.json │ ├── package.json │ ├── public │ │ ├── package.json │ │ └── test.html │ ├── src │ │ ├── enums │ │ │ ├── LockKey.ts │ │ │ ├── LogType.ts │ │ │ ├── ModifierKey.ts │ │ │ ├── OS.ts │ │ │ ├── ScreenScale.ts │ │ │ ├── SessionEventType.ts │ │ │ └── SpecialCombination.ts │ │ ├── interfaces │ │ │ ├── ClipboardData.ts │ │ │ ├── ClipboardItem.ts │ │ │ ├── DesktopSize.ts │ │ │ ├── DeviceEvent.ts │ │ │ ├── Extension.ts │ │ │ ├── InputTransaction.ts │ │ │ ├── MousePosition.ts │ │ │ ├── NewSessionInfo.ts │ │ │ ├── RemoteDesktopModule.ts │ │ │ ├── ResizeEvent.ts │ │ │ ├── Session.ts │ │ │ ├── SessionBuilder.ts │ │ │ ├── SessionTerminationInfo.ts │ │ │ ├── UserInteraction.ts │ │ │ └── session-event.ts │ │ ├── iron-remote-desktop.svelte │ │ ├── lib │ │ │ └── scancodes.ts │ │ ├── main.ts │ │ ├── services │ │ │ ├── Config.ts │ │ │ ├── ConfigBuilder.ts │ │ │ ├── PublicAPI.ts │ │ │ ├── logging.service.ts │ │ │ └── remote-desktop.service.ts │ │ └── vite-env.d.ts │ ├── svelte.config.js │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts └── iron-svelte-client │ ├── .eslintignore │ ├── .eslintrc.yaml │ ├── .gitignore │ ├── .npmrc │ ├── .prettierignore │ ├── README.md │ ├── env.development │ ├── package-lock.json │ ├── package.json │ ├── pre-build.js │ ├── src │ ├── app.d.ts │ ├── app.html │ ├── lib │ │ ├── login │ │ │ ├── login-store.ts │ │ │ ├── login.css │ │ │ └── login.svelte │ │ ├── messages │ │ │ ├── message-store.ts │ │ │ └── message.svelte │ │ ├── popup-screen │ │ │ └── popup-screen.svelte │ │ └── remote-screen │ │ │ └── remote-screen.svelte │ ├── models │ │ └── session.ts │ ├── routes │ │ ├── +layout.ts │ │ ├── +page.svelte │ │ ├── popup-session │ │ │ └── +page.svelte │ │ └── session │ │ │ └── +page.svelte │ └── services │ │ └── session.service.ts │ ├── static │ ├── beercss │ │ ├── beer.min.css │ │ └── beer.min.js │ ├── crosshair.png │ ├── favicon.png │ ├── material-icons │ │ ├── LICENSE │ │ ├── filled.css │ │ ├── index.css │ │ ├── material-icons-outlined.woff2 │ │ ├── material-icons-round.woff2 │ │ ├── material-icons-sharp.woff2 │ │ ├── material-icons-two-tone.woff2 │ │ ├── material-icons.woff2 │ │ ├── outlined.css │ │ ├── round.css │ │ ├── sharp.css │ │ └── two-tone.css │ └── theme.css │ ├── svelte.config.js │ ├── tsconfig.json │ └── vite.config.ts └── xtask ├── Cargo.toml ├── README.md └── src ├── bin_install.rs ├── bin_version.rs ├── check.rs ├── clean.rs ├── cli.rs ├── cov.rs ├── ffi.rs ├── fuzz.rs ├── macros.rs ├── main.rs ├── prelude.rs ├── section.rs ├── wasm.rs └── web.rs /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [alias] 2 | xtask = "run --package xtask --" 3 | -------------------------------------------------------------------------------- /.gitattribute: -------------------------------------------------------------------------------- 1 | *.rs text eol=lf 2 | *.toml text eol=lf 3 | *.cs text eol=lf 4 | *.js text eol=lf 5 | *.ps1 text eol=lf 6 | *.sln text eol=crlf 7 | 8 | ffi/dotnet/Devolutions.IronRdp/Generated/** linguist-generated merge=binary -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # File auto-generated and managed by Devops 2 | /.github/ @devolutions/devops @devolutions/architecture-maintainers 3 | /.github/dependabot.yml @devolutions/security-managers 4 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "cargo" 4 | directories: 5 | - "/" 6 | - "/fuzz/" 7 | schedule: 8 | interval: "weekly" 9 | assignees: 10 | - "CBenoit" 11 | open-pull-requests-limit: 3 12 | groups: 13 | crypto: 14 | patterns: 15 | - "md-5" 16 | - "md5" 17 | - "sha1" 18 | - "pkcs1" 19 | - "x509-cert" 20 | - "der" 21 | - "*tls*" 22 | - "*rand*" 23 | patch: 24 | dependency-type: "production" 25 | update-types: 26 | - "patch" 27 | dev: 28 | dependency-type: "development" 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build artifacts 2 | /target 3 | /dependencies 4 | # Local cargo root 5 | /.cargo/local_root 6 | 7 | # Log files 8 | *.log 9 | 10 | # Coverage 11 | /docs/coverage 12 | 13 | # Editor/IDE files 14 | *~ 15 | /tags 16 | .idea 17 | .vscode 18 | .DS_Store 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sw? 23 | -------------------------------------------------------------------------------- /benches/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "benches" 3 | version = "0.0.0" 4 | description = "IronRDP benchmarks" 5 | publish = false 6 | edition.workspace = true 7 | 8 | [[bin]] 9 | name = "perfenc" 10 | path = "src/perfenc.rs" 11 | 12 | [dependencies] 13 | anyhow = "1.0.98" 14 | async-trait = "0.1.88" 15 | bytesize = "2.0.1" 16 | ironrdp = { path = "../crates/ironrdp", features = [ 17 | "server", 18 | "pdu", 19 | "__bench", 20 | ] } 21 | pico-args = "0.5.0" 22 | tokio = { version = "1", features = ["sync", "fs"] } 23 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 24 | tracing = { version = "0.1", features = ["log"] } 25 | 26 | [lints] 27 | workspace = true 28 | -------------------------------------------------------------------------------- /clippy.toml: -------------------------------------------------------------------------------- 1 | msrv = "1.75" 2 | semicolon-outside-block-ignore-multiline = true 3 | accept-comment-above-statement = true 4 | accept-comment-above-attributes = true 5 | -------------------------------------------------------------------------------- /crates/iron-remote-desktop/README.md: -------------------------------------------------------------------------------- 1 | # Iron Remote Desktop — Helper Crate 2 | 3 | Helper crate for building WASM modules compatible with the `iron-remote-desktop` WebComponent. 4 | 5 | Implement the `RemoteDesktopApi` trait on a Rust type, and call the `make_bridge!` on 6 | it to generate the WASM API that is expected by `iron-remote-desktop`. 7 | 8 | See the `ironrdp-web` crate in the repository to see how it is used in practice. 9 | -------------------------------------------------------------------------------- /crates/iron-remote-desktop/src/clipboard.rs: -------------------------------------------------------------------------------- 1 | use wasm_bindgen::JsValue; 2 | 3 | pub trait ClipboardData { 4 | type Item: ClipboardItem; 5 | 6 | fn create() -> Self; 7 | 8 | fn add_text(&mut self, mime_type: &str, text: &str); 9 | 10 | fn add_binary(&mut self, mime_type: &str, binary: &[u8]); 11 | 12 | fn items(&self) -> &[Self::Item]; 13 | 14 | fn is_empty(&self) -> bool { 15 | self.items().is_empty() 16 | } 17 | } 18 | 19 | pub trait ClipboardItem { 20 | fn mime_type(&self) -> &str; 21 | 22 | fn value(&self) -> impl Into; 23 | } 24 | -------------------------------------------------------------------------------- /crates/iron-remote-desktop/src/cursor.rs: -------------------------------------------------------------------------------- 1 | #[derive(Debug)] 2 | pub enum CursorStyle { 3 | Default, 4 | Hidden, 5 | Url { 6 | data: String, 7 | hotspot_x: u16, 8 | hotspot_y: u16, 9 | }, 10 | } 11 | -------------------------------------------------------------------------------- /crates/iron-remote-desktop/src/desktop_size.rs: -------------------------------------------------------------------------------- 1 | use wasm_bindgen::prelude::wasm_bindgen; 2 | 3 | #[wasm_bindgen] 4 | #[derive(Clone, Copy)] 5 | pub struct DesktopSize { 6 | pub width: u16, 7 | pub height: u16, 8 | } 9 | 10 | #[wasm_bindgen] 11 | impl DesktopSize { 12 | #[wasm_bindgen(constructor)] 13 | pub fn create(width: u16, height: u16) -> Self { 14 | DesktopSize { width, height } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /crates/iron-remote-desktop/src/error.rs: -------------------------------------------------------------------------------- 1 | use wasm_bindgen::prelude::*; 2 | 3 | pub trait IronError { 4 | fn backtrace(&self) -> String; 5 | 6 | fn kind(&self) -> IronErrorKind; 7 | } 8 | 9 | #[derive(Clone, Copy)] 10 | #[wasm_bindgen] 11 | pub enum IronErrorKind { 12 | /// Catch-all error kind 13 | General, 14 | /// Incorrect password used 15 | WrongPassword, 16 | /// Unable to login to machine 17 | LogonFailure, 18 | /// Insufficient permission, server denied access 19 | AccessDenied, 20 | /// Something wrong happened when sending or receiving the RDCleanPath message 21 | RDCleanPath, 22 | /// Couldn’t connect to proxy 23 | ProxyConnect, 24 | } 25 | -------------------------------------------------------------------------------- /crates/iron-remote-desktop/src/input.rs: -------------------------------------------------------------------------------- 1 | pub trait DeviceEvent { 2 | fn mouse_button_pressed(button: u8) -> Self; 3 | 4 | fn mouse_button_released(button: u8) -> Self; 5 | 6 | fn mouse_move(x: u16, y: u16) -> Self; 7 | 8 | fn wheel_rotations(vertical: bool, rotation_units: i16) -> Self; 9 | 10 | fn key_pressed(scancode: u16) -> Self; 11 | 12 | fn key_released(scancode: u16) -> Self; 13 | 14 | fn unicode_pressed(unicode: char) -> Self; 15 | 16 | fn unicode_released(unicode: char) -> Self; 17 | } 18 | 19 | pub trait InputTransaction { 20 | type DeviceEvent: DeviceEvent; 21 | 22 | fn create() -> Self; 23 | 24 | fn add_event(&mut self, event: Self::DeviceEvent); 25 | } 26 | -------------------------------------------------------------------------------- /crates/ironrdp-acceptor/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-acceptor" 3 | version = "0.5.0" 4 | readme = "README.md" 5 | description = "State machines to drive an RDP connection acceptance sequence" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-core = { path = "../ironrdp-core", version = "0.1", features = ["alloc"] } # public 20 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5" } # public 21 | ironrdp-svc = { path = "../ironrdp-svc", version = "0.4" } # public 22 | ironrdp-connector = { path = "../ironrdp-connector", version = "0.5" } # public 23 | ironrdp-async = { path = "../ironrdp-async", version = "0.5" } # public 24 | tracing = { version = "0.1", features = ["log"] } 25 | 26 | [lints] 27 | workspace = true 28 | 29 | -------------------------------------------------------------------------------- /crates/ironrdp-acceptor/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-acceptor/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-acceptor/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Acceptor 2 | 3 | State machines to drive an RDP connection acceptance sequence. 4 | 5 | For now, it requires the [Tokio runtime](https://tokio.rs/). 6 | 7 | This crate is part of the [IronRDP] project. 8 | 9 | [IronRDP]: https://github.com/Devolutions/IronRDP 10 | -------------------------------------------------------------------------------- /crates/ironrdp-ainput/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-ainput" 3 | version = "0.3.0" 4 | readme = "README.md" 5 | description = "AInput dynamic channel implementation" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-core = { path = "../ironrdp-core", version = "0.1" } # public 20 | ironrdp-dvc = { path = "../ironrdp-dvc", version = "0.3" } # public 21 | bitflags = "2.9" 22 | num-derive.workspace = true # TODO: remove 23 | num-traits.workspace = true # TODO: remove 24 | 25 | [lints] 26 | workspace = true 27 | 28 | -------------------------------------------------------------------------------- /crates/ironrdp-ainput/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-ainput/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-ainput/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP AInput 2 | 3 | Implements the "Advanced Input" dynamic channel as defined from [Freerdp][here]. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [here]: https://github.com/FreeRDP/FreeRDP/blob/master/include/freerdp/channels/ainput.h 8 | [IronRDP]: https://github.com/Devolutions/IronRDP 9 | -------------------------------------------------------------------------------- /crates/ironrdp-async/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-async" 3 | version = "0.5.0" 4 | readme = "README.md" 5 | description = "Provides `Future`s wrapping the IronRDP state machines conveniently" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-connector = { path = "../ironrdp-connector", version = "0.5" } # public 20 | ironrdp-core = { path = "../ironrdp-core", version = "0.1", features = ["alloc"] } # public 21 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5" } # public 22 | tracing = { version = "0.1", features = ["log"] } 23 | bytes = "1" # public 24 | 25 | [lints] 26 | workspace = true 27 | -------------------------------------------------------------------------------- /crates/ironrdp-async/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-async/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-async/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Async 2 | 3 | `Future`s built on top of `ironrdp-connector` and `ironrdp-session` crates. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-async/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | 4 | #[macro_use] 5 | extern crate tracing; 6 | 7 | pub use bytes; 8 | 9 | mod connector; 10 | mod framed; 11 | mod session; 12 | 13 | use core::future::Future; 14 | use core::pin::Pin; 15 | 16 | use ironrdp_connector::sspi::generator::NetworkRequest; 17 | use ironrdp_connector::ConnectorResult; 18 | 19 | pub use self::connector::*; 20 | pub use self::framed::*; 21 | // pub use self::session::*; 22 | 23 | pub trait AsyncNetworkClient { 24 | fn send<'a>( 25 | &'a mut self, 26 | network_request: &'a NetworkRequest, 27 | ) -> Pin>> + 'a>>; 28 | } 29 | -------------------------------------------------------------------------------- /crates/ironrdp-async/src/session.rs: -------------------------------------------------------------------------------- 1 | // TODO: active session async helpers 2 | -------------------------------------------------------------------------------- /crates/ironrdp-bench/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-bench" 3 | version = "0.0.0" 4 | description = "IronRDP benchmarks" 5 | edition.workspace = true 6 | publish = false 7 | 8 | [dev-dependencies] 9 | criterion = "0.5" 10 | ironrdp-graphics.path = "../ironrdp-graphics" 11 | ironrdp-pdu.path = "../ironrdp-pdu" 12 | ironrdp-server = { path = "../ironrdp-server", features = ["__bench"] } 13 | 14 | [[bench]] 15 | name = "bench" 16 | path = "benches/bench.rs" 17 | harness = false 18 | 19 | [lints] 20 | workspace = true 21 | -------------------------------------------------------------------------------- /crates/ironrdp-blocking/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-blocking" 3 | version = "0.5.0" 4 | readme = "README.md" 5 | description = "Blocking I/O abstraction wrapping the IronRDP state machines conveniently" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-connector = { path = "../ironrdp-connector", version = "0.5" } # public 20 | ironrdp-core = { path = "../ironrdp-core", version = "0.1", features = ["alloc"] } # public 21 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5" } # public 22 | tracing = { version = "0.1", features = ["log"] } 23 | bytes = "1" # public 24 | 25 | [lints] 26 | workspace = true 27 | 28 | -------------------------------------------------------------------------------- /crates/ironrdp-blocking/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-blocking/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-blocking/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Blocking 2 | 3 | Blocking I/O abstraction wrapping the IronRDP state machines conveniently. 4 | 5 | This crate is a higher level abstraction for IronRDP state machines using blocking I/O instead of 6 | asynchronous I/O. This results in a simpler API with fewer dependencies that may be used 7 | instead of `ironrdp-async` when concurrency is not a requirement. 8 | 9 | This crate is part of the [IronRDP] project. 10 | 11 | [IronRDP]: https://github.com/Devolutions/IronRDP 12 | -------------------------------------------------------------------------------- /crates/ironrdp-blocking/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | 4 | #[macro_use] 5 | extern crate tracing; 6 | 7 | mod connector; 8 | mod framed; 9 | mod session; 10 | 11 | pub use self::connector::*; 12 | pub use self::framed::*; 13 | -------------------------------------------------------------------------------- /crates/ironrdp-blocking/src/session.rs: -------------------------------------------------------------------------------- 1 | // TODO: active session I/O helpers? I’m not yet sure we need that 2 | -------------------------------------------------------------------------------- /crates/ironrdp-client-glutin/README.md: -------------------------------------------------------------------------------- 1 | # GUI client 2 | 3 | 1. An experimental GUI based of glutin and glow library. 4 | 2. Sample command to run the ui client: 5 | ``` 6 | cargo run --bin ironrdp-gui-client -- -u SimpleUsername -p SimplePassword! --avc444 --thin-client --small-cache --capabilities 0xf 192.168.1.100:3389 7 | ``` 8 | 3. If the GUI has artifacts it can be dumped to a file using the gfx_dump_file parameter. Later the ironrdp-replay-client binary can be used to debug and fix any issues 9 | in the renderer. 10 | 11 | This crate is part of the [IronRDP] project. 12 | 13 | [IronRDP]: https://github.com/Devolutions/IronRDP 14 | -------------------------------------------------------------------------------- /crates/ironrdp-client/src/clipboard.rs: -------------------------------------------------------------------------------- 1 | use ironrdp::cliprdr::backend::{ClipboardMessage, ClipboardMessageProxy}; 2 | use tokio::sync::mpsc; 3 | 4 | use crate::rdp::RdpInputEvent; 5 | 6 | /// Shim for sending and receiving CLIPRDR events as `RdpInputEvent` 7 | #[derive(Clone, Debug)] 8 | pub struct ClientClipboardMessageProxy { 9 | tx: mpsc::UnboundedSender, 10 | } 11 | 12 | impl ClientClipboardMessageProxy { 13 | pub fn new(tx: mpsc::UnboundedSender) -> Self { 14 | Self { tx } 15 | } 16 | } 17 | 18 | impl ClipboardMessageProxy for ClientClipboardMessageProxy { 19 | fn send_clipboard_message(&self, message: ClipboardMessage) { 20 | if self.tx.send(RdpInputEvent::Clipboard(message)).is_err() { 21 | error!("Failed to send os clipboard message, receiver is closed"); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /crates/ironrdp-client/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | #![allow(unused_crate_dependencies)] // false positives because there is both a library and a binary 4 | 5 | // No need to be as strict as in production libraries 6 | #![allow(clippy::arithmetic_side_effects)] 7 | #![allow(clippy::cast_lossless)] 8 | #![allow(clippy::cast_possible_truncation)] 9 | #![allow(clippy::cast_possible_wrap)] 10 | #![allow(clippy::cast_sign_loss)] 11 | 12 | #[macro_use] 13 | extern crate tracing; 14 | 15 | pub mod app; 16 | pub mod clipboard; 17 | pub mod config; 18 | pub mod rdp; 19 | 20 | mod ws; 21 | -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-format/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-cliprdr-format" 3 | version = "0.1.3" 4 | readme = "README.md" 5 | description = "CLIPRDR format conversion library" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-core = { path = "../ironrdp-core", version = "0.1" } # public 20 | thiserror = "1" # FIXME: handwrite the Error trait implementations. 21 | png = "0.17" 22 | 23 | [lints] 24 | workspace = true 25 | 26 | -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-format/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-format/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-format/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP CLIPRDR formats decoding/encoding library 2 | 3 | This Library provides the conversion logic between RDP-specific clipboard formats and 4 | widely used formats like PNG for images, plain string for HTML etc. 5 | 6 | ### Overflows 7 | 8 | This crate has been audited by us and is guaranteed overflow-free on 32 and 64 bits architectures. 9 | It would be easy to cause an overflow on a 16-bit architecture. 10 | However, it’s hard to imagine an RDP client running on such machines. 11 | Size of pointers on such architectures greatly limits the maximum size of the bitmap buffers. 12 | It’s likely the RDP client will choke on a big payload before overflowing because of this crate. 13 | 14 | This crate is part of the [IronRDP] project. 15 | 16 | [IronRDP]: https://github.com/Devolutions/IronRDP 17 | -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-format/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | 4 | pub mod bitmap; 5 | pub mod html; 6 | -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-native/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-native/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-native/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP CLIPRDR native backends 2 | 3 | Native CLIPRDR backend implementations. Currently only Windows is supported. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr-native/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | #![warn(unsafe_op_in_unsafe_fn)] 4 | #![warn(invalid_reference_casting)] 5 | #![warn(clippy::undocumented_unsafe_blocks)] 6 | #![warn(clippy::multiple_unsafe_ops_per_block)] 7 | #![warn(clippy::transmute_ptr_to_ptr)] 8 | #![warn(clippy::as_ptr_cast_mut)] 9 | #![warn(clippy::cast_ptr_alignment)] 10 | #![warn(clippy::fn_to_numeric_cast_any)] 11 | #![warn(clippy::ptr_cast_constness)] 12 | 13 | #[cfg(windows)] 14 | mod windows; 15 | #[cfg(windows)] 16 | pub use crate::windows::{WinClipboard, WinCliprdrError, WinCliprdrResult, HWND}; 17 | 18 | mod stub; 19 | pub use crate::stub::{StubClipboard, StubCliprdrBackend}; 20 | -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-cliprdr" 3 | version = "0.3.0" 4 | readme = "README.md" 5 | description = "CLIPRDR static channel for clipboard implemented as described in MS-RDPECLIP" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-core = { path = "../ironrdp-core", version = "0.1" } # public 20 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5" } # public 21 | ironrdp-svc = { path = "../ironrdp-svc", version = "0.4" } # public 22 | thiserror = "1.0" # FIXME: handwrite the Error trait implementations. 23 | tracing = { version = "0.1", features = ["log"] } 24 | bitflags = "2.9" 25 | 26 | [lints] 27 | workspace = true 28 | -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-cliprdr/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP CLIPRDR 2 | 3 | Implementation of clipboard static virtual channel(`CLIPRDR`) described in `MS-RDPECLIP` 4 | 5 | This library includes: 6 | - Clipboard SVC PDUs parsing 7 | - Clipboard SVC processing 8 | - Clipboard backend API types for implementing OS-specific clipboard logic 9 | 10 | For concrete native clipboard backend implementations, see `ironrdp-cliprdr-native` crate. 11 | 12 | This crate is part of the [IronRDP] project. 13 | 14 | [IronRDP]: https://github.com/Devolutions/IronRDP 15 | -------------------------------------------------------------------------------- /crates/ironrdp-connector/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-connector/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-connector/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Connector 2 | 3 | Abstract state machine to drive an RDP connection sequence. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-core/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-core" 3 | version = "0.1.5" 4 | readme = "README.md" 5 | description = "IronRDP common traits and types" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [features] 19 | default = [] 20 | std = ["alloc", "ironrdp-error/std"] 21 | alloc = ["ironrdp-error/alloc"] 22 | 23 | [dependencies] 24 | ironrdp-error = { path = "../ironrdp-error", version = "0.1" } # public 25 | -------------------------------------------------------------------------------- /crates/ironrdp-core/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-core/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-core/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Core 2 | 3 | IronRDP common traits and types. 4 | -------------------------------------------------------------------------------- /crates/ironrdp-core/src/as_any.rs: -------------------------------------------------------------------------------- 1 | use core::any::Any; 2 | 3 | /// Implement [`AsAny`] for the given type. 4 | #[macro_export] 5 | macro_rules! impl_as_any { 6 | ($t:ty) => { 7 | impl $crate::AsAny for $t { 8 | #[inline] 9 | fn as_any(&self) -> &dyn core::any::Any { 10 | self 11 | } 12 | 13 | #[inline] 14 | fn as_any_mut(&mut self) -> &mut dyn core::any::Any { 15 | self 16 | } 17 | } 18 | }; 19 | } 20 | 21 | /// Type information (`TypeId`) may be retrieved at runtime for this type. 22 | pub trait AsAny: 'static { 23 | /// Returns a reference to the type information for this type. 24 | fn as_any(&self) -> &dyn Any; 25 | 26 | /// Returns a mutable reference to the type information for this type. 27 | fn as_any_mut(&mut self) -> &mut dyn Any; 28 | } 29 | -------------------------------------------------------------------------------- /crates/ironrdp-core/src/into_owned.rs: -------------------------------------------------------------------------------- 1 | /// Used to produce an owned version of a given data. 2 | pub trait IntoOwned: Sized { 3 | /// The resulting type after obtaining ownership. 4 | type Owned: 'static; 5 | 6 | /// Creates owned data from data. 7 | fn into_owned(self) -> Self::Owned; 8 | } 9 | -------------------------------------------------------------------------------- /crates/ironrdp-core/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | #![cfg_attr(not(feature = "std"), no_std)] 4 | #![warn(clippy::std_instead_of_alloc)] 5 | #![warn(clippy::std_instead_of_core)] 6 | #![warn(missing_docs)] 7 | 8 | #[cfg(feature = "alloc")] 9 | extern crate alloc; 10 | 11 | #[macro_use] 12 | mod macros; 13 | 14 | mod as_any; 15 | mod cursor; 16 | mod decode; 17 | mod encode; 18 | mod error; 19 | mod into_owned; 20 | mod padding; 21 | #[cfg(feature = "alloc")] 22 | mod write_buf; 23 | 24 | // Flat API hierarchy of common traits and types 25 | 26 | pub use self::as_any::*; 27 | pub use self::cursor::*; 28 | pub use self::decode::*; 29 | pub use self::encode::*; 30 | pub use self::error::*; 31 | pub use self::into_owned::*; 32 | pub use self::padding::*; 33 | #[cfg(feature = "alloc")] 34 | pub use self::write_buf::*; 35 | -------------------------------------------------------------------------------- /crates/ironrdp-displaycontrol/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-displaycontrol" 3 | version = "0.3.0" 4 | readme = "README.md" 5 | description = "Display control dynamic channel extension implementation" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-core = { path = "../ironrdp-core", version = "0.1" } # public 20 | ironrdp-dvc = { path = "../ironrdp-dvc", version = "0.3" } # public 21 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5" } # public 22 | ironrdp-svc = { path = "../ironrdp-svc", version = "0.4" } # public 23 | tracing = { version = "0.1", features = ["log"] } 24 | 25 | [lints] 26 | workspace = true 27 | -------------------------------------------------------------------------------- /crates/ironrdp-displaycontrol/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-displaycontrol/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-displaycontrol/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Display Control Virtual Channel Extension [MS-RDPEDISP][1] implementation. 2 | 3 | Display Control Virtual Channel Extension [MS-RDPEDISP][1] implementation. 4 | 5 | This library includes: 6 | - Display Control DVC PDUs parsing 7 | - Display Control DVC processing (TODO) 8 | 9 | [1]: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpedisp/d2954508-f487-48bc-8731-39743e0854a9 -------------------------------------------------------------------------------- /crates/ironrdp-displaycontrol/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | 4 | pub const CHANNEL_NAME: &str = "Microsoft::Windows::RDS::DisplayControl"; 5 | 6 | pub mod client; 7 | pub mod pdu; 8 | pub mod server; 9 | -------------------------------------------------------------------------------- /crates/ironrdp-dvc/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-dvc" 3 | version = "0.3.0" 4 | readme = "README.md" 5 | description = "DRDYNVC static channel implementation and traits to implement dynamic virtual channels" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [features] 19 | default = [] 20 | std = [] 21 | 22 | [dependencies] 23 | ironrdp-core = { path = "../ironrdp-core", version = "0.1", features = ["alloc"] } # public 24 | ironrdp-svc = { path = "../ironrdp-svc", version = "0.4" } # public 25 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5", features = ["alloc"] } # public 26 | tracing = { version = "0.1", features = ["log"] } 27 | slab = "0.4" 28 | 29 | [lints] 30 | workspace = true 31 | -------------------------------------------------------------------------------- /crates/ironrdp-dvc/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-dvc/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-dvc/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP DVC 2 | 3 | RDP Dynamic Virtual Channel (DVC) support. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-error/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-error" 3 | version = "0.1.2" 4 | readme = "README.md" 5 | description = "IronPDU generic error definition" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [features] 19 | default = [] 20 | std = ["alloc"] 21 | alloc = [] 22 | 23 | [lints] 24 | workspace = true 25 | 26 | -------------------------------------------------------------------------------- /crates/ironrdp-error/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-error/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-error/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Error 2 | 3 | A lightweight and `no_std`-compatible generic `Error` type. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-futures/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | 9 | ## [[0.1.3](https://github.com/Devolutions/IronRDP/compare/ironrdp-futures-v0.1.2...ironrdp-futures-v0.1.3)] - 2025-03-12 10 | 11 | ### Build 12 | 13 | - Update dependencies (#695) ([c21fa44fd6](https://github.com/Devolutions/IronRDP/commit/c21fa44fd6f3c6a6b74788ff68e83133c1314caa)) 14 | 15 | 16 | ## [[0.1.2](https://github.com/Devolutions/IronRDP/compare/ironrdp-futures-v0.1.1...ironrdp-futures-v0.1.2)] - 2025-01-28 17 | 18 | ### Documentation 19 | 20 | - Use CDN URLs instead of the blob storage URLs for Devolutions logo (#631) ([dd249909a8](https://github.com/Devolutions/IronRDP/commit/dd249909a894004d4f728d30b3a4aa77a0f8193b)) 21 | 22 | 23 | -------------------------------------------------------------------------------- /crates/ironrdp-futures/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-futures" 3 | version = "0.3.0" 4 | readme = "README.md" 5 | description = "`Framed*` traits implementation above futures’s traits" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | futures-util = { version = "0.3", features = ["io"] } # public 20 | ironrdp-async = { path = "../ironrdp-async", version = "0.5" } # public 21 | bytes = "1" # public 22 | 23 | [lints] 24 | workspace = true 25 | 26 | -------------------------------------------------------------------------------- /crates/ironrdp-futures/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-futures/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-futures/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Futures 2 | 3 | `Framed*` traits implementation above `futures`’s traits. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-fuzzing/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-fuzzing" 3 | version = "0.0.0" 4 | edition = "2021" 5 | description = "Provides test case generators and oracles for use with IronRDP fuzzing" 6 | publish = false 7 | 8 | [lib] 9 | doctest = false 10 | test = false 11 | 12 | [dependencies] 13 | arbitrary = { version = "1", features = ["derive"] } 14 | ironrdp-core.path = "../ironrdp-core" 15 | ironrdp-graphics.path = "../ironrdp-graphics" 16 | ironrdp-pdu.path = "../ironrdp-pdu" 17 | ironrdp-cliprdr.path = "../ironrdp-cliprdr" 18 | ironrdp-rdpdr.path = "../ironrdp-rdpdr" 19 | ironrdp-rdpsnd.path = "../ironrdp-rdpsnd" 20 | ironrdp-cliprdr-format.path = "../ironrdp-cliprdr-format" 21 | ironrdp-displaycontrol.path = "../ironrdp-displaycontrol" 22 | ironrdp-svc.path = "../ironrdp-svc" 23 | 24 | [lints] 25 | workspace = true 26 | 27 | -------------------------------------------------------------------------------- /crates/ironrdp-fuzzing/src/generators/mod.rs: -------------------------------------------------------------------------------- 1 | //! Test case generators. 2 | //! 3 | //! Test case generators take raw, unstructured input from a fuzzer 4 | //! (e.g. libFuzzer) and translate that into a structured test case (e.g. a 5 | //! valid RDP PDU). 6 | //! 7 | //! These are generally implementations of the `Arbitrary` trait, or some 8 | //! wrapper over an external tool, such that the wrapper implements the 9 | //! `Arbitrary` trait for the wrapped external tool. 10 | 11 | #[derive(Arbitrary, Debug)] 12 | pub struct BitmapInput<'a> { 13 | pub src: &'a [u8], 14 | pub width: u8, 15 | pub height: u8, 16 | } 17 | -------------------------------------------------------------------------------- /crates/ironrdp-fuzzing/src/lib.rs: -------------------------------------------------------------------------------- 1 | // No need to be as strict as in production libraries 2 | #![allow(clippy::arithmetic_side_effects)] 3 | #![allow(clippy::cast_lossless)] 4 | #![allow(clippy::cast_possible_truncation)] 5 | #![allow(clippy::cast_possible_wrap)] 6 | #![allow(clippy::cast_sign_loss)] 7 | 8 | #[macro_use] 9 | extern crate arbitrary; 10 | 11 | pub mod generators; 12 | pub mod oracles; 13 | -------------------------------------------------------------------------------- /crates/ironrdp-glutin-renderer/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-glutin-renderer" 3 | version = "0.1.0" 4 | readme = "README.md" 5 | description = "`glutin` primitives for OpenGL rendering" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [dependencies] 15 | ironrdp.workspace = true 16 | tracing.workspace = true 17 | thiserror.workspace = true 18 | glow = "0.12" 19 | glutin = { version = "0.29" } 20 | openh264 = { version = "0.4" } 21 | 22 | [lints] 23 | workspace = true 24 | 25 | -------------------------------------------------------------------------------- /crates/ironrdp-glutin-renderer/shaders/avc.vert: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | 3 | uniform mat4 u_projection; 4 | attribute vec2 a_position; 5 | 6 | void main(){ 7 | gl_Position = u_projection * vec4(a_position, 0.0, 1.0); 8 | } -------------------------------------------------------------------------------- /crates/ironrdp-glutin-renderer/shaders/texture_shader.frag: -------------------------------------------------------------------------------- 1 | precision lowp float; 2 | 3 | varying vec2 v_texCoord; 4 | uniform sampler2D screen_texture; 5 | 6 | void main(void) { 7 | vec4 color = texture2D(screen_texture, v_texCoord); 8 | gl_FragColor = color; 9 | } -------------------------------------------------------------------------------- /crates/ironrdp-glutin-renderer/shaders/texture_shader.vert: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | 3 | attribute vec2 a_position; 4 | attribute vec2 a_tex_coord; 5 | varying vec2 v_texCoord; 6 | 7 | void main(){ 8 | v_texCoord = a_tex_coord; 9 | gl_Position = vec4(a_position, 0.0, 1.0); 10 | } -------------------------------------------------------------------------------- /crates/ironrdp-glutin-renderer/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc( 3 | html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg" 4 | )] 5 | 6 | #[macro_use] 7 | extern crate tracing; 8 | 9 | pub mod renderer; 10 | 11 | mod draw; 12 | mod surface; 13 | 14 | type Error = Box; 15 | type Result = std::result::Result; 16 | -------------------------------------------------------------------------------- /crates/ironrdp-graphics/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-graphics/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-graphics/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Graphics 2 | 3 | Image processing primitives and algorithms for RDP (ZGFX, DWT…). 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/mod.rs: -------------------------------------------------------------------------------- 1 | //! This module provides the RDP6 bitmap decoder implementation 2 | 3 | pub(crate) mod bitmap_stream; 4 | pub(crate) mod rle; 5 | 6 | pub use bitmap_stream::*; 7 | pub use rle::{RleDecodeError, RleEncodeError}; 8 | -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/32x64_rgb_raw.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/32x64_rgb_raw.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/32x64_rgb_raw.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/32x64_rgb_raw.bmp -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x24_argb_rle.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x24_argb_rle.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x24_argb_rle.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x24_argb_rle.bmp -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x35_ycocg_rle_ss.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x35_ycocg_rle_ss.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x35_ycocg_rle_ss.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x35_ycocg_rle_ss.bmp -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x64_aycocg_rle.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x64_aycocg_rle.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x64_aycocg_rle.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x64_aycocg_rle.bmp -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x64_ycocg_raw_ss.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x64_ycocg_raw_ss.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x64_ycocg_raw_ss.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x64_ycocg_raw_ss.bmp -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x64_ycocg_rle_ss.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x64_ycocg_rle_ss.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/rdp6/test_assets/64x64_ycocg_rle_ss.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/rdp6/test_assets/64x64_ycocg_rle_ss.bmp -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/decoded.0.bin: -------------------------------------------------------------------------------- 1 |  2 |  -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/decoded.1.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/zgfx/test_assets/decoded.1.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/decoded.2.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/zgfx/test_assets/decoded.2.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/decoded.3.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/zgfx/test_assets/decoded.3.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/decoded.4.bin: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/encoded.0.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/zgfx/test_assets/encoded.0.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/encoded.1.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/zgfx/test_assets/encoded.1.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/encoded.2.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/zgfx/test_assets/encoded.2.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/encoded.3.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/zgfx/test_assets/encoded.3.bin -------------------------------------------------------------------------------- /crates/ironrdp-graphics/src/zgfx/test_assets/encoded.4.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-graphics/src/zgfx/test_assets/encoded.4.bin -------------------------------------------------------------------------------- /crates/ironrdp-input/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-input" 3 | version = "0.3.0" 4 | readme = "README.md" 5 | description = "Utilities to manage and build RDP input packets" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5" } # public 20 | bitvec = "1.0" 21 | smallvec = "1.15" 22 | 23 | [lints] 24 | workspace = true 25 | 26 | -------------------------------------------------------------------------------- /crates/ironrdp-input/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-input/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-input/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Input 2 | 3 | Helpers to build RDP FastPathInput packets. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu-generators/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-pdu-generators" 3 | version = "0.0.0" 4 | description = "`proptest` generators for `ironrdp-pdu` types" 5 | publish = false 6 | edition.workspace = true 7 | 8 | [lib] 9 | doctest = false 10 | test = false 11 | 12 | [dependencies] 13 | # ironrdp-pdu.workspace = true 14 | # proptest.workspace = true 15 | 16 | [lints] 17 | workspace = true 18 | 19 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu-generators/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP PDU generators 2 | 3 | `proptest` generators for `ironrdp-pdu` types. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu-generators/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | // No need to be as strict as in production libraries 4 | #![allow(clippy::arithmetic_side_effects)] 5 | #![allow(clippy::cast_lossless)] 6 | #![allow(clippy::cast_possible_truncation)] 7 | #![allow(clippy::cast_possible_wrap)] 8 | #![allow(clippy::cast_sign_loss)] 9 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-pdu/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-pdu/src/basic_output.rs: -------------------------------------------------------------------------------- 1 | pub mod bitmap; 2 | pub mod fast_path; 3 | pub mod pointer; 4 | pub mod surface_commands; 5 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu/src/codecs.rs: -------------------------------------------------------------------------------- 1 | pub mod rfx; 2 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu/src/crypto.rs: -------------------------------------------------------------------------------- 1 | pub(crate) mod rc4; 2 | pub(crate) mod rsa; 3 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu/src/rdp/capability_sets/brush/tests.rs: -------------------------------------------------------------------------------- 1 | use ironrdp_core::{decode, encode_vec}; 2 | use lazy_static::lazy_static; 3 | 4 | use super::*; 5 | 6 | const BRUSH_BUFFER: [u8; 4] = [0x01, 0x00, 0x00, 0x00]; 7 | 8 | lazy_static! { 9 | pub static ref BRUSH: Brush = Brush { 10 | support_level: SupportLevel::Color8x8, 11 | }; 12 | } 13 | 14 | #[test] 15 | fn from_buffer_successfully_parses_brush_capset() { 16 | assert_eq!(*BRUSH, decode(BRUSH_BUFFER.as_ref()).unwrap()); 17 | } 18 | 19 | #[test] 20 | fn to_buffer_successfully_serializes_brush_capset() { 21 | let brush = BRUSH.clone(); 22 | 23 | let buffer = encode_vec(&brush).unwrap(); 24 | 25 | assert_eq!(buffer, BRUSH_BUFFER.as_ref()); 26 | } 27 | 28 | #[test] 29 | fn buffer_length_is_correct_for_input_capset() { 30 | assert_eq!(BRUSH_BUFFER.len(), BRUSH.size()); 31 | } 32 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu/src/rdp/capability_sets/sound/tests.rs: -------------------------------------------------------------------------------- 1 | use ironrdp_core::{decode, encode_vec}; 2 | use lazy_static::lazy_static; 3 | 4 | use super::*; 5 | 6 | const SOUND_BUFFER: [u8; 4] = [0x01, 0x00, 0x00, 0x00]; 7 | 8 | lazy_static! { 9 | pub static ref SOUND: Sound = Sound { 10 | flags: SoundFlags::BEEPS, 11 | }; 12 | } 13 | 14 | #[test] 15 | fn from_buffer_correctly_parses_sound_capset() { 16 | assert_eq!(*SOUND, decode(SOUND_BUFFER.as_ref()).unwrap()); 17 | } 18 | 19 | #[test] 20 | fn to_buffer_correctly_serializes_sound_capset() { 21 | let sound = SOUND.clone(); 22 | 23 | let buffer = encode_vec(&sound).unwrap(); 24 | 25 | assert_eq!(buffer, SOUND_BUFFER.as_ref()); 26 | } 27 | 28 | #[test] 29 | fn buffer_length_is_correct_for_sound_capset() { 30 | assert_eq!(SOUND.size(), SOUND_BUFFER.len()); 31 | } 32 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu/src/rdp/vc/dvc.rs: -------------------------------------------------------------------------------- 1 | pub mod gfx; 2 | -------------------------------------------------------------------------------- /crates/ironrdp-pdu/src/utf16.rs: -------------------------------------------------------------------------------- 1 | use std::string::FromUtf16Error; 2 | 3 | pub fn read_utf16_string(utf16_payload: &[u8], utf16_size_hint: Option) -> Result { 4 | let mut trimmed_utf16: Vec = if let Some(size_hint) = utf16_size_hint { 5 | Vec::with_capacity(size_hint) 6 | } else { 7 | Vec::with_capacity(utf16_payload.len() / 2) 8 | }; 9 | 10 | for chunk in utf16_payload.chunks_exact(2) { 11 | let code_unit = u16::from_le_bytes([chunk[0], chunk[1]]); 12 | 13 | // Stop reading at the null terminator 14 | if code_unit == 0 { 15 | break; 16 | } 17 | 18 | trimmed_utf16.push(code_unit); 19 | } 20 | 21 | String::from_utf16(&trimmed_utf16) 22 | } 23 | 24 | pub fn null_terminated_utf16_encoded_len(utf8: &str) -> usize { 25 | utf8.encode_utf16().count() * 2 + 2 26 | } 27 | -------------------------------------------------------------------------------- /crates/ironrdp-rdcleanpath/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | 9 | ## [[0.1.3](https://github.com/Devolutions/IronRDP/compare/ironrdp-rdcleanpath-v0.1.2...ironrdp-rdcleanpath-v0.1.3)] - 2025-03-12 10 | 11 | ### Build 12 | 13 | - Update dependencies (#695) ([c21fa44fd6](https://github.com/Devolutions/IronRDP/commit/c21fa44fd6f3c6a6b74788ff68e83133c1314caa)) 14 | 15 | ## [[0.1.2](https://github.com/Devolutions/IronRDP/compare/ironrdp-rdcleanpath-v0.1.1...ironrdp-rdcleanpath-v0.1.2)] - 2025-01-28 16 | 17 | ### Documentation 18 | 19 | - Use CDN URLs instead of the blob storage URLs for Devolutions logo (#631) ([dd249909a8](https://github.com/Devolutions/IronRDP/commit/dd249909a894004d4f728d30b3a4aa77a0f8193b)) 20 | 21 | 22 | -------------------------------------------------------------------------------- /crates/ironrdp-rdcleanpath/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-rdcleanpath" 3 | version = "0.1.3" 4 | readme = "README.md" 5 | description = "RDCleanPath PDU structure used by IronRDP web client and Devolutions Gateway" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | der = { version = "0.7", features = ["alloc", "derive"] } # public 20 | 21 | [lints] 22 | workspace = true 23 | 24 | -------------------------------------------------------------------------------- /crates/ironrdp-rdcleanpath/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-rdcleanpath/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-rdcleanpath/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP RDCleanPath 2 | 3 | RDCleanPath PDU structure used by IronRDP and Devolutions Gateway. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr-native/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | 9 | ## [[0.2.0](https://github.com/Devolutions/IronRDP/compare/ironrdp-rdpdr-native-v0.1.2...ironrdp-rdpdr-native-v0.2.0)] - 2025-03-12 10 | 11 | ### Build 12 | 13 | - Bump ironrdp-pdu 14 | 15 | 16 | 17 | ## [[0.1.2](https://github.com/Devolutions/IronRDP/compare/ironrdp-rdpdr-native-v0.1.1...ironrdp-rdpdr-native-v0.1.2)] - 2025-03-12 18 | 19 | ### Build 20 | 21 | - Update dependencies (#695) ([c21fa44fd6](https://github.com/Devolutions/IronRDP/commit/c21fa44fd6f3c6a6b74788ff68e83133c1314caa)) 22 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr-native/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-rdpdr-native" 3 | version = "0.3.0" 4 | readme = "README.md" 5 | description = "Native RDPDR static channel backend implementations for IronRDP" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [target.'cfg(any(target_os = "macos", target_os = "linux"))'.dependencies] 19 | ironrdp-core = { path = "../ironrdp-core", version = "0.1" } 20 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5" } # public 21 | ironrdp-svc = { path = "../ironrdp-svc", version = "0.4" } # public 22 | ironrdp-rdpdr = { path = "../ironrdp-rdpdr", version = "0.3" } # public 23 | nix = { version = "0.29", features = ["fs", "dir"] } 24 | tracing = { version = "0.1", features = ["log"] } 25 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr-native/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr-native/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr-native/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP RDPDR native backends 2 | 3 | Native RDPDR backend implementations. Currently only *nix systems are supported. -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr-native/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![warn(unsafe_op_in_unsafe_fn)] 3 | #![warn(invalid_reference_casting)] 4 | #![warn(clippy::undocumented_unsafe_blocks)] 5 | #![warn(clippy::multiple_unsafe_ops_per_block)] 6 | #![warn(clippy::transmute_ptr_to_ptr)] 7 | #![warn(clippy::as_ptr_cast_mut)] 8 | #![warn(clippy::cast_ptr_alignment)] 9 | #![warn(clippy::fn_to_numeric_cast_any)] 10 | #![warn(clippy::ptr_cast_constness)] 11 | 12 | #[cfg(any(target_os = "macos", target_os = "linux"))] 13 | #[macro_use] 14 | extern crate tracing; 15 | 16 | #[cfg(any(target_os = "macos", target_os = "linux"))] 17 | mod nix; 18 | #[cfg(any(target_os = "macos", target_os = "linux"))] 19 | pub use nix::backend; 20 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr-native/src/nix/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod backend; 2 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-rdpdr" 3 | version = "0.3.0" 4 | readme = "README.md" 5 | description = "RDPDR channel implementation." 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [dependencies] 19 | ironrdp-core = { path = "../ironrdp-core", version = "0.1" } # public 20 | ironrdp-error = { path = "../ironrdp-error", version = "0.1" } # public 21 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5" } # public 22 | ironrdp-svc = { path = "../ironrdp-svc", version = "0.4" } # public 23 | tracing = { version = "0.1", features = ["log"] } 24 | bitflags = "2.9" 25 | 26 | [lints] 27 | workspace = true 28 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP RDPDR 2 | 3 | Implements the RDPDR static virtual channel as described in 4 | [\[MS-RDPEFS\]: Remote Desktop Protocol: File System Virtual Channel Extension][spec] 5 | 6 | [spec]: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpefs/34d9de58-b2b5-40b6-b970-f82d4603bdb5 7 | 8 | This crate is part of the [IronRDP] project. 9 | 10 | [IronRDP]: https://github.com/Devolutions/IronRDP 11 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr/src/backend/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod noop; 2 | 3 | use core::fmt; 4 | 5 | use ironrdp_core::AsAny; 6 | use ironrdp_pdu::PduResult; 7 | use ironrdp_svc::SvcMessage; 8 | 9 | use crate::pdu::efs::{DeviceControlRequest, ServerDeviceAnnounceResponse, ServerDriveIoRequest}; 10 | use crate::pdu::esc::{ScardCall, ScardIoCtlCode}; 11 | 12 | /// OS-specific device redirection backend interface. 13 | pub trait RdpdrBackend: AsAny + fmt::Debug + Send { 14 | fn handle_server_device_announce_response(&mut self, pdu: ServerDeviceAnnounceResponse) -> PduResult<()>; 15 | fn handle_scard_call(&mut self, req: DeviceControlRequest, call: ScardCall) -> PduResult<()>; 16 | fn handle_drive_io_request(&mut self, req: ServerDriveIoRequest) -> PduResult>; 17 | } 18 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpdr/src/backend/noop.rs: -------------------------------------------------------------------------------- 1 | use ironrdp_core::impl_as_any; 2 | use ironrdp_pdu::PduResult; 3 | use ironrdp_svc::SvcMessage; 4 | 5 | use super::RdpdrBackend; 6 | use crate::pdu::efs::{DeviceControlRequest, ServerDeviceAnnounceResponse}; 7 | use crate::pdu::esc::{ScardCall, ScardIoCtlCode}; 8 | 9 | #[derive(Debug)] 10 | pub struct NoopRdpdrBackend; 11 | 12 | impl_as_any!(NoopRdpdrBackend); 13 | 14 | impl RdpdrBackend for NoopRdpdrBackend { 15 | fn handle_server_device_announce_response(&mut self, _pdu: ServerDeviceAnnounceResponse) -> PduResult<()> { 16 | Ok(()) 17 | } 18 | fn handle_scard_call(&mut self, _req: DeviceControlRequest, _call: ScardCall) -> PduResult<()> { 19 | Ok(()) 20 | } 21 | fn handle_drive_io_request(&mut self, _req: crate::pdu::efs::ServerDriveIoRequest) -> PduResult> { 22 | Ok(Vec::new()) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd-native/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-rdpsnd-native" 3 | version = "0.3.0" 4 | description = "Native RDPSND static channel backend implementations for IronRDP" 5 | edition.workspace = true 6 | license.workspace = true 7 | homepage.workspace = true 8 | repository.workspace = true 9 | authors.workspace = true 10 | keywords.workspace = true 11 | categories.workspace = true 12 | 13 | [lib] 14 | doctest = false 15 | test = false 16 | 17 | [features] 18 | default = ["opus"] 19 | opus = ["dep:opus", "dep:bytemuck"] 20 | 21 | [dependencies] 22 | anyhow = "1" 23 | bytemuck = { version = "1.21", optional = true } 24 | cpal = "0.15" 25 | ironrdp-rdpsnd = { path = "../ironrdp-rdpsnd", version = "0.5" } # public 26 | opus = { version = "0.3", optional = true } 27 | tracing = { version = "0.1", features = ["log"] } 28 | 29 | [dev-dependencies] 30 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 31 | 32 | [lints] 33 | workspace = true 34 | 35 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd-native/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd-native/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd-native/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP RDPSND native backends 2 | 3 | Native RDPSND backend implementations. 4 | 5 | Currently, only [CPAL] backend is supported. 6 | 7 | This crate is part of the [IronRDP] project. 8 | 9 | [CPAL]: https://github.com/rustaudio/cpal 10 | [IronRDP]: https://github.com/Devolutions/IronRDP 11 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd-native/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | 4 | #[cfg(test)] 5 | use tracing_subscriber as _; 6 | 7 | #[macro_use] 8 | extern crate tracing; 9 | 10 | pub mod cpal; 11 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-rdpsnd" 3 | version = "0.5.0" 4 | readme = "README.md" 5 | description = "RDPSND static channel for audio output implemented as described in MS-RDPEA" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [features] 19 | default = [] 20 | std = [] 21 | 22 | [dependencies] 23 | bitflags = "2.9" 24 | tracing = { version = "0.1", features = ["log"] } 25 | ironrdp-svc = { path = "../ironrdp-svc", version = "0.4" } # public 26 | ironrdp-core = { path = "../ironrdp-core", version = "0.1", features = ["alloc"] } 27 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5", features = ["alloc"] } # public 28 | 29 | [lints] 30 | workspace = true 31 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP RDPSND 2 | 3 | RDPSND static channel for audio output implemented as described in [MS-RDPEA]. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | [MS-RDPEA]: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpea/bea2d5cf-e3b9-4419-92e5-0e074ff9bc5b 9 | -------------------------------------------------------------------------------- /crates/ironrdp-rdpsnd/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | 4 | pub mod client; 5 | pub mod pdu; 6 | pub mod server; 7 | -------------------------------------------------------------------------------- /crates/ironrdp-replay-client/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-replay-client" 3 | version = "0.1.0" 4 | readme = "README.md" 5 | description = "Utility tool to replay RDP graphics pipeline for debugging purposes" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [dependencies] 15 | ironrdp.workspace = true 16 | ironrdp-glutin-renderer.workspace = true 17 | tracing.workspace = true 18 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 19 | clap = { version = "4.2", features = ["derive", "cargo"] } 20 | glutin = { version = "0.29" } 21 | 22 | [lints] 23 | workspace = true 24 | 25 | -------------------------------------------------------------------------------- /crates/ironrdp-replay-client/README.md: -------------------------------------------------------------------------------- 1 | Utility tool to parse data dumped through the RDP graphics pipeline and replay it. This tool is helpful to iterate and fix any issues in the rendering pipeline. 2 | 3 | This crate is part of the [IronRDP] project. 4 | 5 | [IronRDP]: https://github.com/Devolutions/IronRDP 6 | -------------------------------------------------------------------------------- /crates/ironrdp-replay-client/scripts/runtests.ps1: -------------------------------------------------------------------------------- 1 | cargo run --bin ironrdp-replay-client -- --close --frame-rate=30 --data-file $PSScriptRoot/../test_data/sample1_avc444.data && ` 2 | cargo run --bin ironrdp-replay-client -- --close --frame-rate=30 --data-file $PSScriptRoot/../test_data/sample2_avc444.data && ` 3 | cargo run --bin ironrdp-replay-client -- --close --frame-rate=30 --data-file $PSScriptRoot/../test_data/sample1_avc444v2.data && ` 4 | cargo run --bin ironrdp-replay-client -- --close --frame-rate=30 --data-file $PSScriptRoot/../test_data/sample2_avc444v2.data -------------------------------------------------------------------------------- /crates/ironrdp-replay-client/test_data/README.md: -------------------------------------------------------------------------------- 1 | Data generated using a custom parser and data file from [Here](https://github.com/microsoft/WindowsProtocolTestSuites/tree/main/TestSuites/RDP/Client/src/TestSuite/RDPEGFX/H264TestData) 2 | 3 | Some data generated using custom code in FreeRDP GFX pipeline to dump stream to file. -------------------------------------------------------------------------------- /crates/ironrdp-replay-client/test_data/sample1_avc444.data: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-replay-client/test_data/sample1_avc444.data -------------------------------------------------------------------------------- /crates/ironrdp-replay-client/test_data/sample1_avc444v2.data: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-replay-client/test_data/sample1_avc444v2.data -------------------------------------------------------------------------------- /crates/ironrdp-replay-client/test_data/sample2_avc444.data: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-replay-client/test_data/sample2_avc444.data -------------------------------------------------------------------------------- /crates/ironrdp-replay-client/test_data/sample2_avc444v2.data: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-replay-client/test_data/sample2_avc444v2.data -------------------------------------------------------------------------------- /crates/ironrdp-server/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-server/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-server/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Server 2 | 3 | Extendable skeleton for implementing custom RDP servers. 4 | 5 | For now, it requires the [Tokio runtime](https://tokio.rs/). 6 | 7 | --- 8 | 9 | The server currently supports: 10 | 11 | **Security** 12 | - Enhanced RDP Security with TLS External Security Protocols (TLS 1.2 and TLS 1.3) 13 | 14 | **Input** 15 | - FastPath input events 16 | - x224 input events and disconnect 17 | 18 | **Codecs** 19 | - bitmap display updates with RDP 6.0 compression 20 | 21 | --- 22 | 23 | Custom logic for your RDP server can be added by implementing these traits: 24 | - `RdpServerInputHandler` - callbacks used when the server receives input events from a client 25 | - `RdpServerDisplay` - notifies the server of display updates 26 | 27 | This crate is part of the [IronRDP] project. 28 | 29 | [IronRDP]: https://github.com/Devolutions/IronRDP 30 | -------------------------------------------------------------------------------- /crates/ironrdp-server/src/clipboard.rs: -------------------------------------------------------------------------------- 1 | use ironrdp_cliprdr::backend::CliprdrBackendFactory; 2 | 3 | use crate::ServerEventSender; 4 | 5 | pub trait CliprdrServerFactory: CliprdrBackendFactory + ServerEventSender {} 6 | -------------------------------------------------------------------------------- /crates/ironrdp-server/src/macros.rs: -------------------------------------------------------------------------------- 1 | macro_rules! time_warn { 2 | ($context:expr, $threshold_ms:expr, $op:expr) => {{ 3 | #[cold] 4 | fn warn_log(context: &str, duration: u128) { 5 | use ::core::sync::atomic::AtomicUsize; 6 | 7 | static COUNT: AtomicUsize = AtomicUsize::new(0); 8 | let current_count = COUNT.fetch_add(1, ::core::sync::atomic::Ordering::Relaxed); 9 | if current_count < 50 || current_count % 100 == 0 { 10 | ::tracing::warn!("{context} took {duration} ms! (count: {current_count})"); 11 | } 12 | } 13 | 14 | let start = std::time::Instant::now(); 15 | let result = $op; 16 | let duration = start.elapsed().as_millis(); 17 | if duration > $threshold_ms { 18 | warn_log($context, duration); 19 | } 20 | result 21 | }}; 22 | } 23 | 24 | pub(crate) use time_warn; 25 | -------------------------------------------------------------------------------- /crates/ironrdp-server/src/sound.rs: -------------------------------------------------------------------------------- 1 | pub use ironrdp_rdpsnd::server::{RdpsndServerHandler, RdpsndServerMessage}; 2 | 3 | use crate::ServerEventSender; 4 | 5 | pub trait SoundServerFactory: ServerEventSender { 6 | fn build_backend(&self) -> Box; 7 | } 8 | -------------------------------------------------------------------------------- /crates/ironrdp-session-generators/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-session-generators" 3 | version = "0.0.0" 4 | description = "`proptest` generators for `ironrdp-session` types" 5 | publish = false 6 | edition.workspace = true 7 | 8 | [lib] 9 | doctest = false 10 | test = false 11 | 12 | [dependencies] 13 | # ironrdp-session.workspace = true 14 | # ironrdp-pdu-generators.workspace = true 15 | # proptest.workspace = true 16 | 17 | [lints] 18 | workspace = true 19 | 20 | -------------------------------------------------------------------------------- /crates/ironrdp-session-generators/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP session generators 2 | 3 | `proptest` generators for `ironrdp-session` types. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-session-generators/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![doc = include_str!("../README.md")] 2 | #![doc(html_logo_url = "https://cdnweb.devolutions.net/images/projects/devolutions/logos/devolutions-icon-shadow.svg")] 3 | // No need to be as strict as in production libraries 4 | #![allow(clippy::arithmetic_side_effects)] 5 | #![allow(clippy::cast_lossless)] 6 | #![allow(clippy::cast_possible_truncation)] 7 | #![allow(clippy::cast_possible_wrap)] 8 | #![allow(clippy::cast_sign_loss)] 9 | -------------------------------------------------------------------------------- /crates/ironrdp-session/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-session/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-session/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Session 2 | 3 | Abstract state machine to drive an RDP session. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-session/src/pointer.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | use std::sync::Arc; 3 | 4 | use ironrdp_graphics::pointer::DecodedPointer; 5 | 6 | #[derive(Debug, Clone, Default)] 7 | pub struct PointerCache { 8 | // TODO(@pacancoder) maybe use Vec> instead? 9 | cache: HashMap>, 10 | } 11 | 12 | impl PointerCache { 13 | pub fn insert(&mut self, id: usize, pointer: Arc) -> Option> { 14 | self.cache.insert(id, pointer) 15 | } 16 | 17 | pub fn get(&self, id: usize) -> Option> { 18 | self.cache.get(&id).cloned() 19 | } 20 | 21 | pub fn is_cached(&self, id: usize) -> bool { 22 | self.cache.contains_key(&id) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /crates/ironrdp-svc/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-svc" 3 | version = "0.4.0" 4 | readme = "README.md" 5 | description = "IronRDP traits to implement RDP static virtual channels" 6 | edition.workspace = true 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [lib] 15 | doctest = false 16 | test = false 17 | 18 | [features] 19 | default = [] 20 | std = [] 21 | 22 | [dependencies] 23 | ironrdp-core = { path = "../ironrdp-core", version = "0.1" } # public 24 | ironrdp-pdu = { path = "../ironrdp-pdu", version = "0.5", features = ["alloc", "std"] } # public 25 | bitflags = "2.9" 26 | 27 | [lints] 28 | workspace = true 29 | 30 | -------------------------------------------------------------------------------- /crates/ironrdp-svc/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-svc/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-svc/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP SVC 2 | 3 | IronRDP traits to implement RDP static virtual channels. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/src/cluster_data.rs: -------------------------------------------------------------------------------- 1 | use ironrdp_pdu::gcc::{ClientClusterData, RedirectionFlags, RedirectionVersion}; 2 | 3 | pub const CLUSTER_DATA_BUFFER: [u8; 8] = [0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; 4 | 5 | lazy_static! { 6 | pub static ref CLUSTER_DATA: ClientClusterData = ClientClusterData { 7 | flags: RedirectionFlags::REDIRECTION_SUPPORTED, 8 | redirection_version: RedirectionVersion::V4, 9 | redirected_session_id: 0, 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/src/lib.rs: -------------------------------------------------------------------------------- 1 | // No need to be as strict as in production libraries 2 | #![allow(clippy::arithmetic_side_effects)] 3 | #![allow(clippy::cast_lossless)] 4 | #![allow(clippy::cast_possible_truncation)] 5 | #![allow(clippy::cast_possible_wrap)] 6 | #![allow(clippy::cast_sign_loss)] 7 | #![allow(unused_crate_dependencies)] 8 | 9 | #[macro_use] 10 | extern crate array_concat; 11 | #[macro_use] 12 | extern crate lazy_static; 13 | 14 | #[macro_use] 15 | mod macros; 16 | 17 | pub mod capsets; 18 | pub mod client_info; 19 | pub mod cluster_data; 20 | pub mod conference_create; 21 | pub mod core_data; 22 | pub mod gcc; 23 | pub mod gfx; 24 | pub mod graphics_messages; 25 | pub mod mcs; 26 | pub mod message_channel_data; 27 | pub mod monitor_data; 28 | pub mod monitor_extended_data; 29 | pub mod multi_transport_channel_data; 30 | pub mod network_data; 31 | pub mod rdp; 32 | pub mod security_data; 33 | 34 | #[doc(hidden)] 35 | pub use paste::paste; 36 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/src/message_channel_data.rs: -------------------------------------------------------------------------------- 1 | use ironrdp_pdu::gcc::ServerMessageChannelData; 2 | 3 | pub const SERVER_GCC_MESSAGE_CHANNEL_BLOCK_BUFFER: [u8; 2] = [0xf0, 0x03]; 4 | 5 | pub const SERVER_GCC_MESSAGE_CHANNEL_BLOCK: ServerMessageChannelData = ServerMessageChannelData { 6 | mcs_message_channel_id: 0x03f0, 7 | }; 8 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/src/multi_transport_channel_data.rs: -------------------------------------------------------------------------------- 1 | use ironrdp_pdu::gcc::{MultiTransportChannelData, MultiTransportFlags}; 2 | 3 | pub const SERVER_GCC_MULTI_TRANSPORT_CHANNEL_BLOCK_BUFFER: [u8; 4] = [0x01, 0x03, 0x00, 0x00]; 4 | 5 | lazy_static! { 6 | pub static ref SERVER_GCC_MULTI_TRANSPORT_CHANNEL_BLOCK: MultiTransportChannelData = MultiTransportChannelData { 7 | flags: MultiTransportFlags::TRANSPORT_TYPE_UDP_FECR 8 | | MultiTransportFlags::TRANSPORT_TYPE_UDP_PREFERRED 9 | | MultiTransportFlags::SOFT_SYNC_TCP_TO_UDP, 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/channel_processing/minimized-from-46dc7754493e2231055dddc1c56c88b4b38e7a6e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/channel_processing/minimized-from-46dc7754493e2231055dddc1c56c88b4b38e7a6e -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/cliprdr_format/crash-0e7b5df5737a7ffc553c46c2425609f543b89498: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/cliprdr_format/crash-0e7b5df5737a7ffc553c46c2425609f543b89498 -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/cliprdr_format/minimized-from-a587e617baf5354b27cf9e6cbe92dc5d1b5cab7b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/cliprdr_format/minimized-from-a587e617baf5354b27cf9e6cbe92dc5d1b5cab7b -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/cliprdr_format/minimized-from-ae5d7850120bbeb84e519a5a0c29c2c93adddb80: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/cliprdr_format/minimized-from-ae5d7850120bbeb84e519a5a0c29c2c93adddb80 -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-384d5ec1d99a93a3a53d206c9f808490d9b33d48: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-384d5ec1d99a93a3a53d206c9f808490d9b33d48 -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-3cf2ef026fc908048c16c4e816178b5b3002f7b1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-3cf2ef026fc908048c16c4e816178b5b3002f7b1 -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-43677392fa06dda5f014e42dd06c9ae05cd19469: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-43677392fa06dda5f014e42dd06c9ae05cd19469 -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-4485719597c99b83b2b761e497d03bf062b2461b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-4485719597c99b83b2b761e497d03bf062b2461b -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-638bb782419774c536a3455183fdbf172e5b830b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-638bb782419774c536a3455183fdbf172e5b830b -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-65a50aad850d86155cae8c4c28f2937812cce53e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-65a50aad850d86155cae8c4c28f2937812cce53e -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-661a3fc68cec8096fb13ac76f3b50b85ad4c7ded: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-661a3fc68cec8096fb13ac76f3b50b85ad4c7ded -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-801238c30741729c04951985d7ea1238e930bf80: -------------------------------------------------------------------------------- 1 |   -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-93696ce8c9eec6824d9a3f99f960799d47b5d173: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-93696ce8c9eec6824d9a3f99f960799d47b5d173 -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-ce45f9ebf4ab1a51fcd0175952b22ab0fbcdc392: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-ce45f9ebf4ab1a51fcd0175952b22ab0fbcdc392 -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-d58836860f9f3b70b3099cfbbed09f763d05eb4d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-d58836860f9f3b70b3099cfbbed09f763d05eb4d -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-f8dc2df3f2aba63122b8912dff23e13210b408e9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/fuzz_regression/pdu_decode/crash-f8dc2df3f2aba63122b8912dff23e13210b408e9 -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/cf_dib.pdu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/clipboard/cf_dib.pdu -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/cf_dibv5.pdu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/clipboard/cf_dibv5.pdu -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/cf_html.pdu: -------------------------------------------------------------------------------- 1 | Version:0.9 2 | StartHTML:00000162 3 | EndHTML:00000891 4 | StartFragment:00000196 5 | EndFragment:00000855 6 | SourceURL:https://en.wikipedia.org/wiki/Remote_Desktop_Protocol 7 | 8 | Remote Desktop Protocol (RDP) is a proprietary protocol developed by Microsoft Corporation which provides a user with a graphical interface to connect to another computer over a network connection.[1] 9 | 10 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/client_temp_dir.pdu: -------------------------------------------------------------------------------- 1 | C:\DOCUME~1\ELTONS~1.NTD\LOCALS~1\Temp\cdepotslhrdp_1\_TSABD.tmp -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/file_list.pdu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/clipboard/file_list.pdu -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/format_list.pdu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/clipboard/format_list.pdu -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/format_list_2.pdu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/clipboard/format_list_2.pdu -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/metafile.pdu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/clipboard/metafile.pdu -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/clipboard/palette.pdu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/clipboard/palette.pdu -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/cached_pointer.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/color_pointer_16bpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/pointer/color_pointer_16bpp.png -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/color_pointer_1bpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/pointer/color_pointer_1bpp.png -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/color_pointer_24bpp.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/pointer/color_pointer_24bpp.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/color_pointer_24bpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/pointer/color_pointer_24bpp.png -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/large_pointer_32bpp.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/pointer/large_pointer_32bpp.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/large_pointer_32bpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/pointer/large_pointer_32bpp.png -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/new_pointer_32bpp.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/pointer/new_pointer_32bpp.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/pdu/pointer/new_pointer_32bpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/pdu/pointer/new_pointer_32bpp.png -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-27019fd9f222cebce9dfebcddb12bfa0-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-27019fd9f222cebce9dfebcddb12bfa0-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-27019fd9f222cebce9dfebcddb12bfa0-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-27019fd9f222cebce9dfebcddb12bfa0-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-284f668a9366a95e45f15b6bf634a633-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-284f668a9366a95e45f15b6bf634a633-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-284f668a9366a95e45f15b6bf634a633-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-284f668a9366a95e45f15b6bf634a633-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-28c08e75c82ab598c5ab85d1bfc00253-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-28c08e75c82ab598c5ab85d1bfc00253-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-28c08e75c82ab598c5ab85d1bfc00253-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-28c08e75c82ab598c5ab85d1bfc00253-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-2de3f3262a5eeecc3152552c178b782a-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-2de3f3262a5eeecc3152552c178b782a-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-2de3f3262a5eeecc3152552c178b782a-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-2de3f3262a5eeecc3152552c178b782a-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-3fc8124af9be2fe88b445db60c36eddc-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-3fc8124af9be2fe88b445db60c36eddc-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-3fc8124af9be2fe88b445db60c36eddc-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-3fc8124af9be2fe88b445db60c36eddc-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-4d75aa6a18c435c6230ba739b802a861-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-4d75aa6a18c435c6230ba739b802a861-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-4d75aa6a18c435c6230ba739b802a861-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-4d75aa6a18c435c6230ba739b802a861-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-8b8ccc77526730d0cd8989901cc031ec-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-8b8ccc77526730d0cd8989901cc031ec-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-8b8ccc77526730d0cd8989901cc031ec-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-8b8ccc77526730d0cd8989901cc031ec-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-94bb5b131eb3bc110905dfcb0f60da79-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-94bb5b131eb3bc110905dfcb0f60da79-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-94bb5b131eb3bc110905dfcb0f60da79-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-94bb5b131eb3bc110905dfcb0f60da79-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-9b06660a1da806d2d48ce3f46b45d571-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-9b06660a1da806d2d48ce3f46b45d571-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-9b06660a1da806d2d48ce3f46b45d571-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-9b06660a1da806d2d48ce3f46b45d571-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-a412fbe2b435ac627ce39048aa3d3fb3-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-a412fbe2b435ac627ce39048aa3d3fb3-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-a412fbe2b435ac627ce39048aa3d3fb3-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-a412fbe2b435ac627ce39048aa3d3fb3-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-aa326e7a536cc8a0420c44bdf4ef8d97-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-aa326e7a536cc8a0420c44bdf4ef8d97-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-fbcefc9af4db651aefd91bcabc8ea9fc-compressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-fbcefc9af4db651aefd91bcabc8ea9fc-compressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/test_data/rle/tile-fbcefc9af4db651aefd91bcabc8ea9fc-decompressed.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/crates/ironrdp-testsuite-core/test_data/rle/tile-fbcefc9af4db651aefd91bcabc8ea9fc-decompressed.bin -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/dvc/close.rs: -------------------------------------------------------------------------------- 1 | use super::*; 2 | 3 | const CHANNEL_ID: u32 = 0x0303; 4 | const ENCODED: [u8; 3] = [0x41, 0x03, 0x03]; 5 | 6 | static DECODED_CLIENT: OnceLock = OnceLock::new(); 7 | static DECODED_SERVER: OnceLock = OnceLock::new(); 8 | 9 | fn decoded_client() -> &'static DrdynvcClientPdu { 10 | DECODED_CLIENT.get_or_init(|| DrdynvcClientPdu::Close(ClosePdu::new(CHANNEL_ID).with_cb_id_type(FieldType::U16))) 11 | } 12 | 13 | fn decoded_server() -> &'static DrdynvcServerPdu { 14 | DECODED_SERVER.get_or_init(|| DrdynvcServerPdu::Close(ClosePdu::new(CHANNEL_ID).with_cb_id_type(FieldType::U16))) 15 | } 16 | 17 | #[test] 18 | fn decodes_close() { 19 | test_decodes(&ENCODED, decoded_client()); 20 | test_decodes(&ENCODED, decoded_server()); 21 | } 22 | 23 | #[test] 24 | fn encodes_close() { 25 | test_encodes(decoded_client(), &ENCODED); 26 | test_encodes(decoded_server(), &ENCODED); 27 | } 28 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/fuzz_regression.rs: -------------------------------------------------------------------------------- 1 | macro_rules! check { 2 | ($oracle:ident) => {{ 3 | use ironrdp_fuzzing::oracles; 4 | 5 | const REGRESSION_DATA_FOLDER: &str = concat!( 6 | env!("CARGO_MANIFEST_DIR"), 7 | concat!("/test_data/fuzz_regression/", stringify!($oracle)) 8 | ); 9 | 10 | println!("Read directory {REGRESSION_DATA_FOLDER}"); 11 | for entry in std::fs::read_dir(REGRESSION_DATA_FOLDER).unwrap() { 12 | let entry = entry.unwrap(); 13 | println!("Check {}", entry.path().display()); 14 | let test_case = std::fs::read(entry.path()).unwrap(); 15 | oracles::$oracle(&test_case); 16 | } 17 | }}; 18 | } 19 | 20 | #[test] 21 | fn check_pdu_decode() { 22 | check!(pdu_decode); 23 | } 24 | 25 | #[test] 26 | fn check_cliprdr_format() { 27 | check!(cliprdr_format); 28 | } 29 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/graphics/mod.rs: -------------------------------------------------------------------------------- 1 | mod color_conversion; 2 | mod dwt; 3 | mod image_processing; 4 | mod rle; 5 | mod rlgr; 6 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/input/mod.rs: -------------------------------------------------------------------------------- 1 | mod fastpath_packets; 2 | mod smoke; 3 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/main.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused_crate_dependencies)] // false positives because there is both a library and a binary 2 | 3 | //! Integration Tests (IT) 4 | //! 5 | //! Integration tests are all contained in this single crate, and organized in modules. 6 | //! This is to prevent `rustc` to re-link the library crates with each of the integration 7 | //! tests (one for each *.rs file / test crate under the `tests/` folder). 8 | //! Performance implication: https://github.com/rust-lang/cargo/pull/5022#issuecomment-364691154 9 | //! 10 | //! This is also good for execution performance. 11 | //! Cargo will run all tests from a single binary in parallel, but 12 | //! binaries themselves are run sequentially. 13 | 14 | mod clipboard; 15 | mod displaycontrol; 16 | mod dvc; 17 | mod fuzz_regression; 18 | mod graphics; 19 | mod input; 20 | mod pcb; 21 | mod pdu; 22 | mod rdcleanpath; 23 | mod rdpsnd; 24 | mod server; 25 | mod server_name; 26 | mod session; 27 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/pdu/mod.rs: -------------------------------------------------------------------------------- 1 | mod gcc; 2 | mod gfx; 3 | mod input; 4 | mod mcs; 5 | mod pointer; 6 | mod rdp; 7 | mod rfx; 8 | mod x224; 9 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/server/fast_path.rs: -------------------------------------------------------------------------------- 1 | ../../../ironrdp-server/src/encoder/fast_path.rs -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/server/mod.rs: -------------------------------------------------------------------------------- 1 | mod fast_path; 2 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/server_name.rs: -------------------------------------------------------------------------------- 1 | use ironrdp_connector::ServerName; 2 | use rstest::rstest; 3 | 4 | #[rstest] 5 | #[case("somehostname:2345", "somehostname")] 6 | #[case("192.168.56.101:2345", "192.168.56.101")] 7 | #[case("[2001:db8::8a2e:370:7334]:7171", "2001:db8::8a2e:370:7334")] 8 | #[case("[2001:0db8:0000:0000:0000:8a2e:0370:7334]:433", "2001:db8::8a2e:370:7334")] 9 | #[case("[::1]:2222", "::1")] 10 | fn input_with_port_is_sanitized(#[case] input: &str, #[case] expected: &str) { 11 | let result = ServerName::new(input).into_inner(); 12 | assert_eq!(result, expected); 13 | } 14 | 15 | #[rstest] 16 | #[case("somehostname")] 17 | #[case("192.168.56.101")] 18 | #[case("2001:db8::8a2e:370:7334")] 19 | #[case("2001:0db8:0000:0000:0000:8a2e:0370:7334")] 20 | #[case("::1")] 21 | fn input_without_port_is_left_untouched(#[case] input: &str) { 22 | let result = ServerName::new(input).into_inner(); 23 | assert_eq!(result, input); 24 | } 25 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-core/tests/session/mod.rs: -------------------------------------------------------------------------------- 1 | mod rfx; 2 | 3 | #[cfg(test)] 4 | mod tests { 5 | use ironrdp_pdu::rdp::capability_sets::{client_codecs_capabilities, CodecProperty}; 6 | 7 | #[test] 8 | fn test_codecs_capabilities() { 9 | let config = &[]; 10 | let _capabilities = client_codecs_capabilities(config).unwrap(); 11 | 12 | let config = &["badcodec"]; 13 | assert!(client_codecs_capabilities(config).is_err()); 14 | 15 | let config = &["remotefx:on"]; 16 | let capabilities = client_codecs_capabilities(config).unwrap(); 17 | assert_eq!(capabilities.0.len(), 1); 18 | assert!(matches!(capabilities.0[0].property, CodecProperty::RemoteFx(_))); 19 | 20 | let config = &["remotefx:off"]; 21 | let capabilities = client_codecs_capabilities(config).unwrap(); 22 | assert_eq!(capabilities.0.len(), 0); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-extra/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ironrdp-testsuite-extra" 3 | version = "0.1.0" 4 | edition.workspace = true 5 | description = "IronRDP extra test suite" 6 | publish = false 7 | license.workspace = true 8 | homepage.workspace = true 9 | repository.workspace = true 10 | authors.workspace = true 11 | keywords.workspace = true 12 | categories.workspace = true 13 | 14 | [dev-dependencies] 15 | anyhow = "1.0" 16 | async-trait = "0.1" 17 | ironrdp = { path = "../ironrdp", features = ["server", "pdu", "connector", "session", "connector"] } 18 | ironrdp-async.path = "../ironrdp-async" 19 | ironrdp-tokio.path = "../ironrdp-tokio" 20 | ironrdp-tls = { path = "../ironrdp-tls", features = ["rustls"] } 21 | semver = "1.0" 22 | tracing = { version = "0.1", features = ["log"] } 23 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 24 | tokio = { version = "1", features = ["sync", "time"] } 25 | 26 | [lints] 27 | workspace = true 28 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-extra/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![allow(unused_crate_dependencies)] 2 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-extra/tests/certs/Makefile: -------------------------------------------------------------------------------- 1 | CERT_KEY=server-key.pem 2 | CERT_FILE=server-cert.pem 3 | DAYS=365 4 | RSA_BITS=2048 5 | SUBJECT=/C=US/ST=Test/L=Test/O=Test/OU=Test/CN=localhost 6 | 7 | .PHONY: all clean certs 8 | 9 | all: $(CERT_KEY) $(CERT_FILE) 10 | 11 | $(CERT_KEY) $(CERT_FILE): 12 | openssl req -x509 -nodes -days $(DAYS) -newkey rsa:$(RSA_BITS) \ 13 | -keyout $(CERT_KEY) -out $(CERT_FILE) \ 14 | -subj "$(SUBJECT)" 15 | 16 | clean: 17 | rm -f $(CERT_KEY) $(CERT_FILE) 18 | -------------------------------------------------------------------------------- /crates/ironrdp-testsuite-extra/tests/certs/README.md: -------------------------------------------------------------------------------- 1 | The server-cert.pem and server-key.pem provided in this repository are 2 | self-signed and for testing purposes only. They should not be used in production 3 | environments. 4 | -------------------------------------------------------------------------------- /crates/ironrdp-tls/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-tls/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-tokio/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp-tokio/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp-tokio/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Tokio 2 | 3 | `Framed*` traits implementation above [Tokio]’s traits. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | [Tokio]: https://tokio.rs/ 9 | -------------------------------------------------------------------------------- /crates/ironrdp-web/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /bin 3 | /pkg 4 | /wasm-pack.log 5 | -------------------------------------------------------------------------------- /crates/ironrdp-web/README.md: -------------------------------------------------------------------------------- 1 | # WASM bindings for web 2 | 3 | ## 🛠️ Build with `wasm-pack build` 4 | 5 | ``` 6 | wasm-pack build 7 | ``` 8 | 9 | This crate is part of the [IronRDP] project. 10 | 11 | [IronRDP]: https://github.com/Devolutions/IronRDP 12 | -------------------------------------------------------------------------------- /crates/ironrdp-web/rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | targets = ["wasm32-unknown-unknown"] 3 | profile = "minimal" 4 | -------------------------------------------------------------------------------- /crates/ironrdp-web/src/utils.rs: -------------------------------------------------------------------------------- 1 | pub fn set_panic_hook() { 2 | // When the `console_error_panic_hook` feature is enabled, we can call the 3 | // `set_panic_hook` function at least once during initialization, and then 4 | // we will get better error messages if our code ever panics. 5 | // 6 | // For more details see 7 | // https://github.com/rustwasm/console_error_panic_hook#readme 8 | #[cfg(feature = "console_error_panic_hook")] 9 | console_error_panic_hook::set_once(); 10 | } 11 | -------------------------------------------------------------------------------- /crates/ironrdp/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | ../../LICENSE-APACHE -------------------------------------------------------------------------------- /crates/ironrdp/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | ../../LICENSE-MIT -------------------------------------------------------------------------------- /crates/ironrdp/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP meta crate 2 | 3 | A meta crate re-exporting IronRDP crates for convenience. 4 | 5 | This crate is part of the [IronRDP] project. 6 | 7 | [IronRDP]: https://github.com/Devolutions/IronRDP 8 | -------------------------------------------------------------------------------- /ffi/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ffi" 3 | version = "0.0.0" 4 | edition = "2021" 5 | publish = false 6 | 7 | [lib] 8 | name = "ironrdp" 9 | crate-type = ["staticlib", "cdylib"] 10 | doc = false 11 | test = false 12 | doctest = false 13 | 14 | [dependencies] 15 | diplomat = "0.7" 16 | diplomat-runtime = "0.7" 17 | ironrdp = { path = "../crates/ironrdp", features = ["session", "connector", "dvc", "svc", "rdpdr", "rdpsnd", "graphics", "input", "cliprdr", "displaycontrol"] } 18 | ironrdp-cliprdr-native.path = "../crates/ironrdp-cliprdr-native" 19 | ironrdp-core = { path = "../crates/ironrdp-core", features = ["alloc"] } 20 | sspi = { version = "0.15", features = ["network_client"] } 21 | thiserror = "1" 22 | tracing = { version = "0.1", features = ["log"] } 23 | tracing-subscriber = { version = "0.3", features = ["env-filter"] } 24 | 25 | [target.'cfg(windows)'.build-dependencies] 26 | embed-resource = "3.0" 27 | 28 | [lints] 29 | workspace = true 30 | -------------------------------------------------------------------------------- /ffi/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP FFI 2 | 3 | [Diplomat]-based FFI for IronRDP. 4 | 5 | Currently, only the .NET target is officially supported. 6 | 7 | ## How to build 8 | 9 | - Install required tools: `cargo xtask ffi install` 10 | - For .NET, note that `dotnet` is also a requirement that you will need to install on your own. 11 | 12 | - Build the shared library: `cargo xtask ffi build` (alternatively, in release mode: `cargo xtask ffi build --release`) 13 | 14 | - Build the bindings: `cargo xtask ffi bindings` 15 | 16 | At this point, you may build and run the examples for .NET: 17 | 18 | - `dotnet run --project Devolutions.IronRdp.ConnectExample` 19 | - `dotnet run --project Devolutions.IronRdp.AvaloniaExample` 20 | 21 | [Diplomat]: https://github.com/rust-diplomat/diplomat 22 | -------------------------------------------------------------------------------- /ffi/dotnet-interop-conf.toml: -------------------------------------------------------------------------------- 1 | namespace = "Devolutions.IronRdp" 2 | native_lib = "DevolutionsIronRdp" 3 | 4 | [exceptions] 5 | trim_suffix = "Error" 6 | error_message_method = "ToDisplay" 7 | 8 | [properties] 9 | setters_prefix = "set_" 10 | getters_prefix = "get_" 11 | -------------------------------------------------------------------------------- /ffi/dotnet/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | # Indentation and spacing 4 | indent_size = 4 5 | tab_width = 4 6 | 7 | # New line preferences 8 | end_of_line = lf 9 | insert_final_newline = false 10 | 11 | [src/Picky/Generated/*.cs] 12 | generated_code = true 13 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp.AvaloniaExample/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore directories 2 | bin/ 3 | obj/ 4 | 5 | # Ignore files 6 | *.user 7 | *.userosscache 8 | *.suo 9 | *.userprefs 10 | *.dll 11 | *.exe 12 | *.pdb 13 | *.cache 14 | *.vsp 15 | *.vspx 16 | *.sap 17 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp.AvaloniaExample/App.axaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp.AvaloniaExample/App.axaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Avalonia; 3 | using Avalonia.Controls.ApplicationLifetimes; 4 | using Avalonia.Markup.Xaml; 5 | 6 | namespace Devolutions.IronRdp.AvaloniaExample; 7 | 8 | public partial class App : Application 9 | { 10 | public override void Initialize() 11 | { 12 | AvaloniaXamlLoader.Load(this); 13 | } 14 | 15 | public override void OnFrameworkInitializationCompleted() 16 | { 17 | if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) 18 | { 19 | desktop.MainWindow = new MainWindow(); 20 | } 21 | 22 | base.OnFrameworkInitializationCompleted(); 23 | } 24 | } -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp.AvaloniaExample/packages-microsoft-prod.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/ffi/dotnet/Devolutions.IronRdp.AvaloniaExample/packages-microsoft-prod.deb -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp.ConnectExample/.gitignore: -------------------------------------------------------------------------------- 1 | obj 2 | bin 3 | .vs 4 | output.bmp -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp.ConnectExample/Devolutions.IronRdp.ConnectExample.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net8.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/.gitignore: -------------------------------------------------------------------------------- 1 | obj 2 | bin -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Devolutions.IronRdp.iOS.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Framework 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/ActiveStageOutputType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum ActiveStageOutputType 15 | { 16 | ResponseFrame = 0, 17 | GraphicsUpdate = 1, 18 | PointerDefault = 2, 19 | PointerHidden = 3, 20 | PointerPosition = 4, 21 | PointerBitmap = 5, 22 | Terminate = 6, 23 | DeactivateAll = 7, 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/ClientConnectorStateType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum ClientConnectorStateType 15 | { 16 | Consumed = 0, 17 | ConnectionInitiationSendRequest = 1, 18 | ConnectionInitiationWaitConfirm = 2, 19 | EnhancedSecurityUpgrade = 3, 20 | Credssp = 4, 21 | BasicSettingsExchangeSendInitial = 5, 22 | BasicSettingsExchangeWaitResponse = 6, 23 | ChannelConnection = 7, 24 | SecureSettingsExchange = 8, 25 | ConnectTimeAutoDetection = 9, 26 | LicensingExchange = 10, 27 | MultitransportBootstrapping = 11, 28 | CapabilitiesExchange = 12, 29 | ConnectionFinalization = 13, 30 | Connected = 14, 31 | } 32 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/ClipboardMessageType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum ClipboardMessageType 15 | { 16 | SendInitiateCopy = 0, 17 | SendFormatData = 1, 18 | SendInitiatePaste = 2, 19 | Error = 3, 20 | } 21 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/ConnectionActivationStateType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum ConnectionActivationStateType 15 | { 16 | Consumed = 0, 17 | CapabilitiesExchange = 1, 18 | ConnectionFinalization = 2, 19 | Finalized = 3, 20 | } 21 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/IronRdpErrorKind.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum IronRdpErrorKind 15 | { 16 | Generic = 0, 17 | PduError = 1, 18 | EncodeError = 2, 19 | DecodeError = 3, 20 | CredsspError = 4, 21 | Consumed = 5, 22 | IO = 6, 23 | AccessDenied = 7, 24 | IncorrectEnumType = 8, 25 | Clipboard = 9, 26 | WrongOS = 10, 27 | } 28 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/IronRdpException.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public partial class IronRdpException : Exception 15 | { 16 | private IronRdpError _inner; 17 | 18 | public IronRdpException(IronRdpError inner) : base(inner.ToDisplay()) 19 | { 20 | _inner = inner; 21 | } 22 | 23 | public IronRdpError Inner 24 | { 25 | get 26 | { 27 | return _inner; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/KeyboardType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum KeyboardType 15 | { 16 | IbmPcXt = 0, 17 | OlivettiIco = 1, 18 | IbmPcAt = 2, 19 | IbmEnhanced = 3, 20 | Nokia1050 = 4, 21 | Nokia9140 = 5, 22 | Japanese = 6, 23 | } 24 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/MouseButtonType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum MouseButtonType 15 | { 16 | Left = 0, 17 | Middle = 1, 18 | Right = 2, 19 | X1 = 3, 20 | X2 = 4, 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/NetworkRequestProtocol.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum NetworkRequestProtocol 15 | { 16 | Tcp = 0, 17 | Udp = 1, 18 | Http = 2, 19 | Https = 3, 20 | } 21 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/OperationType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum OperationType 15 | { 16 | MouseButtonPressed = 0, 17 | MouseButtonReleased = 1, 18 | MouseMove = 2, 19 | WheelRotations = 3, 20 | KeyPressed = 4, 21 | KeyReleased = 5, 22 | UnicodeKeyPressed = 6, 23 | UnicodeKeyReleased = 7, 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/PerformanceFlagsType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum PerformanceFlagsType 15 | { 16 | DisableWallpaper = 0, 17 | DisableFullWindowDrag = 1, 18 | DisableMenuAnimations = 2, 19 | DisableTheming = 3, 20 | Reserved1 = 4, 21 | DisableCursorShadow = 5, 22 | DisableCursorSettings = 6, 23 | EnableFontSmoothing = 7, 24 | EnableDesktopComposition = 8, 25 | Reserved2 = 9, 26 | } 27 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/PixelFormat.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum PixelFormat 15 | { 16 | ARgb32 = 0, 17 | XRgb32 = 1, 18 | ABgr32 = 2, 19 | XBgr32 = 3, 20 | BgrA32 = 4, 21 | BgrX32 = 5, 22 | RgbA32 = 6, 23 | RgbX32 = 7, 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawAction.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct Action 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Action_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(Action* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawActiveStageOutputType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum ActiveStageOutputType 15 | { 16 | ResponseFrame = 0, 17 | GraphicsUpdate = 1, 18 | PointerDefault = 2, 19 | PointerHidden = 3, 20 | PointerPosition = 4, 21 | PointerBitmap = 5, 22 | Terminate = 6, 23 | DeactivateAll = 7, 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawBitmapConfig.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct BitmapConfig 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "BitmapConfig_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(BitmapConfig* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawChannelConnectionSequence.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct ChannelConnectionSequence 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ChannelConnectionSequence_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(ChannelConnectionSequence* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawClientConnectorStateType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum ClientConnectorStateType 15 | { 16 | Consumed = 0, 17 | ConnectionInitiationSendRequest = 1, 18 | ConnectionInitiationWaitConfirm = 2, 19 | EnhancedSecurityUpgrade = 3, 20 | Credssp = 4, 21 | BasicSettingsExchangeSendInitial = 5, 22 | BasicSettingsExchangeWaitResponse = 6, 23 | ChannelConnection = 7, 24 | SecureSettingsExchange = 8, 25 | ConnectTimeAutoDetection = 9, 26 | LicensingExchange = 10, 27 | MultitransportBootstrapping = 11, 28 | CapabilitiesExchange = 12, 29 | ConnectionFinalization = 13, 30 | Connected = 14, 31 | } 32 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawClipboardFormatId.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct ClipboardFormatId 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ClipboardFormatId_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(ClipboardFormatId* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawClipboardFormatIterator.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct ClipboardFormatIterator 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ClipboardFormatIterator_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(ClipboardFormatIterator* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawClipboardMessageType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum ClipboardMessageType 15 | { 16 | SendInitiateCopy = 0, 17 | SendFormatData = 1, 18 | SendInitiatePaste = 2, 19 | Error = 3, 20 | } 21 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawClipboardSvgMessage.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct ClipboardSvgMessage 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ClipboardSvgMessage_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(ClipboardSvgMessage* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawCliprdr.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct Cliprdr 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Cliprdr_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(Cliprdr* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawCliprdrBackendFactory.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct CliprdrBackendFactory 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "CliprdrBackendFactory_build_cliprdr", ExactSpelling = true)] 20 | public static unsafe extern Cliprdr* BuildCliprdr(CliprdrBackendFactory* self); 21 | 22 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "CliprdrBackendFactory_destroy", ExactSpelling = true)] 23 | public static unsafe extern void Destroy(CliprdrBackendFactory* self); 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawConfig.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct Config 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Config_get_builder", ExactSpelling = true)] 20 | public static unsafe extern ConfigBuilder* GetBuilder(); 21 | 22 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Config_destroy", ExactSpelling = true)] 23 | public static unsafe extern void Destroy(Config* self); 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawConnectInitial.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct ConnectInitial 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ConnectInitial_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(ConnectInitial* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawConnectionActivationStateType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum ConnectionActivationStateType 15 | { 16 | Consumed = 0, 17 | CapabilitiesExchange = 1, 18 | ConnectionFinalization = 2, 19 | Finalized = 3, 20 | } 21 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawConnectorFfiResultVoidBoxIronRdpError.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct ConnectorFfiResultVoidBoxIronRdpError 16 | { 17 | [StructLayout(LayoutKind.Explicit)] 18 | private unsafe struct InnerUnion 19 | { 20 | [FieldOffset(0)] 21 | internal IronRdpError* err; 22 | } 23 | 24 | private InnerUnion _inner; 25 | 26 | [MarshalAs(UnmanagedType.U1)] 27 | public bool isOk; 28 | 29 | public unsafe IronRdpError* Err 30 | { 31 | get 32 | { 33 | return _inner.err; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawCredsspNetworkFfiResultVoidBoxIronRdpError.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct CredsspNetworkFfiResultVoidBoxIronRdpError 16 | { 17 | [StructLayout(LayoutKind.Explicit)] 18 | private unsafe struct InnerUnion 19 | { 20 | [FieldOffset(0)] 21 | internal IronRdpError* err; 22 | } 23 | 24 | private InnerUnion _inner; 25 | 26 | [MarshalAs(UnmanagedType.U1)] 27 | public bool isOk; 28 | 29 | public unsafe IronRdpError* Err 30 | { 31 | get 32 | { 33 | return _inner.err; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawDrdynvcChannel.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct DrdynvcChannel 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "DrdynvcChannel_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(DrdynvcChannel* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawFastPathInputEvent.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct FastPathInputEvent 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "FastPathInputEvent_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(FastPathInputEvent* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawFastPathInputEventIterator.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct FastPathInputEventIterator 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "FastPathInputEventIterator_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(FastPathInputEventIterator* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawFormatDataResponse.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct FormatDataResponse 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "FormatDataResponse_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(FormatDataResponse* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawGracefulDisconnectReason.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct GracefulDisconnectReason 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "GracefulDisconnectReason_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(GracefulDisconnectReason* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawIronRdpErrorKind.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum IronRdpErrorKind 15 | { 16 | Generic = 0, 17 | PduError = 1, 18 | EncodeError = 2, 19 | DecodeError = 3, 20 | CredsspError = 4, 21 | Consumed = 5, 22 | IO = 6, 23 | AccessDenied = 7, 24 | IncorrectEnumType = 8, 25 | Clipboard = 9, 26 | WrongOS = 10, 27 | } 28 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawKerberosConfig.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct KerberosConfig 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "KerberosConfig_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(KerberosConfig* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawKeyboardType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum KeyboardType 15 | { 16 | IbmPcXt = 0, 17 | OlivettiIco = 1, 18 | IbmPcAt = 2, 19 | IbmEnhanced = 3, 20 | Nokia1050 = 4, 21 | Nokia9140 = 5, 22 | Japanese = 6, 23 | } 24 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawLicenseExchangeSequence.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct LicenseExchangeSequence 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "LicenseExchangeSequence_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(LicenseExchangeSequence* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawLog.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct Log 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Log_init_with_env", ExactSpelling = true)] 20 | public static unsafe extern void InitWithEnv(); 21 | 22 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Log_destroy", ExactSpelling = true)] 23 | public static unsafe extern void Destroy(Log* self); 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawMouseButtonType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum MouseButtonType 15 | { 16 | Left = 0, 17 | Middle = 1, 18 | Right = 2, 19 | X1 = 3, 20 | X2 = 4, 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawNetworkRequestProtocol.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum NetworkRequestProtocol 15 | { 16 | Tcp = 0, 17 | Udp = 1, 18 | Http = 2, 19 | Https = 3, 20 | } 21 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawOperation.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct Operation 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Operation_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(Operation* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawOperationType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum OperationType 15 | { 16 | MouseButtonPressed = 0, 17 | MouseButtonReleased = 1, 18 | MouseMove = 2, 19 | WheelRotations = 3, 20 | KeyPressed = 4, 21 | KeyReleased = 5, 22 | UnicodeKeyPressed = 6, 23 | UnicodeKeyReleased = 7, 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawPduFfiResultVoidBoxIronRdpError.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct PduFfiResultVoidBoxIronRdpError 16 | { 17 | [StructLayout(LayoutKind.Explicit)] 18 | private unsafe struct InnerUnion 19 | { 20 | [FieldOffset(0)] 21 | internal IronRdpError* err; 22 | } 23 | 24 | private InnerUnion _inner; 25 | 26 | [MarshalAs(UnmanagedType.U1)] 27 | public bool isOk; 28 | 29 | public unsafe IronRdpError* Err 30 | { 31 | get 32 | { 33 | return _inner.err; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawPduHint.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct PduHint 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PduHint_find_size", ExactSpelling = true)] 20 | public static unsafe extern ConnectorFfiResultBoxOptionalUsizeBoxIronRdpError FindSize(PduHint* self, byte* bytes, nuint bytesSz); 21 | 22 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PduHint_destroy", ExactSpelling = true)] 23 | public static unsafe extern void Destroy(PduHint* self); 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawPerformanceFlagsType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum PerformanceFlagsType 15 | { 16 | DisableWallpaper = 0, 17 | DisableFullWindowDrag = 1, 18 | DisableMenuAnimations = 2, 19 | DisableTheming = 3, 20 | Reserved1 = 4, 21 | DisableCursorShadow = 5, 22 | DisableCursorSettings = 6, 23 | EnableFontSmoothing = 7, 24 | EnableDesktopComposition = 8, 25 | Reserved2 = 9, 26 | } 27 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawPixelFormat.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum PixelFormat 15 | { 16 | ARgb32 = 0, 17 | XRgb32 = 1, 18 | ABgr32 = 2, 19 | XBgr32 = 3, 20 | BgrA32 = 4, 21 | BgrX32 = 5, 22 | RgbA32 = 6, 23 | RgbX32 = 7, 24 | } 25 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawPosition.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct Position 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | public ushort x; 20 | 21 | public ushort y; 22 | } 23 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawSecurityProtocol.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct SecurityProtocol 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SecurityProtocol_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(SecurityProtocol* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawStaticChannelSet.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct StaticChannelSet 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "StaticChannelSet_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(StaticChannelSet* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawTsRequest.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct TsRequest 16 | { 17 | private const string NativeLib = "DevolutionsIronRdp"; 18 | 19 | [DllImport(NativeLib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "TsRequest_destroy", ExactSpelling = true)] 20 | public static unsafe extern void Destroy(TsRequest* self); 21 | } 22 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawUtilsFfiResultVoidBoxIronRdpError.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | [StructLayout(LayoutKind.Sequential)] 15 | public partial struct UtilsFfiResultVoidBoxIronRdpError 16 | { 17 | [StructLayout(LayoutKind.Explicit)] 18 | private unsafe struct InnerUnion 19 | { 20 | [FieldOffset(0)] 21 | internal IronRdpError* err; 22 | } 23 | 24 | private InnerUnion _inner; 25 | 26 | [MarshalAs(UnmanagedType.U1)] 27 | public bool isOk; 28 | 29 | public unsafe IronRdpError* Err 30 | { 31 | get 32 | { 33 | return _inner.err; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/RawWrittenType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp.Raw; 11 | 12 | #nullable enable 13 | 14 | public enum WrittenType 15 | { 16 | Size = 0, 17 | Nothing = 1, 18 | } 19 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Generated/WrittenType.cs: -------------------------------------------------------------------------------- 1 | // by Diplomat 2 | 3 | #pragma warning disable 0105 4 | using System; 5 | using System.Runtime.InteropServices; 6 | 7 | using Devolutions.IronRdp.Diplomat; 8 | #pragma warning restore 0105 9 | 10 | namespace Devolutions.IronRdp; 11 | 12 | #nullable enable 13 | 14 | public enum WrittenType 15 | { 16 | Size = 0, 17 | Nothing = 1, 18 | } 19 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 21 | CFBundleShortVersionString 22 | 1.0.0.0 23 | CSResourcesFileMapped 24 | 25 | MinimumOSVersion 26 | 12.1 27 | 28 | 29 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/src/ClientConnector.Addons.cs: -------------------------------------------------------------------------------- 1 | namespace Devolutions.IronRdp; 2 | 3 | public partial class ClientConnector : ISequence 4 | { 5 | } 6 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/src/ConnectionActivationSequence.Addons.cs: -------------------------------------------------------------------------------- 1 | namespace Devolutions.IronRdp; 2 | 3 | public partial class ConnectionActivationSequence : ISequence 4 | { 5 | } 6 | -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/src/Exceptions.cs: -------------------------------------------------------------------------------- 1 | namespace Devolutions.IronRdp; 2 | 3 | [Serializable] 4 | public class IronRdpLibException : Exception 5 | { 6 | public IronRdpLibExceptionType ErrorType { get; private set; } 7 | 8 | public IronRdpLibException(IronRdpLibExceptionType errorType, string message) : base(message) 9 | { 10 | ErrorType = errorType; 11 | } 12 | 13 | } 14 | 15 | public enum IronRdpLibExceptionType 16 | { 17 | CannotResolveDns, 18 | ConnectionFailed, 19 | EndOfFile, 20 | } -------------------------------------------------------------------------------- /ffi/dotnet/Devolutions.IronRdp/src/ISequence.cs: -------------------------------------------------------------------------------- 1 | namespace Devolutions.IronRdp; 2 | 3 | public interface ISequence 4 | { 5 | PduHint? NextPduHint(); 6 | Written Step(byte[] pduHint, WriteBuf buf); 7 | Written StepNoInput(WriteBuf buf); 8 | } 9 | 10 | -------------------------------------------------------------------------------- /ffi/src/dvc.rs: -------------------------------------------------------------------------------- 1 | #[diplomat::bridge] 2 | pub mod ffi { 3 | 4 | #[diplomat::opaque] 5 | pub struct DrdynvcChannel(pub ironrdp::dvc::DrdynvcClient); 6 | } 7 | -------------------------------------------------------------------------------- /ffi/src/graphics.rs: -------------------------------------------------------------------------------- 1 | #[diplomat::bridge] 2 | pub mod ffi { 3 | use std::sync::Arc; 4 | 5 | use crate::utils::ffi::BytesSlice; 6 | 7 | #[diplomat::opaque] 8 | pub struct DecodedPointer(pub Arc); 9 | 10 | impl DecodedPointer { 11 | pub fn get_width(&self) -> u16 { 12 | self.0.width 13 | } 14 | 15 | pub fn get_height(&self) -> u16 { 16 | self.0.height 17 | } 18 | 19 | pub fn get_hotspot_x(&self) -> u16 { 20 | self.0.hotspot_x 21 | } 22 | 23 | pub fn get_hotspot_y(&self) -> u16 { 24 | self.0.hotspot_y 25 | } 26 | 27 | pub fn get_data(&self) -> Box> { 28 | Box::new(BytesSlice(&self.0.bitmap_data)) 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /ffi/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::unnecessary_box_returns)] // Diplomat requires returning Boxed types 2 | #![allow(clippy::should_implement_trait)] // Implementing extra traits is not useful for FFI 3 | #![allow(clippy::needless_lifetimes)] // Diplomat requires lifetimes to be specified even if they can be elided in regular Rust code 4 | 5 | pub mod clipboard; 6 | pub mod connector; 7 | pub mod credssp; 8 | pub mod dvc; 9 | pub mod error; 10 | pub mod graphics; 11 | pub mod input; 12 | pub mod log; 13 | pub mod pdu; 14 | pub mod session; 15 | pub mod svc; 16 | pub mod utils; 17 | -------------------------------------------------------------------------------- /ffi/src/svc.rs: -------------------------------------------------------------------------------- 1 | #[diplomat::bridge] 2 | pub mod ffi { 3 | 4 | #[diplomat::opaque] 5 | pub struct StaticChannelSet<'a>(pub &'a ironrdp::svc::StaticChannelSet); 6 | } 7 | -------------------------------------------------------------------------------- /fuzz/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /artifacts 3 | /corpus 4 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/bitmap_stream.rs: -------------------------------------------------------------------------------- 1 | #![no_main] 2 | 3 | use libfuzzer_sys::fuzz_target; 4 | 5 | fuzz_target!(|input: ironrdp_fuzzing::generators::BitmapInput<'_>| { 6 | ironrdp_fuzzing::oracles::rdp6_encode_bitmap_stream(&input); 7 | ironrdp_fuzzing::oracles::rdp6_decode_bitmap_stream_to_rgb24(&input); 8 | }); 9 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/channel_processing.rs: -------------------------------------------------------------------------------- 1 | #![no_main] 2 | 3 | use libfuzzer_sys::fuzz_target; 4 | 5 | fuzz_target!(|data: &[u8]| { 6 | ironrdp_fuzzing::oracles::channel_process(data); 7 | }); 8 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/cliprdr_format.rs: -------------------------------------------------------------------------------- 1 | #![no_main] 2 | 3 | use libfuzzer_sys::fuzz_target; 4 | 5 | fuzz_target!(|data: &[u8]| { 6 | ironrdp_fuzzing::oracles::cliprdr_format(data); 7 | }); 8 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/pdu_decoding.rs: -------------------------------------------------------------------------------- 1 | #![no_main] 2 | 3 | use libfuzzer_sys::fuzz_target; 4 | 5 | fuzz_target!(|data: &[u8]| { 6 | ironrdp_fuzzing::oracles::pdu_decode(data); 7 | }); 8 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/rle_decompression.rs: -------------------------------------------------------------------------------- 1 | #![no_main] 2 | 3 | use libfuzzer_sys::fuzz_target; 4 | 5 | fuzz_target!(|input: ironrdp_fuzzing::generators::BitmapInput<'_>| { 6 | ironrdp_fuzzing::oracles::rle_decompress_bitmap(input); 7 | }); 8 | -------------------------------------------------------------------------------- /fuzz/rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "nightly" 3 | profile = "minimal" 4 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "1.85.0" 3 | components = ["rustfmt", "clippy"] 4 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 120 2 | reorder_imports = true 3 | imports_granularity = "Module" 4 | group_imports = "StdExternalCrate" 5 | -------------------------------------------------------------------------------- /web-client/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | # Build artifacts 11 | node_modules 12 | dist 13 | dist-ssr 14 | *.local 15 | build 16 | 17 | # Vite bundler 18 | vite.config.js.timestamp-* 19 | vite.config.ts.timestamp-* 20 | -------------------------------------------------------------------------------- /web-client/.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | # Prettier: 2 | # - https://prettier.io/docs/en/options 3 | 4 | # prettier-plugin-svelte: 5 | # - https://github.com/sveltejs/prettier-plugin-svelte 6 | --- 7 | useTabs: false 8 | tabWidth: 4 9 | singleQuote: true 10 | semi: true 11 | trailingComma: all 12 | printWidth: 120 13 | 14 | plugins: 15 | - prettier-plugin-svelte 16 | 17 | overrides: 18 | - files: '*.svelte' 19 | options: 20 | parser: svelte 21 | - files: 22 | - '*.yml' 23 | - '*.yaml' 24 | - '*.json' 25 | - '*.html' 26 | - '*.md' 27 | options: 28 | tabWidth: 2 29 | -------------------------------------------------------------------------------- /web-client/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP Web Client 2 | 3 | IronRDP also supports the web browser as a first class target. 4 | 5 | See the [iron-remote-desktop](./iron-remote-desktop) for the reusable Web Component, and [iron-svelte-client](./iron-svelte-client) for a demonstration. 6 | 7 | Note that the demonstration client is not intended to be used in production as-is. 8 | Devolutions is shipping well-integrated, production-ready IronRDP web clients as part of: 9 | 10 | - [Devolutions Gateway](https://github.com/Devolutions/devolutions-gateway/)’s [Standalone Web Interface](https://github.com/Devolutions/devolutions-gateway/tree/master/webapp) which is a completely free product (shipped since v2024.1.0). 11 | - [Devolutions Server](https://devolutions.net/server/), our self-hosted credential manager. 12 | - [Devolutions Hub](https://devolutions.net/password-hub/), our cloud-based credential manager. 13 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | vite.config.js.timestamp-* 27 | vite.config.ts.timestamp-* 28 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | .env 4 | .env.* 5 | !.env.example 6 | 7 | /package 8 | /build 9 | /static/bearcss 10 | /static/material-icons 11 | /dist 12 | # Ignore files for PNPM, NPM and YARN 13 | pnpm-lock.yaml 14 | package-lock.json 15 | yarn.lock 16 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | # Prettier: 2 | # - https://prettier.io/docs/en/options 3 | --- 4 | useTabs: false 5 | tabWidth: 4 6 | singleQuote: true 7 | semi: true 8 | trailingComma: all 9 | printWidth: 120 10 | 11 | overrides: 12 | - files: 13 | - '*.yml' 14 | - '*.yaml' 15 | - '*.json' 16 | - '*.html' 17 | - '*.md' 18 | options: 19 | tabWidth: 2 20 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/README.md: -------------------------------------------------------------------------------- 1 | # Iron Remote Desktop RDP 2 | 3 | This is implementation of `RemoteDesktopModule` interface from [iron-remote-desktop](../iron-remote-desktop) for RDP connection. 4 | 5 | ## Development 6 | 7 | Make your modification in the source code then use [iron-svelte-client](../iron-svelte-client) to test. 8 | 9 | ## Build 10 | 11 | Run `npm run build` 12 | 13 | ## Usage 14 | 15 | As member of the Devolutions organization, you can import the Web Component from JFrog Artifactory by running the following npm command: 16 | 17 | ```shell 18 | $ npm install @devolutions/iron-remote-desktop-rdp 19 | ``` 20 | 21 | Otherwise, you can run `npm install` targeting the `dist/` folder directly. 22 | 23 | Import the `iron-remote-desktop-rdp.umd.cjs` from `node_modules/` folder. 24 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/public/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@devolutions/iron-remote-desktop-rdp", 3 | "author": "Alexandr Yusuk", 4 | "email": "thepulticula@gmail.com", 5 | "contributors": [ 6 | "Benoit Cortier" 7 | ], 8 | "description": "RDP backend for iron-remote-desktop", 9 | "version": "0.1.1", 10 | "main": "iron-remote-desktop-rdp.js", 11 | "types": "index.d.ts", 12 | "files": [ 13 | "iron-remote-desktop-rdp.js", 14 | "index.d.ts" 15 | ], 16 | "dependencies": { 17 | "rxjs": "^6.6.7" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "moduleResolution": "Node", 7 | "esModuleInterop": true, 8 | "resolveJsonModule": true, 9 | /** 10 | * Typecheck JS in `.svelte` and `.js` files by default. 11 | * Disable checkJs if you'd like to use dynamic types in JS. 12 | * Note that setting allowJs false does not prevent the use 13 | * of JS in `.svelte` files. 14 | */ 15 | "allowJs": false, 16 | "checkJs": false, 17 | "isolatedModules": true, 18 | "strict": true, 19 | "strictNullChecks": true, 20 | "noImplicitAny": true, 21 | "outDir": "dist", 22 | "rootDir": "src" 23 | }, 24 | "include": ["src/**/*.ts", "src/**/*.js"], 25 | "references": [ 26 | { 27 | "path": "./tsconfig.node.json" 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node" 6 | }, 7 | "include": ["vite.config.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop-rdp/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import topLevelAwait from 'vite-plugin-top-level-await'; 3 | import dtsPlugin from 'vite-plugin-dts'; 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | build: { 8 | lib: { 9 | entry: './src/main.ts', 10 | name: 'IronRemoteDesktopRdp', 11 | formats: ['es'], 12 | }, 13 | }, 14 | server: { 15 | fs: { 16 | strict: false, 17 | }, 18 | }, 19 | plugins: [ 20 | topLevelAwait(), 21 | dtsPlugin({ 22 | rollupTypes: true, 23 | }), 24 | ], 25 | }); 26 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | vite.config.js.timestamp-* 27 | vite.config.ts.timestamp-* 28 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | .env 4 | .env.* 5 | !.env.example 6 | 7 | /.svelte-kit 8 | /package 9 | /build 10 | /static/bearcss 11 | /static/material-icons 12 | /dist 13 | # Ignore files for PNPM, NPM and YARN 14 | pnpm-lock.yaml 15 | package-lock.json 16 | yarn.lock 17 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vite + Svelte + TS 7 | 8 | 9 | 10 | 11 | 12 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/public/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@devolutions/iron-remote-desktop", 3 | "author": "Nicolas Girot", 4 | "email": "ngirot@devolutions.net", 5 | "contributors": [ 6 | "Benoit Cortier", 7 | "Irving Ou", 8 | "Vladislav Nikonov", 9 | "Zacharia Ellaham", 10 | "Alexandr Yusuk" 11 | ], 12 | "description": "Web Component providing agnostic implementation for Iron Wasm base client", 13 | "version": "0.2.0", 14 | "main": "iron-remote-desktop.js", 15 | "types": "index.d.ts", 16 | "files": [ 17 | "iron-remote-desktop.js", 18 | "index.d.ts" 19 | ], 20 | "dependencies": { 21 | "rxjs": "^6.6.7" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/public/test.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Test 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/enums/LockKey.ts: -------------------------------------------------------------------------------- 1 | export enum LockKey { 2 | CAPS_LOCK = 'CapsLock', 3 | NUM_LOCK = 'NumLock', 4 | SCROLL_LOCK = 'ScrollLock', 5 | KANA_MODE = 'KanaMode', 6 | 'CapsLock' = CAPS_LOCK, 7 | 'ScrollLock' = SCROLL_LOCK, 8 | 'NumLock' = NUM_LOCK, 9 | 'KanaMode' = KANA_MODE, 10 | } 11 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/enums/LogType.ts: -------------------------------------------------------------------------------- 1 | export enum LogType { 2 | OFF = 'OFF', 3 | ERROR = 'ERROR', 4 | WARN = 'WARN', 5 | INFO = 'INFO', 6 | DEBUG = 'DEBUG', 7 | TRACE = 'TRACE', 8 | } 9 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/enums/ModifierKey.ts: -------------------------------------------------------------------------------- 1 | export enum ModifierKey { 2 | CTRL_LEFT = 'ControlLeft', 3 | SHIFT_LEFT = 'ShiftLeft', 4 | SHIFT_RIGHT = 'ShiftRight', 5 | ALT_LEFT = 'AltLeft', 6 | CTRL_RIGHT = 'ControlRight', 7 | ALT_RIGHT = 'AltRight', 8 | 'ControlLeft' = CTRL_LEFT, 9 | 'ShiftLeft' = SHIFT_LEFT, 10 | 'ShiftRight' = SHIFT_RIGHT, 11 | 'AltLeft' = ALT_LEFT, 12 | 'ControlRight' = CTRL_RIGHT, 13 | 'AltRight' = ALT_RIGHT, 14 | } 15 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/enums/OS.ts: -------------------------------------------------------------------------------- 1 | export enum OS { 2 | WINDOWS = 'windows', 3 | LINUX = 'linux', 4 | ANDROID = 'android', 5 | } 6 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/enums/ScreenScale.ts: -------------------------------------------------------------------------------- 1 | export enum ScreenScale { 2 | Fit = 1, 3 | Full = 2, 4 | Real = 3, 5 | } 6 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/enums/SessionEventType.ts: -------------------------------------------------------------------------------- 1 | export enum SessionEventType { 2 | STARTED, 3 | TERMINATED, 4 | ERROR, 5 | } 6 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/enums/SpecialCombination.ts: -------------------------------------------------------------------------------- 1 | export enum SpecialCombination { 2 | CTRL_ALT_DEL, 3 | META, 4 | } 5 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/ClipboardData.ts: -------------------------------------------------------------------------------- 1 | import type { ClipboardItem } from './ClipboardItem'; 2 | 3 | export interface ClipboardData { 4 | addText(mimeType: string, text: string): void; 5 | addBinary(mimeType: string, binary: Uint8Array): void; 6 | items(): ClipboardItem[]; 7 | isEmpty(): boolean; 8 | } 9 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/ClipboardItem.ts: -------------------------------------------------------------------------------- 1 | export interface ClipboardItem { 2 | mimeType(): string; 3 | value(): string | Uint8Array; 4 | } 5 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/DesktopSize.ts: -------------------------------------------------------------------------------- 1 | export interface DesktopSize { 2 | width: number; 3 | height: number; 4 | } 5 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/DeviceEvent.ts: -------------------------------------------------------------------------------- 1 | export type DeviceEvent = unknown; 2 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/Extension.ts: -------------------------------------------------------------------------------- 1 | export type Extension = unknown; 2 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/InputTransaction.ts: -------------------------------------------------------------------------------- 1 | import type { DeviceEvent } from './DeviceEvent'; 2 | 3 | export interface InputTransaction { 4 | addEvent(event: DeviceEvent): void; 5 | } 6 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/MousePosition.ts: -------------------------------------------------------------------------------- 1 | export interface MousePosition { 2 | x: number; 3 | y: number; 4 | } 5 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/NewSessionInfo.ts: -------------------------------------------------------------------------------- 1 | import type { DesktopSize } from './DesktopSize'; 2 | 3 | export interface NewSessionInfo { 4 | sessionId: number; 5 | websocketPort: number; 6 | initialDesktopSize: DesktopSize; 7 | } 8 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/ResizeEvent.ts: -------------------------------------------------------------------------------- 1 | import type { DesktopSize } from './DesktopSize'; 2 | 3 | export interface ResizeEvent { 4 | sessionId: number; 5 | desktopSize: DesktopSize; 6 | } 7 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/SessionTerminationInfo.ts: -------------------------------------------------------------------------------- 1 | export interface SessionTerminationInfo { 2 | reason(): string; 3 | } 4 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/interfaces/session-event.ts: -------------------------------------------------------------------------------- 1 | import type { SessionEventType } from '../enums/SessionEventType'; 2 | 3 | export enum IronErrorKind { 4 | General = 0, 5 | WrongPassword = 1, 6 | LogonFailure = 2, 7 | AccessDenied = 3, 8 | RDCleanPath = 4, 9 | ProxyConnect = 5, 10 | } 11 | 12 | export interface IronError { 13 | backtrace: () => string; 14 | kind: () => IronErrorKind; 15 | } 16 | 17 | export interface SessionEvent { 18 | type: SessionEventType; 19 | data: IronError | string; 20 | } 21 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/main.ts: -------------------------------------------------------------------------------- 1 | export * as default from './iron-remote-desktop.svelte'; 2 | export type { ResizeEvent } from './interfaces/ResizeEvent'; 3 | export type { NewSessionInfo } from './interfaces/NewSessionInfo'; 4 | export type { SessionEvent, IronError, IronErrorKind } from './interfaces/session-event'; 5 | export type { SessionEventType } from './enums/SessionEventType'; 6 | export type { SessionTerminationInfo } from './interfaces/SessionTerminationInfo'; 7 | export type { ClipboardData } from './interfaces/ClipboardData'; 8 | export type { ClipboardItem } from './interfaces/ClipboardItem'; 9 | export type { DeviceEvent } from './interfaces/DeviceEvent'; 10 | export type { InputTransaction } from './interfaces/InputTransaction'; 11 | export type { Session } from './interfaces/Session'; 12 | export type { SessionBuilder } from './interfaces/SessionBuilder'; 13 | export type { UserInteraction } from './interfaces/UserInteraction'; 14 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/services/logging.service.ts: -------------------------------------------------------------------------------- 1 | export class LoggingService { 2 | verbose: boolean = false; 3 | 4 | info(description: string) { 5 | if (this.verbose) { 6 | console.log(description); 7 | } 8 | } 9 | 10 | error(description: string, object?: unknown) { 11 | if (this.verbose) { 12 | console.error(description, object); 13 | } 14 | } 15 | } 16 | 17 | export const loggingService = new LoggingService(); 18 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/svelte.config.js: -------------------------------------------------------------------------------- 1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 2 | 3 | export default { 4 | // Consult https://svelte.dev/docs#compile-time-svelte-preprocess 5 | // for more information about preprocessors 6 | compilerOptions: { 7 | customElement: true, 8 | }, 9 | preprocess: vitePreprocess(), 10 | }; 11 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "useDefineForClassFields": true, 6 | "module": "ESNext", 7 | "resolveJsonModule": true, 8 | /** 9 | * Typecheck JS in `.svelte` and `.js` files by default. 10 | * Disable checkJs if you'd like to use dynamic types in JS. 11 | * Note that setting allowJs false does not prevent the use 12 | * of JS in `.svelte` files. 13 | */ 14 | "allowJs": false, 15 | "checkJs": false, 16 | "isolatedModules": true, 17 | "strict": true, 18 | "strictNullChecks": true, 19 | "noImplicitAny": true 20 | }, 21 | "include": ["src/**/*.svelte", "src/**/*.ts", "src/**/*.js", "vite.config.ts"], 22 | "references": [ 23 | { 24 | "path": "./tsconfig.node.json" 25 | } 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node" 6 | }, 7 | "include": ["vite.config.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /web-client/iron-remote-desktop/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import { svelte } from '@sveltejs/vite-plugin-svelte'; 3 | import wasm from 'vite-plugin-wasm'; 4 | import topLevelAwait from 'vite-plugin-top-level-await'; 5 | import dtsPlugin from 'vite-plugin-dts'; 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | build: { 10 | lib: { 11 | entry: './src/main.ts', 12 | name: 'IronRemoteDesktop', 13 | formats: ['es'], 14 | }, 15 | }, 16 | server: { 17 | fs: { 18 | strict: false, 19 | }, 20 | }, 21 | plugins: [ 22 | svelte(), 23 | wasm(), 24 | topLevelAwait(), 25 | dtsPlugin({ 26 | rollupTypes: true, 27 | }), 28 | ], 29 | }); 30 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/.gitignore: -------------------------------------------------------------------------------- 1 | /.svelte-kit 2 | /package 3 | .env 4 | .env.* 5 | !.env.example 6 | /static/iron-remote-desktop-rdp/ 7 | /static/iron-remote-desktop/ -------------------------------------------------------------------------------- /web-client/iron-svelte-client/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | .env 4 | .env.* 5 | !.env.example 6 | 7 | /.svelte-kit 8 | /package 9 | /build 10 | /static/beercss 11 | /static/material-icons 12 | 13 | # Ignore files for PNPM, NPM and YARN 14 | pnpm-lock.yaml 15 | package-lock.json 16 | yarn.lock 17 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/env.development: -------------------------------------------------------------------------------- 1 | export pnpm run dev -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | // and what to do when importing types 4 | declare namespace App { 5 | // interface Locals {} 6 | // interface PageData {} 7 | // interface Error {} 8 | // interface Platform {} 9 | } 10 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/lib/login/login-store.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store'; 2 | 3 | export const showLogin = writable(true); 4 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/lib/login/login.css: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | display: flex; 3 | justify-content: center; 4 | } 5 | 6 | .login-container { 7 | height: 100vh; 8 | overflow-y: auto; 9 | padding: 1rem; 10 | } 11 | 12 | .login-content { 13 | min-height: min-content; 14 | padding-bottom: 2rem; 15 | } 16 | 17 | .field.label.border { 18 | margin-bottom: 1rem; 19 | } 20 | 21 | .checkbox-container { 22 | display: flex; 23 | justify-content: start; 24 | gap: 30rem; 25 | padding: 0.5rem; 26 | } 27 | 28 | .checkbox-wrapper { 29 | display: flex; 30 | align-items: center; 31 | font-size: 1.5em; 32 | } 33 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/lib/messages/message-store.ts: -------------------------------------------------------------------------------- 1 | import type { Writable } from 'svelte/store'; 2 | import { writable } from 'svelte/store'; 3 | 4 | type ToastMessage = { 5 | message: string; 6 | type: 'info' | 'error'; 7 | }; 8 | export const toast: Writable = writable(); 9 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/models/session.ts: -------------------------------------------------------------------------------- 1 | import { Guid } from 'guid-typescript'; 2 | 3 | export class Session { 4 | id: Guid; 5 | sessionId!: number; 6 | name?: string; 7 | active!: boolean; 8 | desktopSize!: { width: number; height: number }; 9 | 10 | constructor(name?: string) { 11 | this.id = Guid.create(); 12 | this.name = name; 13 | this.active = false; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/routes/+layout.ts: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | export const ssr = false; 3 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/routes/popup-session/+page.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/src/routes/session/+page.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | {#if $showLogin} 9 | 10 | {/if} 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/crosshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/web-client/iron-svelte-client/static/crosshair.png -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/web-client/iron-svelte-client/static/favicon.png -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/filled.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Material Icons"; 3 | font-style: normal; 4 | font-weight: 400; 5 | font-display: block; 6 | src: url("./material-icons.woff2") format("woff2"); 7 | } 8 | .material-icons { 9 | font-family: "Material Icons"; 10 | font-weight: normal; 11 | font-style: normal; 12 | font-size: 24px; 13 | line-height: 1; 14 | letter-spacing: normal; 15 | text-transform: none; 16 | display: inline-block; 17 | white-space: nowrap; 18 | word-wrap: normal; 19 | direction: ltr; 20 | -webkit-font-smoothing: antialiased; 21 | -moz-osx-font-smoothing: grayscale; 22 | text-rendering: optimizeLegibility; 23 | font-feature-settings: "liga"; 24 | } 25 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/material-icons-outlined.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/web-client/iron-svelte-client/static/material-icons/material-icons-outlined.woff2 -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/material-icons-round.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/web-client/iron-svelte-client/static/material-icons/material-icons-round.woff2 -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/material-icons-sharp.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/web-client/iron-svelte-client/static/material-icons/material-icons-sharp.woff2 -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/material-icons-two-tone.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/web-client/iron-svelte-client/static/material-icons/material-icons-two-tone.woff2 -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/material-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Devolutions/IronRDP/60242519851619b5fa922396577382ffc02d69f8/web-client/iron-svelte-client/static/material-icons/material-icons.woff2 -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/outlined.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Material Icons Outlined"; 3 | font-style: normal; 4 | font-weight: 400; 5 | font-display: block; 6 | src: url("./material-icons-outlined.woff2") format("woff2"); 7 | } 8 | .material-icons-outlined { 9 | font-family: "Material Icons Outlined"; 10 | font-weight: normal; 11 | font-style: normal; 12 | font-size: 24px; 13 | line-height: 1; 14 | letter-spacing: normal; 15 | text-transform: none; 16 | display: inline-block; 17 | white-space: nowrap; 18 | word-wrap: normal; 19 | direction: ltr; 20 | -webkit-font-smoothing: antialiased; 21 | -moz-osx-font-smoothing: grayscale; 22 | text-rendering: optimizeLegibility; 23 | font-feature-settings: "liga"; 24 | } 25 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/round.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Material Icons Round"; 3 | font-style: normal; 4 | font-weight: 400; 5 | font-display: block; 6 | src: url("./material-icons-round.woff2") format("woff2"); 7 | } 8 | .material-icons-round { 9 | font-family: "Material Icons Round"; 10 | font-weight: normal; 11 | font-style: normal; 12 | font-size: 24px; 13 | line-height: 1; 14 | letter-spacing: normal; 15 | text-transform: none; 16 | display: inline-block; 17 | white-space: nowrap; 18 | word-wrap: normal; 19 | direction: ltr; 20 | -webkit-font-smoothing: antialiased; 21 | -moz-osx-font-smoothing: grayscale; 22 | text-rendering: optimizeLegibility; 23 | font-feature-settings: "liga"; 24 | } 25 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/sharp.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Material Icons Sharp"; 3 | font-style: normal; 4 | font-weight: 400; 5 | font-display: block; 6 | src: url("./material-icons-sharp.woff2") format("woff2"); 7 | } 8 | .material-icons-sharp { 9 | font-family: "Material Icons Sharp"; 10 | font-weight: normal; 11 | font-style: normal; 12 | font-size: 24px; 13 | line-height: 1; 14 | letter-spacing: normal; 15 | text-transform: none; 16 | display: inline-block; 17 | white-space: nowrap; 18 | word-wrap: normal; 19 | direction: ltr; 20 | -webkit-font-smoothing: antialiased; 21 | -moz-osx-font-smoothing: grayscale; 22 | text-rendering: optimizeLegibility; 23 | font-feature-settings: "liga"; 24 | } 25 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/static/material-icons/two-tone.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Material Icons Two Tone"; 3 | font-style: normal; 4 | font-weight: 400; 5 | font-display: block; 6 | src: url("./material-icons-two-tone.woff2") format("woff2"); 7 | } 8 | .material-icons-two-tone { 9 | font-family: "Material Icons Two Tone"; 10 | font-weight: normal; 11 | font-style: normal; 12 | font-size: 24px; 13 | line-height: 1; 14 | letter-spacing: normal; 15 | text-transform: none; 16 | display: inline-block; 17 | white-space: nowrap; 18 | word-wrap: normal; 19 | direction: ltr; 20 | -webkit-font-smoothing: antialiased; 21 | -moz-osx-font-smoothing: grayscale; 22 | text-rendering: optimizeLegibility; 23 | font-feature-settings: "liga"; 24 | } 25 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-static'; 2 | import preprocess from 'svelte-preprocess'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://github.com/sveltejs/svelte-preprocess 7 | // for more information about preprocessors 8 | preprocess: preprocess(), 9 | 10 | kit: { 11 | adapter: adapter({ 12 | pages: 'build/browser', 13 | assets: 'build/browser', 14 | fallback: null, 15 | precompress: false, 16 | strict: true, 17 | }), 18 | }, 19 | }; 20 | 21 | export default config; 22 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": false, 5 | "checkJs": false, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "strictNullChecks": true, 13 | "noImplicitAny": true 14 | } 15 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 16 | // 17 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 18 | // from the referenced tsconfig.json - TypeScript does not merge them in 19 | } 20 | -------------------------------------------------------------------------------- /web-client/iron-svelte-client/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import type { UserConfig } from 'vite'; 3 | import wasm from 'vite-plugin-wasm'; 4 | import topLevelAwait from 'vite-plugin-top-level-await'; 5 | 6 | const config: UserConfig = { 7 | mode: 'process.env.MODE' || 'development', 8 | plugins: [sveltekit(), wasm(), topLevelAwait()], 9 | server: { 10 | fs: { 11 | allow: ['./static'], 12 | }, 13 | }, 14 | }; 15 | 16 | export default config; 17 | -------------------------------------------------------------------------------- /xtask/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "xtask" 3 | version = "0.0.0" 4 | edition = "2021" 5 | publish = false 6 | 7 | [[bin]] 8 | name = "xtask" 9 | test = false 10 | 11 | [dependencies] 12 | anyhow = "1" 13 | pico-args = "0.5" 14 | xshell = "0.2" 15 | tinyjson = "2.5" 16 | 17 | [lints] 18 | workspace = true 19 | 20 | -------------------------------------------------------------------------------- /xtask/README.md: -------------------------------------------------------------------------------- 1 | # IronRDP project automation 2 | 3 | Free-form automation following [`cargo xtask`](https://github.com/matklad/cargo-xtask) specification. 4 | -------------------------------------------------------------------------------- /xtask/src/bin_version.rs: -------------------------------------------------------------------------------- 1 | // We pin the binaries to specific versions so we use the same artifact everywhere. 2 | // Hash of this file is used in CI for caching. 3 | 4 | use crate::bin_install::CargoPackage; 5 | 6 | pub const CARGO_FUZZ: CargoPackage = CargoPackage::new("cargo-fuzz", "0.12.0"); 7 | pub const CARGO_LLVM_COV: CargoPackage = CargoPackage::new("cargo-llvm-cov", "0.6.16"); 8 | pub const GRCOV: CargoPackage = CargoPackage::new("grcov", "0.8.20"); 9 | pub const WASM_PACK: CargoPackage = CargoPackage::new("wasm-pack", "0.13.1"); 10 | pub const TYPOS_CLI: CargoPackage = CargoPackage::new("typos-cli", "1.29.5").with_binary_name("typos"); 11 | pub const DIPLOMAT_TOOL: CargoPackage = CargoPackage::new("diplomat-tool", "0.7.1"); 12 | 13 | pub const WABT_VERSION: &str = "1.0.36"; 14 | -------------------------------------------------------------------------------- /xtask/src/clean.rs: -------------------------------------------------------------------------------- 1 | use crate::prelude::*; 2 | 3 | pub fn workspace(sh: &Shell) -> anyhow::Result<()> { 4 | let _s = Section::new("CLEAN"); 5 | 6 | println!("Remove wasm package folder…"); 7 | sh.remove_path("./crates/ironrdp-web/pkg")?; 8 | println!("Done."); 9 | 10 | println!("Remove npm folders…"); 11 | sh.remove_path("./web-client/iron-remote-desktop/node_modules")?; 12 | sh.remove_path("./web-client/iron-remote-desktop/dist")?; 13 | sh.remove_path("./web-client/iron-remote-desktop-rdp/node_modules")?; 14 | sh.remove_path("./web-client/iron-remote-desktop-rdp/dist")?; 15 | sh.remove_path("./web-client/iron-svelte-client/node_modules")?; 16 | println!("Done."); 17 | 18 | println!("Remove local cargo root folder…"); 19 | sh.remove_path("./.cargo/local_root")?; 20 | println!("Done."); 21 | 22 | cmd!(sh, "{CARGO} clean").run()?; 23 | 24 | Ok(()) 25 | } 26 | -------------------------------------------------------------------------------- /xtask/src/macros.rs: -------------------------------------------------------------------------------- 1 | macro_rules! windows_skip { 2 | () => { 3 | if cfg!(target_os = "windows") { 4 | eprintln!("Skip (unsupported on windows)"); 5 | return Ok(()); 6 | } 7 | }; 8 | } 9 | 10 | macro_rules! trace { 11 | ($($arg:tt)*) => {{ 12 | if $crate::is_verbose() { 13 | eprintln!($($arg)*); 14 | } 15 | }}; 16 | } 17 | 18 | macro_rules! run_cmd_in { 19 | ($sh:expr, $prefix:expr, $args:literal) => {{ 20 | let _guard = $sh.push_dir($prefix); 21 | eprintln!("In {}:", $sh.current_dir().display()); 22 | ::xshell::cmd!($sh, $args).run() 23 | }}; 24 | } 25 | -------------------------------------------------------------------------------- /xtask/src/prelude.rs: -------------------------------------------------------------------------------- 1 | pub use anyhow::Context as _; 2 | pub use xshell::{cmd, Shell}; 3 | 4 | pub use crate::bin_install::{cargo_install, is_installed}; 5 | pub use crate::bin_version::*; 6 | pub use crate::section::Section; 7 | pub use crate::{is_verbose, list_files, CARGO, FUZZ_TARGETS, WASM_PACKAGES}; 8 | -------------------------------------------------------------------------------- /xtask/src/section.rs: -------------------------------------------------------------------------------- 1 | use std::time::Instant; 2 | 3 | pub struct Section { 4 | name: &'static str, 5 | start: Instant, 6 | } 7 | 8 | impl Section { 9 | pub fn new(name: &'static str) -> Section { 10 | flush_all(); 11 | eprintln!("::group::{name}"); 12 | let start = Instant::now(); 13 | Self { name, start } 14 | } 15 | } 16 | 17 | impl Drop for Section { 18 | fn drop(&mut self) { 19 | flush_all(); 20 | eprintln!("{}: {:.2?}", self.name, self.start.elapsed()); 21 | eprintln!("::endgroup::"); 22 | } 23 | } 24 | 25 | fn flush_all() { 26 | use std::io::{self, Write as _}; 27 | 28 | let _ = io::stdout().flush(); 29 | let _ = io::stderr().flush(); 30 | } 31 | --------------------------------------------------------------------------------