From c691ef9c8dc74ff2893ce58a9302a7c5fae50a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Fri, 11 Aug 2023 17:03:36 -0400 Subject: [PATCH] allow selecting smartcard emulator at runtime rather than link time --- CMakeLists.txt | 8 +---- channels/smartcard/client/smartcard_main.h | 4 --- libfreerdp/utils/smartcard_call.c | 39 +++++++++++++++++----- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e4f0eefc..a5b62e8f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,7 +157,7 @@ message(STATUS "Git Revision ${GIT_REVISION}") set(FREERDP_MAJOR_DIR "freerdp${FREERDP_VERSION_MAJOR}") set(FREERDP_INCLUDE_DIR "include/${FREERDP_MAJOR_DIR}/") -option(WITH_SMARTCARD_EMULATE "Emulate smartcards instead of redirecting readers" OFF) +option(WITH_SMARTCARD_EMULATE "Emulate smartcards instead of redirecting readers" ON) if (WITH_SMARTCARD_EMULATE) add_definitions(-DWITH_SMARTCARD_EMULATE) find_package(ZLIB REQUIRED) @@ -585,10 +585,6 @@ endif() set(WAYLAND_FEATURE_PURPOSE "Wayland") set(WAYLAND_FEATURE_DESCRIPTION "Wayland client") -set(ZLIB_FEATURE_TYPE "REQUIRED") -set(ZLIB_FEATURE_PURPOSE "compression") -set(ZLIB_FEATURE_DESCRIPTION "data compression") - set(OPENSSL_FEATURE_TYPE "REQUIRED") set(OPENSSL_FEATURE_PURPOSE "cryptography") set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions") @@ -671,7 +667,6 @@ set(SOXR_FEATURE_DESCRIPTION "SOX audio resample library") if(WIN32) set(WAYLAND_FEATURE_TYPE "DISABLED") - set(ZLIB_FEATURE_TYPE "OPTIONAL") set(OSS_FEATURE_TYPE "DISABLED") set(ALSA_FEATURE_TYPE "DISABLED") set(SNDIO_FEATURE_TYPE "DISABLED") @@ -727,7 +722,6 @@ endif() find_feature(Wayland ${WAYLAND_FEATURE_TYPE} ${WAYLAND_FEATURE_PURPOSE} ${WAYLAND_FEATURE_DESCRIPTION}) -find_feature(ZLIB ${ZLIB_FEATURE_TYPE} ${ZLIB_FEATURE_PURPOSE} ${ZLIB_FEATURE_DESCRIPTION}) find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION}) find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION}) find_feature(OpenSLES ${OPENSLES_FEATURE_TYPE} ${OPENSLES_FEATURE_PURPOSE} ${OPENSLES_FEATURE_DESCRIPTION}) diff --git a/channels/smartcard/client/smartcard_main.h b/channels/smartcard/client/smartcard_main.h index ffeb175be..c58858810 100644 --- a/channels/smartcard/client/smartcard_main.h +++ b/channels/smartcard/client/smartcard_main.h @@ -35,10 +35,6 @@ #include #include -#if defined(WITH_SMARTCARD_EMULATE) -#include -#endif - #define TAG CHANNELS_TAG("smartcard.client") typedef struct diff --git a/libfreerdp/utils/smartcard_call.c b/libfreerdp/utils/smartcard_call.c index 6232f5031..df4b6639a 100644 --- a/libfreerdp/utils/smartcard_call.c +++ b/libfreerdp/utils/smartcard_call.c @@ -47,15 +47,17 @@ #include #define str(x) #x -#define wrap(ctx, fkt, ...) Emulate_##fkt(ctx->emulation, ##__VA_ARGS__) +#define wrap(ctx, fkt, ...) \ + ctx->useEmulatedCard ? Emulate_##fkt(ctx->emulation, ##__VA_ARGS__) : fkt(__VA_ARGS__) #else -#define wrap(ctx, fkt, ...) fkt(__VA_ARGS__) +#define wrap(ctx, fkt, ...) ctx->useEmulatedCard ? SCARD_F_INTERNAL_ERROR : fkt(__VA_ARGS__) #endif #define SCARD_MAX_TIMEOUT 60000 struct s_scard_call_context { + BOOL useEmulatedCard; HANDLE StartedEvent; wLinkedList* names; wHashTable* rgSCardContextList; @@ -1839,10 +1841,20 @@ scard_call_context* smartcard_call_context_new(const rdpSettings* settings) goto fail; #if defined(WITH_SMARTCARD_EMULATE) - ctx->emulation = Emulate_New(settings); - if (!ctx->emulation) + ctx->useEmulatedCard = settings->SmartcardEmulation; +#endif + + if (ctx->useEmulatedCard) + { +#if defined(WITH_SMARTCARD_EMULATE) + ctx->emulation = Emulate_New(settings); + if (!ctx->emulation) + goto fail; +#else + WLog_ERR(TAG, "Smartcard emulation requested, but not supported!"); goto fail; #endif + } ctx->rgSCardContextList = HashTable_New(FALSE); if (!ctx->rgSCardContextList) @@ -1870,9 +1882,17 @@ void smartcard_call_context_free(scard_call_context* ctx) { wrap(ctx, SCardReleaseStartedEvent); } -#if defined(WITH_SMARTCARD_EMULATE) - Emulate_Free(ctx->emulation); + + if (ctx->useEmulatedCard) + { +#ifdef WITH_SMARTCARD_EMULATE + if (ctx->emulation) + { + Emulate_Free(ctx->emulation); + ctx->emulation = NULL; + } #endif + } HashTable_Free(ctx->rgSCardContextList); CloseHandle(ctx->stopEvent); free(ctx); @@ -1936,10 +1956,11 @@ BOOL smartcard_call_is_configured(scard_call_context* ctx) WINPR_ASSERT(ctx); #if defined(WITH_SMARTCARD_EMULATE) - return Emulate_IsConfigured(ctx->emulation); -#else - return FALSE; + if (ctx->useEmulatedCard) + return Emulate_IsConfigured(ctx->emulation); #endif + + return FALSE; } BOOL smartcard_call_context_signal_stop(scard_call_context* ctx, BOOL reset)