allow selecting smartcard emulator at runtime rather than link time

This commit is contained in:
Marc-André Moreau 2023-08-11 17:03:36 -04:00 committed by akallabeth
parent 9f967b4942
commit c691ef9c8d
3 changed files with 31 additions and 20 deletions

View File

@ -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})

View File

@ -35,10 +35,6 @@
#include <freerdp/utils/smartcard_operations.h>
#include <freerdp/utils/smartcard_call.h>
#if defined(WITH_SMARTCARD_EMULATE)
#include <freerdp/emulate/scard/smartcard_emulate.h>
#endif
#define TAG CHANNELS_TAG("smartcard.client")
typedef struct

View File

@ -47,15 +47,17 @@
#include <freerdp/emulate/scard/smartcard_emulate.h>
#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)