credui: Don't show a dialog if existing credentials can be found.
This commit is contained in:
parent
d6f8687630
commit
9d95d33118
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue