[3/3] credui: Don't show a dialog if existing credentials can be found.
Hans Leidekker
hans at codeweavers.com
Thu Oct 18 07:16:52 CDT 2012
---
dlls/credui/credui_main.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/dlls/credui/credui_main.c b/dlls/credui/credui_main.c
index b470928..6e8d452 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)
{
--
1.7.10.4
More information about the wine-patches
mailing list