diff --git a/client/common/file.c b/client/common/file.c index e465df202..63a8932e8 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -146,6 +146,7 @@ struct rdp_file DWORD RedirectPrinters; /* redirectprinters */ DWORD RedirectComPorts; /* redirectcomports */ DWORD RedirectSmartCards; /* redirectsmartcards */ + DWORD RedirectWebauthN; /* redirectwebauthn */ LPSTR RedirectCameras; /* camerastoredirect */ DWORD RedirectClipboard; /* redirectclipboard */ DWORD RedirectPosDevices; /* redirectposdevices */ @@ -307,6 +308,7 @@ static const char key_int_screen_mode_id[] = "screen mode id"; static const char key_int_singlemoninwindowedmode[] = "singlemoninwindowedmode"; static const char key_int_maximizetocurrentdisplays[] = "maximizetocurrentdisplays"; static const char key_int_use_multimon[] = "use multimon"; +static const char key_int_redirectwebauthn[] = "redirectwebauthn"; static SSIZE_T freerdp_client_rdp_file_add_line(rdpFile* file); static rdpFileLine* freerdp_client_rdp_file_find_line_by_name(const rdpFile* file, @@ -324,144 +326,146 @@ static BOOL freerdp_client_rdp_file_find_integer_entry(rdpFile* file, const char *outValue = NULL; *outLine = NULL; - if (_stricmp(name, "use multimon") == 0) + if (_stricmp(name, key_int_use_multimon) == 0) *outValue = &file->UseMultiMon; - else if (_stricmp(name, "maximizetocurrentdisplays") == 0) + else if (_stricmp(name, key_int_maximizetocurrentdisplays) == 0) *outValue = &file->MaximizeToCurrentDisplays; - else if (_stricmp(name, "singlemoninwindowedmode") == 0) + else if (_stricmp(name, key_int_singlemoninwindowedmode) == 0) *outValue = &file->SingleMonInWindowedMode; - else if (_stricmp(name, "screen mode id") == 0) + else if (_stricmp(name, key_int_screen_mode_id) == 0) *outValue = &file->ScreenModeId; - else if (_stricmp(name, "span monitors") == 0) + else if (_stricmp(name, key_int_span_monitors) == 0) *outValue = &file->SpanMonitors; - else if (_stricmp(name, "smart sizing") == 0) + else if (_stricmp(name, key_int_smart_sizing) == 0) *outValue = &file->SmartSizing; - else if (_stricmp(name, "dynamic resolution") == 0) + else if (_stricmp(name, key_int_dynamic_resolution) == 0) *outValue = &file->DynamicResolution; - else if (_stricmp(name, "enablesuperpan") == 0) + else if (_stricmp(name, key_int_enablesuperpan) == 0) *outValue = &file->EnableSuperSpan; - else if (_stricmp(name, "superpanaccelerationfactor") == 0) + else if (_stricmp(name, key_int_superpanaccelerationfactor) == 0) *outValue = &file->SuperSpanAccelerationFactor; - else if (_stricmp(name, "desktopwidth") == 0) + else if (_stricmp(name, key_int_desktopwidth) == 0) *outValue = &file->DesktopWidth; - else if (_stricmp(name, "desktopheight") == 0) + else if (_stricmp(name, key_int_desktopheight) == 0) *outValue = &file->DesktopHeight; - else if (_stricmp(name, "desktop size id") == 0) + else if (_stricmp(name, key_int_desktop_size_id) == 0) *outValue = &file->DesktopSizeId; - else if (_stricmp(name, "session bpp") == 0) + else if (_stricmp(name, key_int_session_bpp) == 0) *outValue = &file->SessionBpp; - else if (_stricmp(name, "desktopscalefactor") == 0) + else if (_stricmp(name, key_int_desktopscalefactor) == 0) *outValue = &file->DesktopScaleFactor; - else if (_stricmp(name, "compression") == 0) + else if (_stricmp(name, key_int_compression) == 0) *outValue = &file->Compression; - else if (_stricmp(name, "keyboardhook") == 0) + else if (_stricmp(name, key_int_keyboardhook) == 0) *outValue = &file->KeyboardHook; - else if (_stricmp(name, "disable ctrl+alt+del") == 0) + else if (_stricmp(name, key_int_disable_ctrl_alt_del) == 0) *outValue = &file->DisableCtrlAltDel; - else if (_stricmp(name, "audiomode") == 0) + else if (_stricmp(name, key_int_audiomode) == 0) *outValue = &file->AudioMode; - else if (_stricmp(name, "audioqualitymode") == 0) + else if (_stricmp(name, key_int_audioqualitymode) == 0) *outValue = &file->AudioQualityMode; - else if (_stricmp(name, "audiocapturemode") == 0) + else if (_stricmp(name, key_int_audiocapturemode) == 0) *outValue = &file->AudioCaptureMode; - else if (_stricmp(name, "encode redirected video capture") == 0) + else if (_stricmp(name, key_int_encode_redirected_video_capture) == 0) *outValue = &file->EncodeRedirectedVideoCapture; - else if (_stricmp(name, "redirected video capture encoding quality") == 0) + else if (_stricmp(name, key_int_redirected_video_capture_encoding_quality) == 0) *outValue = &file->RedirectedVideoCaptureEncodingQuality; - else if (_stricmp(name, "videoplaybackmode") == 0) + else if (_stricmp(name, key_int_videoplaybackmode) == 0) *outValue = &file->VideoPlaybackMode; - else if (_stricmp(name, "connection type") == 0) + else if (_stricmp(name, key_int_connection_type) == 0) *outValue = &file->ConnectionType; - else if (_stricmp(name, "networkautodetect") == 0) + else if (_stricmp(name, key_int_networkautodetect) == 0) *outValue = &file->NetworkAutoDetect; - else if (_stricmp(name, "bandwidthautodetect") == 0) + else if (_stricmp(name, key_int_bandwidthautodetect) == 0) *outValue = &file->BandwidthAutoDetect; - else if (_stricmp(name, "pinconnectionbar") == 0) + else if (_stricmp(name, key_int_pinconnectionbar) == 0) *outValue = &file->PinConnectionBar; - else if (_stricmp(name, "displayconnectionbar") == 0) + else if (_stricmp(name, key_int_displayconnectionbar) == 0) *outValue = &file->DisplayConnectionBar; - else if (_stricmp(name, "workspaceid") == 0) + else if (_stricmp(name, key_int_workspaceid) == 0) *outValue = &file->WorkspaceId; - else if (_stricmp(name, "enableworkspacereconnect") == 0) + else if (_stricmp(name, key_int_enableworkspacereconnect) == 0) *outValue = &file->EnableWorkspaceReconnect; - else if (_stricmp(name, "disable wallpaper") == 0) + else if (_stricmp(name, key_int_disable_wallpaper) == 0) *outValue = &file->DisableWallpaper; - else if (_stricmp(name, "allow font smoothing") == 0) + else if (_stricmp(name, key_int_allow_font_smoothing) == 0) *outValue = &file->AllowFontSmoothing; - else if (_stricmp(name, "allow desktop composition") == 0) + else if (_stricmp(name, key_int_allow_desktop_composition) == 0) *outValue = &file->AllowDesktopComposition; - else if (_stricmp(name, "disable full window drag") == 0) + else if (_stricmp(name, key_int_disable_full_window_drag) == 0) *outValue = &file->DisableFullWindowDrag; - else if (_stricmp(name, "disable menu anims") == 0) + else if (_stricmp(name, key_int_disable_menu_anims) == 0) *outValue = &file->DisableMenuAnims; - else if (_stricmp(name, "disable themes") == 0) + else if (_stricmp(name, key_int_disable_themes) == 0) *outValue = &file->DisableThemes; - else if (_stricmp(name, "disable cursor setting") == 0) + else if (_stricmp(name, key_int_disable_cursor_setting) == 0) *outValue = &file->DisableCursorSetting; - else if (_stricmp(name, "bitmapcachesize") == 0) + else if (_stricmp(name, key_int_bitmapcachesize) == 0) *outValue = &file->BitmapCacheSize; - else if (_stricmp(name, "bitmapcachepersistenable") == 0) + else if (_stricmp(name, key_int_bitmapcachepersistenable) == 0) *outValue = &file->BitmapCachePersistEnable; - else if (_stricmp(name, "server port") == 0) + else if (_stricmp(name, key_int_server_port) == 0) *outValue = &file->ServerPort; - else if (_stricmp(name, "redirectdrives") == 0) + else if (_stricmp(name, key_int_redirectdrives) == 0) *outValue = &file->RedirectDrives; - else if (_stricmp(name, "redirectprinters") == 0) + else if (_stricmp(name, key_int_redirectprinters) == 0) *outValue = &file->RedirectPrinters; - else if (_stricmp(name, "redirectcomports") == 0) + else if (_stricmp(name, key_int_redirectcomports) == 0) *outValue = &file->RedirectComPorts; - else if (_stricmp(name, "redirectsmartcards") == 0) + else if (_stricmp(name, key_int_redirectsmartcards) == 0) *outValue = &file->RedirectSmartCards; - else if (_stricmp(name, "redirectclipboard") == 0) + else if (_stricmp(name, key_int_redirectclipboard) == 0) *outValue = &file->RedirectClipboard; - else if (_stricmp(name, "redirectposdevices") == 0) + else if (_stricmp(name, key_int_redirectposdevices) == 0) *outValue = &file->RedirectPosDevices; - else if (_stricmp(name, "redirectdirectx") == 0) + else if (_stricmp(name, key_int_redirectdirectx) == 0) *outValue = &file->RedirectDirectX; - else if (_stricmp(name, "disableprinterredirection") == 0) + else if (_stricmp(name, key_int_disableprinterredirection) == 0) *outValue = &file->DisablePrinterRedirection; - else if (_stricmp(name, "disableclipboardredirection") == 0) + else if (_stricmp(name, key_int_disableclipboardredirection) == 0) *outValue = &file->DisableClipboardRedirection; - else if (_stricmp(name, "connect to console") == 0) + else if (_stricmp(name, key_int_connect_to_console) == 0) *outValue = &file->ConnectToConsole; - else if (_stricmp(name, "administrative session") == 0) + else if (_stricmp(name, key_int_administrative_session) == 0) *outValue = &file->AdministrativeSession; - else if (_stricmp(name, "autoreconnection enabled") == 0) + else if (_stricmp(name, key_int_autoreconnection_enabled) == 0) *outValue = &file->AutoReconnectionEnabled; - else if (_stricmp(name, "autoreconnect max retries") == 0) + else if (_stricmp(name, key_int_autoreconnect_max_retries) == 0) *outValue = &file->AutoReconnectMaxRetries; - else if (_stricmp(name, "public mode") == 0) + else if (_stricmp(name, key_int_public_mode) == 0) *outValue = &file->PublicMode; - else if (_stricmp(name, "authentication level") == 0) + else if (_stricmp(name, key_int_authentication_level) == 0) *outValue = &file->AuthenticationLevel; - else if (_stricmp(name, "promptcredentialonce") == 0) + else if (_stricmp(name, key_int_promptcredentialonce) == 0) *outValue = &file->PromptCredentialOnce; - else if ((_stricmp(name, "prompt for credentials") == 0)) + else if ((_stricmp(name, key_int_prompt_for_credentials) == 0)) *outValue = &file->PromptForCredentials; - else if (_stricmp(name, "negotiate security layer") == 0) + else if (_stricmp(name, key_int_negotiate_security_layer) == 0) *outValue = &file->NegotiateSecurityLayer; - else if (_stricmp(name, "enablecredsspsupport") == 0) + else if (_stricmp(name, key_int_enablecredsspsupport) == 0) *outValue = &file->EnableCredSSPSupport; - else if (_stricmp(name, "remoteapplicationmode") == 0) + else if (_stricmp(name, key_int_remoteapplicationmode) == 0) *outValue = &file->RemoteApplicationMode; - else if (_stricmp(name, "remoteapplicationexpandcmdline") == 0) + else if (_stricmp(name, key_int_remoteapplicationexpandcmdline) == 0) *outValue = &file->RemoteApplicationExpandCmdLine; - else if (_stricmp(name, "remoteapplicationexpandworkingdir") == 0) + else if (_stricmp(name, key_int_remoteapplicationexpandworkingdir) == 0) *outValue = &file->RemoteApplicationExpandWorkingDir; - else if (_stricmp(name, "disableconnectionsharing") == 0) + else if (_stricmp(name, key_int_disableconnectionsharing) == 0) *outValue = &file->DisableConnectionSharing; - else if (_stricmp(name, "disableremoteappcapscheck") == 0) + else if (_stricmp(name, key_int_disableremoteappcapscheck) == 0) *outValue = &file->DisableRemoteAppCapsCheck; - else if (_stricmp(name, "gatewayusagemethod") == 0) + else if (_stricmp(name, key_int_gatewayusagemethod) == 0) *outValue = &file->GatewayUsageMethod; - else if (_stricmp(name, "gatewayprofileusagemethod") == 0) + else if (_stricmp(name, key_int_gatewayprofileusagemethod) == 0) *outValue = &file->GatewayProfileUsageMethod; - else if (_stricmp(name, "gatewaycredentialssource") == 0) + else if (_stricmp(name, key_int_gatewaycredentialssource) == 0) *outValue = &file->GatewayCredentialsSource; - else if (_stricmp(name, "use redirection server name") == 0) + else if (_stricmp(name, key_int_use_redirection_server_name) == 0) *outValue = &file->UseRedirectionServerName; - else if (_stricmp(name, "rdgiskdcproxy") == 0) + else if (_stricmp(name, key_int_rdgiskdcproxy) == 0) *outValue = &file->RdgIsKdcProxy; + else if (_stricmp(name, key_int_redirectwebauthn) == 0) + *outValue = &file->RedirectWebauthN; else { rdpFileLine* line = freerdp_client_rdp_file_find_line_by_name(file, name); @@ -1169,6 +1173,7 @@ BOOL freerdp_client_populate_rdp_file_from_settings(rdpFile* file, const rdpSett file->AutoReconnectionEnabled = freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled); file->RedirectSmartCards = freerdp_settings_get_bool(settings, FreeRDP_RedirectSmartCards); + file->RedirectWebauthN = freerdp_settings_get_bool(settings, FreeRDP_RedirectWebAuthN); redirectCameras = freerdp_client_channel_args_to_string(settings, RDPECAM_DVC_CHANNEL_NAME, "device:"); @@ -1474,6 +1479,7 @@ size_t freerdp_client_write_rdp_file_buffer(const rdpFile* file, char* buffer, s WRITE_SETTING_INT(key_int_gatewaycredentialssource, file->GatewayCredentialsSource); WRITE_SETTING_INT(key_int_use_redirection_server_name, file->UseRedirectionServerName); WRITE_SETTING_INT(key_int_rdgiskdcproxy, file->RdgIsKdcProxy); + WRITE_SETTING_INT(key_int_redirectwebauthn, file->RedirectWebauthN); /* string parameters */ WRITE_SETTING_STR(key_str_username, file->Username); @@ -2088,6 +2094,13 @@ BOOL freerdp_client_populate_settings_from_rdp_file(const rdpFile* file, rdpSett return FALSE; } + if (~file->RedirectWebauthN) + { + if (!freerdp_settings_set_bool(settings, FreeRDP_RedirectWebAuthN, + file->RedirectWebauthN != 0)) + return FALSE; + } + if (~file->RedirectClipboard) { if (!freerdp_settings_set_bool(settings, FreeRDP_RedirectClipboard, diff --git a/include/freerdp/channels/rdpewa.h b/include/freerdp/channels/rdpewa.h new file mode 100644 index 000000000..9348c7a8a --- /dev/null +++ b/include/freerdp/channels/rdpewa.h @@ -0,0 +1,38 @@ +/** + * FreeRDP: A Remote Desktop Protocol Implementation + * Video Capture Virtual Channel Extension + * + * Copyright 2023 Armin Novak + * Copyright 2023 Thincast Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FREERDP_CHANNEL_RDPEWA_H +#define FREERDP_CHANNEL_RDPEWA_H + +#include +#include +#include + +#define RDPEWA_DVC_CHANNEL_NAME "rdpewa" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __cplusplus +} +#endif +#endif /* FREERDP_CHANNEL_RDPEWA_H */ diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 1d3d83725..232840834 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -902,6 +902,7 @@ extern "C" #define FreeRDP_RedirectHomeDrive (4289) #define FreeRDP_DrivesToRedirect (4290) #define FreeRDP_RedirectSmartCards (4416) +#define FreeRDP_RedirectWebAuthN (4417) #define FreeRDP_RedirectPrinters (4544) #define FreeRDP_RedirectSerialPorts (4672) #define FreeRDP_RedirectParallelPorts (4673) @@ -1608,7 +1609,9 @@ extern "C" /* Smartcard Redirection */ ALIGN64 BOOL RedirectSmartCards; /* 4416 */ - UINT64 padding4544[4544 - 4417]; /* 4417 */ + /* WebAuthN Redirection */ + ALIGN64 BOOL RedirectWebAuthN; /* 4417 */ + UINT64 padding4544[4544 - 4418]; /* 4418 */ /* Printer Redirection */ ALIGN64 BOOL RedirectPrinters; /* 4544 */ diff --git a/libfreerdp/common/settings_getters.c b/libfreerdp/common/settings_getters.c index 2ea4f8196..7fe9c2283 100644 --- a/libfreerdp/common/settings_getters.c +++ b/libfreerdp/common/settings_getters.c @@ -432,6 +432,9 @@ BOOL freerdp_settings_get_bool(const rdpSettings* settings, size_t id) case FreeRDP_RedirectSmartCards: return settings->RedirectSmartCards; + case FreeRDP_RedirectWebAuthN: + return settings->RedirectWebAuthN; + case FreeRDP_RefreshRect: return settings->RefreshRect; @@ -1123,6 +1126,10 @@ BOOL freerdp_settings_set_bool(rdpSettings* settings, size_t id, BOOL val) settings->RedirectSmartCards = cnv.c; break; + case FreeRDP_RedirectWebAuthN: + settings->RedirectWebAuthN = cnv.c; + break; + case FreeRDP_RefreshRect: settings->RefreshRect = cnv.c; break; diff --git a/libfreerdp/common/settings_str.c b/libfreerdp/common/settings_str.c index d52332a25..48f013c88 100644 --- a/libfreerdp/common/settings_str.c +++ b/libfreerdp/common/settings_str.c @@ -179,6 +179,7 @@ static const struct settings_str_entry settings_map[] = { { FreeRDP_RedirectPrinters, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectPrinters" }, { FreeRDP_RedirectSerialPorts, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectSerialPorts" }, { FreeRDP_RedirectSmartCards, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectSmartCards" }, + { FreeRDP_RedirectWebAuthN, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RedirectWebAuthN" }, { FreeRDP_RefreshRect, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RefreshRect" }, { FreeRDP_RemdeskVirtualChannel, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_RemdeskVirtualChannel" }, { FreeRDP_RemoteAppLanguageBarSupported, FREERDP_SETTINGS_TYPE_BOOL, diff --git a/libfreerdp/core/test/settings_property_lists.h b/libfreerdp/core/test/settings_property_lists.h index 9745e4135..f4247b322 100644 --- a/libfreerdp/core/test/settings_property_lists.h +++ b/libfreerdp/core/test/settings_property_lists.h @@ -128,6 +128,7 @@ static const size_t bool_list_indices[] = { FreeRDP_RedirectPrinters, FreeRDP_RedirectSerialPorts, FreeRDP_RedirectSmartCards, + FreeRDP_RedirectWebAuthN, FreeRDP_RefreshRect, FreeRDP_RemdeskVirtualChannel, FreeRDP_RemoteAppLanguageBarSupported,