diff --git a/client/common/client.c b/client/common/client.c index 52f5a959e..3036e97cf 100644 --- a/client/common/client.c +++ b/client/common/client.c @@ -1099,8 +1099,12 @@ static BOOL client_cli_get_avd_access_token(freerdp* instance, char** token) freerdp_settings_get_string(instance->context->settings, FreeRDP_GatewayAvdClientID); const char* base = freerdp_settings_get_string(instance->context->settings, FreeRDP_GatewayAzureActiveDirectory); - const char* tenantid = - freerdp_settings_get_string(instance->context->settings, FreeRDP_GatewayAvdAadtenantid); + const BOOL useTenant = + freerdp_settings_get_bool(instance->context->settings, FreeRDP_GatewayAvdUseTenantid); + const char* tenantid = "common"; + if (useTenant) + tenantid = + freerdp_settings_get_string(instance->context->settings, FreeRDP_GatewayAvdAadtenantid); if (!base || !tenantid || !client_id) goto cleanup; diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 5ded23445..81fafbcc8 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -3722,6 +3722,25 @@ static int parse_aad_options(rdpSettings* settings, const COMMAND_LINE_ARGUMENT_ BOOL handled = FALSE; const char* val = ptr[x]; + if (option_starts_with("use-tenantid", val)) + { + PARSE_ON_OFF_RESULT bval = parse_on_off_option(val); + if (bval == PARSE_FAIL) + { + rc = COMMAND_LINE_ERROR_UNEXPECTED_VALUE; + break; + } + else + { + if (!freerdp_settings_set_bool(settings, FreeRDP_GatewayAvdUseTenantid, + bval != PARSE_OFF)) + { + rc = COMMAND_LINE_ERROR_UNEXPECTED_VALUE; + break; + } + } + continue; + } for (size_t y = 0; y < ARRAYSIZE(amap); y++) { const struct app_map* cur = &amap[y]; diff --git a/client/common/cmdline.h b/client/common/cmdline.h index 35d610993..d3d008565 100644 --- a/client/common/cmdline.h +++ b/client/common/cmdline.h @@ -26,8 +26,8 @@ static const COMMAND_LINE_ARGUMENT_A global_cmd_args[] = { { "a", COMMAND_LINE_VALUE_REQUIRED, "[,]", NULL, NULL, -1, "addin", "Addin" }, - { "azure", COMMAND_LINE_VALUE_REQUIRED, "[tenantid:],[ad:]", NULL, NULL, -1, NULL, - "AzureAD options" }, + { "azure", COMMAND_LINE_VALUE_REQUIRED, "[tenantid:],[use-tenantid[:[on|off]],[ad:]", + NULL, NULL, -1, NULL, "AzureAD options" }, { "action-script", COMMAND_LINE_VALUE_REQUIRED, "", "~/.config/freerdp/action.sh", NULL, -1, NULL, "Action script" }, { "admin", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, "console", diff --git a/include/freerdp/settings_types_private.h b/include/freerdp/settings_types_private.h index ab174f945..b47e788a1 100644 --- a/include/freerdp/settings_types_private.h +++ b/include/freerdp/settings_types_private.h @@ -495,7 +495,10 @@ struct rdp_settings SETTINGS_DEPRECATED(ALIGN64 UINT16 ProxyPort); /* 2017 */ SETTINGS_DEPRECATED(ALIGN64 char* ProxyUsername); /* 2018 */ SETTINGS_DEPRECATED(ALIGN64 char* ProxyPassword); /* 2019 */ - UINT64 padding2112[2112 - 2020]; /* 2020 */ + SETTINGS_DEPRECATED(ALIGN64 BOOL GatewayAvdUseTenantid); /** 2020 + * @since version 3.10.0 + */ + UINT64 padding2112[2112 - 2021]; /* 2021 */ /** * RemoteApp diff --git a/libfreerdp/common/settings_getters.c b/libfreerdp/common/settings_getters.c index 4f858b886..c0845ec3a 100644 --- a/libfreerdp/common/settings_getters.c +++ b/libfreerdp/common/settings_getters.c @@ -240,6 +240,9 @@ BOOL freerdp_settings_get_bool(const rdpSettings* settings, FreeRDP_Settings_Key case FreeRDP_GatewayArmTransport: return settings->GatewayArmTransport; + case FreeRDP_GatewayAvdUseTenantid: + return settings->GatewayAvdUseTenantid; + case FreeRDP_GatewayBypassLocal: return settings->GatewayBypassLocal; @@ -904,6 +907,10 @@ BOOL freerdp_settings_set_bool(rdpSettings* settings, FreeRDP_Settings_Keys_Bool settings->GatewayArmTransport = cnv.c; break; + case FreeRDP_GatewayAvdUseTenantid: + settings->GatewayAvdUseTenantid = cnv.c; + break; + case FreeRDP_GatewayBypassLocal: settings->GatewayBypassLocal = cnv.c; break; diff --git a/libfreerdp/common/settings_str.h b/libfreerdp/common/settings_str.h index 2ba03fe30..093df8361 100644 --- a/libfreerdp/common/settings_str.h +++ b/libfreerdp/common/settings_str.h @@ -109,6 +109,7 @@ static const struct settings_str_entry settings_map[] = { "FreeRDP_FrameMarkerCommandEnabled" }, { FreeRDP_Fullscreen, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_Fullscreen" }, { FreeRDP_GatewayArmTransport, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayArmTransport" }, + { FreeRDP_GatewayAvdUseTenantid, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayAvdUseTenantid" }, { FreeRDP_GatewayBypassLocal, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayBypassLocal" }, { FreeRDP_GatewayEnabled, FREERDP_SETTINGS_TYPE_BOOL, "FreeRDP_GatewayEnabled" }, { FreeRDP_GatewayHttpExtAuthSspiNtlm, FREERDP_SETTINGS_TYPE_BOOL, diff --git a/libfreerdp/core/aad.c b/libfreerdp/core/aad.c index 18213c479..c1178ccd5 100644 --- a/libfreerdp/core/aad.c +++ b/libfreerdp/core/aad.c @@ -868,8 +868,12 @@ BOOL aad_fetch_wellknown(rdpAad* aad) const char* base = freerdp_settings_get_string(aad->rdpcontext->settings, FreeRDP_GatewayAzureActiveDirectory); - const char* tenantid = - freerdp_settings_get_string(aad->rdpcontext->settings, FreeRDP_GatewayAvdAadtenantid); + const BOOL useTenant = + freerdp_settings_get_bool(aad->rdpcontext->settings, FreeRDP_GatewayAvdUseTenantid); + const char* tenantid = "common"; + if (useTenant) + tenantid = + freerdp_settings_get_string(aad->rdpcontext->settings, FreeRDP_GatewayAvdAadtenantid); rdp->wellknown = freerdp_utils_aad_get_wellknown(aad->log, base, tenantid); return rdp->wellknown ? TRUE : FALSE; } diff --git a/libfreerdp/core/gateway/arm.c b/libfreerdp/core/gateway/arm.c index 288293db7..4433f6ac9 100644 --- a/libfreerdp/core/gateway/arm.c +++ b/libfreerdp/core/gateway/arm.c @@ -170,8 +170,12 @@ static BOOL arm_fetch_wellknown(rdpArm* arm) const char* base = freerdp_settings_get_string(arm->context->settings, FreeRDP_GatewayAzureActiveDirectory); - const char* tenantid = - freerdp_settings_get_string(arm->context->settings, FreeRDP_GatewayAvdAadtenantid); + const BOOL useTenant = + freerdp_settings_get_bool(arm->context->settings, FreeRDP_GatewayAvdUseTenantid); + const char* tenantid = "common"; + if (useTenant) + tenantid = + freerdp_settings_get_string(arm->context->settings, FreeRDP_GatewayAvdAadtenantid); rdp->wellknown = freerdp_utils_aad_get_wellknown(arm->log, base, tenantid); return rdp->wellknown ? TRUE : FALSE; diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index f57f3aec6..618c19629 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -829,6 +829,8 @@ rdpSettings* freerdp_settings_new(DWORD flags) goto out_fail; if (!freerdp_settings_set_string(settings, FreeRDP_GatewayAvdAadtenantid, "common")) goto out_fail; + if (!freerdp_settings_set_bool(settings, FreeRDP_GatewayAvdUseTenantid, FALSE)) + goto out_fail; if (!freerdp_settings_set_uint32(settings, FreeRDP_DesktopPhysicalWidth, 1000)) goto out_fail; if (!freerdp_settings_set_uint32(settings, FreeRDP_DesktopPhysicalHeight, 1000)) diff --git a/libfreerdp/core/test/settings_property_lists.h b/libfreerdp/core/test/settings_property_lists.h index fe568d573..5ba8f0060 100644 --- a/libfreerdp/core/test/settings_property_lists.h +++ b/libfreerdp/core/test/settings_property_lists.h @@ -64,6 +64,7 @@ static const size_t bool_list_indices[] = { FreeRDP_FrameMarkerCommandEnabled, FreeRDP_Fullscreen, FreeRDP_GatewayArmTransport, + FreeRDP_GatewayAvdUseTenantid, FreeRDP_GatewayBypassLocal, FreeRDP_GatewayEnabled, FreeRDP_GatewayHttpExtAuthSspiNtlm,