From 3e2694054758592b5b584d07af6744217c3988fa Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 15 Jun 2015 09:47:16 +0200 Subject: [PATCH 1/8] Allowing UPN syntax for user. --- client/common/cmdline.c | 49 +++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 6b40ca630..baa4c848b 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -553,7 +553,7 @@ static char** freerdp_command_line_parse_comma_separated_values_offset(char* lis return NULL; p = t; if (count > 0) - MoveMemory(&p[1], p, sizeof(char*) * *count); + MoveMemory(&p[1], p, sizeof(char*) * *count); (*count)++; return p; @@ -795,17 +795,45 @@ int freerdp_client_command_line_post_filter(void* context, COMMAND_LINE_ARGUMENT int freerdp_parse_username(char* username, char** user, char** domain) { char* p; - int length; + char* u; + int length = 0; p = strchr(username, '\\'); + u = strchr(username, '@'); if (p) { length = (int) (p - username); + *user = _strdup(&p[1]); + if (!*user) + return -1; + *domain = (char*) calloc(length + 1UL, sizeof(char)); + if (!*domain) + { + free (*user); + *user = NULL; + return -1; + } + strncpy(*domain, username, length); (*domain)[length] = '\0'; - *user = _strdup(&p[1]); + } + else if (u) + { + length = (int) (u - username); + *domain = _strdup(&u[1]); + if (!*domain) + return -1; + + *user = (char*) calloc(length + 1UL, sizeof(char)); + if (!*user) + { + free(*domain); + *domain = NULL; + } + strncpy(*user, username, length); + (*user)[length] = '\0'; } else { @@ -814,6 +842,9 @@ int freerdp_parse_username(char* username, char** user, char** domain) * as username 'user@corp.net', domain empty. */ *user = _strdup(username); + if (!*user) + return -1; + *domain = NULL; } @@ -1209,7 +1240,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (compatibility) { - WLog_WARN(TAG, "Using deprecated command-line interface!"); + WLog_WARN(TAG, "Using deprecated command-line interface!"); return freerdp_client_parse_old_command_line_arguments(argc, argv, settings); } else @@ -1439,7 +1470,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (!id) { - WLog_ERR(TAG, "Could not identify keyboard layout: %s", arg->Value); + WLog_ERR(TAG, "Could not identify keyboard layout: %s", arg->Value); } } @@ -1818,7 +1849,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } else { - WLog_ERR(TAG, "unknown protocol security: %s", arg->Value); + WLog_ERR(TAG, "unknown protocol security: %s", arg->Value); } } CommandLineSwitchCase(arg, "encryption-methods") @@ -1842,7 +1873,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, else if (!strcmp(p[i], "FIPS")) settings->EncryptionMethods |= ENCRYPTION_METHOD_FIPS; else - WLog_ERR(TAG, "unknown encryption method '%s'", p[i]); + WLog_ERR(TAG, "unknown encryption method '%s'", p[i]); } free(p); @@ -1998,7 +2029,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } else { - WLog_ERR(TAG, "reconnect-cookie: invalid base64 '%s'", arg->Value); + WLog_ERR(TAG, "reconnect-cookie: invalid base64 '%s'", arg->Value); } } CommandLineSwitchCase(arg, "print-reconnect-cookie") @@ -2062,7 +2093,7 @@ int freerdp_client_load_static_channel_addin(rdpChannels* channels, rdpSettings* { if (freerdp_channels_client_load(channels, settings, entry, data) == 0) { - WLog_INFO(TAG, "loading channel %s", name); + WLog_INFO(TAG, "loading channel %s", name); return 0; } } From 64529b6d60a1fccaa030e39854e357a8184e8abb Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 18 Jun 2015 11:35:22 +0200 Subject: [PATCH 2/8] Using last @ for domain split. Command line parser splits username after parsing all options. --- client/common/cmdline.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index baa4c848b..4c42046dc 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -553,7 +553,7 @@ static char** freerdp_command_line_parse_comma_separated_values_offset(char* lis return NULL; p = t; if (count > 0) - MoveMemory(&p[1], p, sizeof(char*) * *count); + MoveMemory(&p[1], p, sizeof(char*) * *count); (*count)++; return p; @@ -799,7 +799,7 @@ int freerdp_parse_username(char* username, char** user, char** domain) int length = 0; p = strchr(username, '\\'); - u = strchr(username, '@'); + u = strrchr(username, '@'); if (p) { @@ -1229,6 +1229,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, int argc, char** argv, BOOL allowUnknown) { char* p; + char* user = NULL; + char* gwUser = NULL; char* str; int length; int status; @@ -1490,13 +1492,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "u") { - char* user; - char* domain; - - freerdp_parse_username(arg->Value, &user, &domain); - - settings->Username = user; - settings->Domain = domain; + user = _strdup(arg->Value); } CommandLineSwitchCase(arg, "d") { @@ -1537,14 +1533,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "gu") { - char* user; - char* domain; - - freerdp_parse_username(arg->Value, &user, &domain); - - settings->GatewayUsername = user; - settings->GatewayDomain = domain; - + gwUser = _strdup(arg->Value); settings->GatewayUseSameCredentials = FALSE; } CommandLineSwitchCase(arg, "gd") @@ -2049,6 +2038,19 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } while ((arg = CommandLineFindNextArgumentA(arg)) != NULL); + if (!settings->Domain && user) + { + freerdp_parse_username(arg->Value, &settings->Username, &settings->Domain); + free(user); + } + + if (!settings->GatewayDomain && gwUser) + { + freerdp_parse_username(arg->Value, &settings->GatewayUsername, + &settings->GatewayDomain); + free(gwUser); + } + freerdp_performance_flags_make(settings); if (settings->SupportGraphicsPipeline) From d5c3f210e97b0882ec110c8cda9dd9f8c37aeabb Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 18 Jun 2015 11:49:16 +0200 Subject: [PATCH 3/8] Fixed variable parsed. --- client/common/cmdline.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 4c42046dc..516a09ab8 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2040,13 +2040,13 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (!settings->Domain && user) { - freerdp_parse_username(arg->Value, &settings->Username, &settings->Domain); + freerdp_parse_username(user, &settings->Username, &settings->Domain); free(user); } if (!settings->GatewayDomain && gwUser) { - freerdp_parse_username(arg->Value, &settings->GatewayUsername, + freerdp_parse_username(gwUser, &settings->GatewayUsername, &settings->GatewayDomain); free(gwUser); } From 427d85f5f0228d6635ff7d809f3754e44d2db414 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 18 Jun 2015 12:01:17 +0200 Subject: [PATCH 4/8] Added user setting if no domain provided. --- client/common/cmdline.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 516a09ab8..adac37442 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2043,6 +2043,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, freerdp_parse_username(user, &settings->Username, &settings->Domain); free(user); } + else + settings->Username = user; if (!settings->GatewayDomain && gwUser) { @@ -2050,6 +2052,8 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, &settings->GatewayDomain); free(gwUser); } + else + settings->GatewayUsername = gwUser; freerdp_performance_flags_make(settings); From 90cc7eb3c89ba5d3eb2a323d7c63f8feabc630a3 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 18 Jun 2015 12:24:22 +0200 Subject: [PATCH 5/8] UPN syntax fix: domain must be empty, not NULL. --- client/common/cmdline.c | 43 ++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index adac37442..68bd20aea 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -799,7 +799,10 @@ int freerdp_parse_username(char* username, char** user, char** domain) int length = 0; p = strchr(username, '\\'); - u = strrchr(username, '@'); + p = strrchr(username, '@'); + + *user = NULL; + *domain = NULL; if (p) { @@ -819,34 +822,34 @@ int freerdp_parse_username(char* username, char** user, char** domain) strncpy(*domain, username, length); (*domain)[length] = '\0'; } - else if (u) - { - length = (int) (u - username); - *domain = _strdup(&u[1]); - if (!*domain) - return -1; - - *user = (char*) calloc(length + 1UL, sizeof(char)); - if (!*user) - { - free(*domain); - *domain = NULL; - } - strncpy(*user, username, length); - (*user)[length] = '\0'; - } - else + else if (username) { /* Do not break up the name for '@'; both credSSP and the * ClientInfo PDU expect 'user@corp.net' to be transmitted - * as username 'user@corp.net', domain empty. + * as username 'user@corp.net', domain empty (not NULL!). */ *user = _strdup(username); if (!*user) return -1; - *domain = NULL; + /* If only username is given, prefix that with 'TARGET' + * otherwise set the domain to an empty string. + * NOTE: Domain NULL will result in undefined behavior. + */ + if (!u) + *domain = _strdup("TARGET"); + else + *domain = _strdup("\0"); + + if (!*domain) + { + free(*user); + *user = NULL; + return -1; + } } + else + return -1; return 0; } From e563b2b62e48d3881ef51cb96b29f4cf0fd1486a Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 18 Jun 2015 13:01:28 +0200 Subject: [PATCH 6/8] Fixed domain setting for windows client. --- client/Windows/wf_client.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/Windows/wf_client.c b/client/Windows/wf_client.c index 4fdd56c87..ceff1a2e7 100644 --- a/client/Windows/wf_client.c +++ b/client/Windows/wf_client.c @@ -537,6 +537,8 @@ BOOL wf_authenticate(freerdp* instance, char** username, char** password, char** if (strlen(Domain) > 0) *domain = _strdup(Domain); + else + *domain = _strdup("\0"); *password = _strdup(Password); From c3e368bd4b72aaa03a9592b6cbea8b93188ef27e Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 18 Jun 2015 16:07:09 +0200 Subject: [PATCH 7/8] Fixed typo and invalid domain name. --- client/common/cmdline.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 68bd20aea..ef95c5cda 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -799,7 +799,7 @@ int freerdp_parse_username(char* username, char** user, char** domain) int length = 0; p = strchr(username, '\\'); - p = strrchr(username, '@'); + u = strrchr(username, '@'); *user = NULL; *domain = NULL; @@ -836,10 +836,7 @@ int freerdp_parse_username(char* username, char** user, char** domain) * otherwise set the domain to an empty string. * NOTE: Domain NULL will result in undefined behavior. */ - if (!u) - *domain = _strdup("TARGET"); - else - *domain = _strdup("\0"); + *domain = _strdup("\0"); if (!*domain) { @@ -2052,7 +2049,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (!settings->GatewayDomain && gwUser) { freerdp_parse_username(gwUser, &settings->GatewayUsername, - &settings->GatewayDomain); + &settings->GatewayDomain); free(gwUser); } else From a7943a53cdce5d746996efd02bfb48e5f024278c Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 18 Jun 2015 16:07:25 +0200 Subject: [PATCH 8/8] Setting hostname as default domain now. --- client/Windows/wf_client.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/Windows/wf_client.c b/client/Windows/wf_client.c index ceff1a2e7..0c424595d 100644 --- a/client/Windows/wf_client.c +++ b/client/Windows/wf_client.c @@ -492,8 +492,6 @@ BOOL wf_post_connect(freerdp* instance) return TRUE; } -static const char wfTargetName[] = "TARGET"; - static CREDUI_INFOA wfUiInfo = { sizeof(CREDUI_INFOA), @@ -518,7 +516,9 @@ BOOL wf_authenticate(freerdp* instance, char** username, char** password, char** ZeroMemory(Password, sizeof(Password)); dwFlags = CREDUI_FLAGS_DO_NOT_PERSIST | CREDUI_FLAGS_EXCLUDE_CERTIFICATES; - status = CredUIPromptForCredentialsA(&wfUiInfo, wfTargetName, NULL, 0, + status = CredUIPromptForCredentialsA(&wfUiInfo, + instance->settings->ServerHostname, + NULL, 0, UserName, CREDUI_MAX_USERNAME_LENGTH + 1, Password, CREDUI_MAX_PASSWORD_LENGTH + 1, &fSave, dwFlags);