credui: Don't show a dialog if existing credentials can be found.

This commit is contained in:
Hans Leidekker 2012-10-18 14:16:52 +02:00 committed by Alexandre Julliard
parent d6f8687630
commit 9d95d33118
1 changed files with 37 additions and 0 deletions

View File

@ -548,6 +548,38 @@ static INT_PTR CALLBACK CredDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,
} }
} }
static BOOL find_existing_credential(const WCHAR *target, WCHAR *username, ULONG len_username,
WCHAR *password, ULONG len_password)
{
DWORD count, i;
CREDENTIALW **credentials;
if (!CredEnumerateW(target, 0, &count, &credentials)) return FALSE;
for (i = 0; i < count; i++)
{
if (credentials[i]->Type != CRED_TYPE_DOMAIN_PASSWORD)
{
FIXME("no support for type %u credentials\n", credentials[i]->Type);
continue;
}
if ((!*username || !strcmpW(username, credentials[i]->UserName)) &&
strlenW(credentials[i]->UserName) < len_username &&
credentials[i]->CredentialBlobSize / sizeof(WCHAR) < len_password)
{
TRACE("found existing credential for %s\n", debugstr_w(credentials[i]->UserName));
strcpyW(username, credentials[i]->UserName);
memcpy(password, credentials[i]->CredentialBlob, credentials[i]->CredentialBlobSize);
password[credentials[i]->CredentialBlobSize / sizeof(WCHAR)] = 0;
CredFree(credentials);
return TRUE;
}
}
CredFree(credentials);
return FALSE;
}
/****************************************************************************** /******************************************************************************
* CredUIPromptForCredentialsW [CREDUI.@] * CredUIPromptForCredentialsW [CREDUI.@]
*/ */
@ -578,6 +610,11 @@ DWORD WINAPI CredUIPromptForCredentialsW(PCREDUI_INFOW pUIInfo,
if ((dwFlags & CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX) && !pfSave) if ((dwFlags & CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX) && !pfSave)
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if (!(dwFlags & CREDUI_FLAGS_ALWAYS_SHOW_UI) &&
!(dwFlags & CREDUI_FLAGS_INCORRECT_PASSWORD) &&
find_existing_credential(pszTargetName, pszUsername, ulUsernameMaxChars, pszPassword, ulPasswordMaxChars))
return ERROR_SUCCESS;
params.pszTargetName = pszTargetName; params.pszTargetName = pszTargetName;
if (pUIInfo) if (pUIInfo)
{ {