[utils,passphrase] use CredUI on windows

This commit is contained in:
Armin Novak 2023-03-18 09:40:53 +01:00 committed by David Fort
parent 659baa905c
commit 1e63d8c493
3 changed files with 27 additions and 77 deletions

View File

@ -444,8 +444,8 @@ static void wf_post_disconnect(freerdp* instance)
free(wfc->window_title); free(wfc->window_title);
} }
static CREDUI_INFOA wfUiInfo = { sizeof(CREDUI_INFOA), NULL, "Enter your credentials", static CREDUI_INFOW wfUiInfo = { sizeof(CREDUI_INFOW), NULL, L"Enter your credentials",
"Remote Desktop Security", NULL }; L"Remote Desktop Security", NULL };
static BOOL wf_authenticate_raw(freerdp* instance, const char* title, char** username, static BOOL wf_authenticate_raw(freerdp* instance, const char* title, char** username,
char** password, char** domain) char** password, char** domain)
@ -470,22 +470,18 @@ static BOOL wf_authenticate_raw(freerdp* instance, const char* title, char** use
if (username && *username) if (username && *username)
{ {
ConvertUtf8ToWChar(*username, UserNameW, ARRAYSIZE(UserNameW); ConvertUtf8ToWChar(*username, UserNameW, ARRAYSIZE(UserNameW));
ConvertUtf8ToWChar(*username, UserW, ARRAYSIZE(UserW); ConvertUtf8ToWChar(*username, UserW, ARRAYSIZE(UserW));
} }
if (password && *password) if (password && *password)
{ ConvertUtf8ToWChar(*password, PasswordW, ARRAYSIZE(PasswordW));
ConvertUtf8ToWChar(*password, PasswordW, ARRAYSIZE(PasswordW);
}
if (domain && *domain) if (domain && *domain)
{ ConvertUtf8ToWChar(*domain, DomainW, ARRAYSIZE(DomainW));
ConvertUtf8ToWChar(*domain, DomainW, ARRAYSIZE(DomainW);
strncpy(Domain, *domain, CREDUI_MAX_DOMAIN_TARGET_LENGTH);
}
if (!(*UserName && *Password)) if ((_wcsnlen(UserNameW, ARRAYSIZE(UserNameW)) == 0) &&
(_wcsnlen(PasswordW, ARRAYSIZE(PasswordW)) == 0))
{ {
WCHAR* titleW = ConvertUtf8ToWCharAlloc(title, NULL); WCHAR* titleW = ConvertUtf8ToWCharAlloc(title, NULL);
if (!wfc->isConsole && wfc->common.context.settings->CredentialsFromStdin) if (!wfc->isConsole && wfc->common.context.settings->CredentialsFromStdin)
@ -509,9 +505,9 @@ static BOOL wf_authenticate_raw(freerdp* instance, const char* title, char** use
CredUIParseUserNameW(UserNameW, UserW, ARRAYSIZE(UserW), DomainW, ARRAYSIZE(DomainW)); CredUIParseUserNameW(UserNameW, UserW, ARRAYSIZE(UserW), DomainW, ARRAYSIZE(DomainW));
if (status != NO_ERROR) if (status != NO_ERROR)
{ {
CHAR UserW[CREDUI_MAX_USERNAME_LENGTH + 1] = { 0 }; CHAR User[CREDUI_MAX_USERNAME_LENGTH + 1] = { 0 };
CHAR UserNameW[CREDUI_MAX_USERNAME_LENGTH + 1] = { 0 }; CHAR UserName[CREDUI_MAX_USERNAME_LENGTH + 1] = { 0 };
CHAR DomainW[CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1] = { 0 }; CHAR Domain[CREDUI_MAX_DOMAIN_TARGET_LENGTH + 1] = { 0 };
ConvertWCharNToUtf8(UserNameW, ARRAYSIZE(UserNameW), UserName, ARRAYSIZE(UserName)); ConvertWCharNToUtf8(UserNameW, ARRAYSIZE(UserNameW), UserName, ARRAYSIZE(UserName));
ConvertWCharNToUtf8(UserW, ARRAYSIZE(UserW), User, ARRAYSIZE(User)); ConvertWCharNToUtf8(UserW, ARRAYSIZE(UserW), User, ARRAYSIZE(User));
@ -529,7 +525,7 @@ static BOOL wf_authenticate_raw(freerdp* instance, const char* title, char** use
return FALSE; return FALSE;
} }
if (strlen(Domain) > 0) if (_wcsnlen(DomainW, ARRAYSIZE(DomainW)) > 0)
*domain = ConvertWCharNToUtf8Alloc(DomainW, ARRAYSIZE(DomainW), NULL); *domain = ConvertWCharNToUtf8Alloc(DomainW, ARRAYSIZE(DomainW), NULL);
else else
*domain = _strdup("\0"); *domain = _strdup("\0");

View File

@ -41,6 +41,7 @@ freerdp_library_add(${CMAKE_THREAD_LIBS_INIT})
if(WIN32) if(WIN32)
freerdp_library_add(ws2_32) freerdp_library_add(ws2_32)
freerdp_library_add(Credui)
endif() endif()
if(${CMAKE_SYSTEM_NAME} MATCHES SunOS) if(${CMAKE_SYSTEM_NAME} MATCHES SunOS)

View File

@ -28,6 +28,7 @@
#include <stdio.h> #include <stdio.h>
#include <io.h> #include <io.h>
#include <conio.h> #include <conio.h>
#include <wincred.h>
static char read_chr(FILE* f) static char read_chr(FILE* f)
{ {
@ -48,67 +49,19 @@ int freerdp_interruptible_getc(rdpContext* context, FILE* f)
char* freerdp_passphrase_read(rdpContext* context, const char* prompt, char* buf, size_t bufsiz, char* freerdp_passphrase_read(rdpContext* context, const char* prompt, char* buf, size_t bufsiz,
int from_stdin) int from_stdin)
{ {
#define CTRLC 3 WCHAR UserNameW[CREDUI_MAX_USERNAME_LENGTH + 1] = { 'p', 'r', 'e', 'f', 'i',
#define BACKSPACE '\b' 'l', 'l', 'e', 'd', '\0' };
#define NEWLINE '\n' WCHAR PasswordW[CREDUI_MAX_PASSWORD_LENGTH + 1] = { 0 };
#define CARRIAGERETURN '\r' BOOL fSave = FALSE;
#define SHOW_ASTERISK TRUE DWORD dwFlags = 0;
WCHAR* promptW = ConvertUtf8ToWCharAlloc(prompt, NULL);
size_t read_cnt = 0, chr; const DWORD status =
CredUICmdLinePromptForCredentialsW(promptW, NULL, 0, UserNameW, ARRAYSIZE(UserNameW),
printf("%s ", prompt); PasswordW, ARRAYSIZE(PasswordW), &fSave, dwFlags);
fflush(stdout); free(promptW);
while (read_cnt < bufsiz - 1 && (chr = freerdp_interruptible_getc(context, stdin)) && if (ConvertWCharNToUtf8(PasswordW, ARRAYSIZE(PasswordW), buf, bufsiz) < 0)
chr != NEWLINE && chr != CARRIAGERETURN) return NULL;
{ return buf;
switch (chr)
{
case EOF:
goto end;
case BACKSPACE:
{
if (read_cnt > 0)
{
if (SHOW_ASTERISK)
printf("\b \b");
read_cnt--;
}
}
break;
case CTRLC:
{
if (read_cnt != 0)
{
while (read_cnt > 0)
{
if (SHOW_ASTERISK)
printf("\b \b");
read_cnt--;
}
}
else
goto fail;
}
break;
default:
{
*(buf + read_cnt) = chr;
read_cnt++;
if (SHOW_ASTERISK)
printf("*");
}
break;
}
end:
*(buf + read_cnt) = '\0';
printf("\n");
fflush(stdout);
return buf;
}
fail:
errno = ENOSYS;
return NULL;
} }
#elif !defined(ANDROID) #elif !defined(ANDROID)