diff --git a/dlls/credui/credui_main.c b/dlls/credui/credui_main.c index b470928909b..6e8d45229ba 100644 --- a/dlls/credui/credui_main.c +++ b/dlls/credui/credui_main.c @@ -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.@] */ @@ -578,6 +610,11 @@ DWORD WINAPI CredUIPromptForCredentialsW(PCREDUI_INFOW pUIInfo, if ((dwFlags & CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX) && !pfSave) 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; if (pUIInfo) {