Rob Shearman : credui: Implement CredUIConfirmCredentialsW.

Alexandre Julliard julliard at winehq.org
Thu Oct 25 08:38:42 CDT 2007


Module: wine
Branch: master
Commit: af069ad758791655bd46bfdf77c84949fe9dd789
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=af069ad758791655bd46bfdf77c84949fe9dd789

Author: Rob Shearman <rob at codeweavers.com>
Date:   Wed Oct 24 16:16:02 2007 +0100

credui: Implement CredUIConfirmCredentialsW.

---

 dlls/credui/credui_main.c |  139 +++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 127 insertions(+), 12 deletions(-)

diff --git a/dlls/credui/credui_main.c b/dlls/credui/credui_main.c
index dfaa06e..b9b90d0 100644
--- a/dlls/credui/credui_main.c
+++ b/dlls/credui/credui_main.c
@@ -30,24 +30,65 @@
 
 #include "wine/debug.h"
 #include "wine/unicode.h"
+#include "wine/list.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(credui);
 
+struct pending_credentials
+{
+    struct list entry;
+    PWSTR pszTargetName;
+    PWSTR pszUsername;
+    PWSTR pszPassword;
+};
+
 static HINSTANCE hinstCredUI;
 
+struct list pending_credentials_list = LIST_INIT(pending_credentials_list);
+
+static CRITICAL_SECTION csPendingCredentials;
+static CRITICAL_SECTION_DEBUG critsect_debug =
+{
+    0, 0, &csPendingCredentials,
+    { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
+    0, 0, { (DWORD_PTR)(__FILE__ ": csPendingCredentials") }
+};
+static CRITICAL_SECTION csPendingCredentials = { &critsect_debug, -1, 0, 0, 0, 0 };
+
+
 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 {
-	TRACE("(0x%p, %d, %p)\n",hinstDLL,fdwReason,lpvReserved);
+    TRACE("(0x%p, %d, %p)\n",hinstDLL,fdwReason,lpvReserved);
+
+    if (fdwReason == DLL_WINE_PREATTACH) return FALSE;	/* prefer native version */
+
+    if (fdwReason == DLL_PROCESS_ATTACH)
+    {
+        DisableThreadLibraryCalls(hinstDLL);
+        hinstCredUI = hinstDLL;
+    }
+    else if (fdwReason == DLL_PROCESS_DETACH)
+    {
+        struct pending_credentials *entry, *cursor2;
+        LIST_FOR_EACH_ENTRY_SAFE(entry, cursor2, &pending_credentials_list, struct pending_credentials, entry)
+        {
+            list_remove(&entry->entry);
 
-	if (fdwReason == DLL_WINE_PREATTACH) return FALSE;	/* prefer native version */
+            HeapFree(GetProcessHeap(), 0, entry->pszTargetName);
+            HeapFree(GetProcessHeap(), 0, entry->pszUsername);
+            HeapFree(GetProcessHeap(), 0, entry->pszPassword);
+            HeapFree(GetProcessHeap(), 0, entry);
+        }
+    }
 
-	if (fdwReason == DLL_PROCESS_ATTACH)
-	{
-		DisableThreadLibraryCalls(hinstDLL);
-		hinstCredUI = hinstDLL;
-	}
+    return TRUE;
+}
 
-	return TRUE;
+static DWORD save_credentials(PCWSTR pszTargetName, PCWSTR pszUsername,
+                              PCWSTR pszPassword)
+{
+    FIXME("save servername %s with username %s\n", debugstr_w(pszTargetName), debugstr_w(pszUsername));
+    return ERROR_SUCCESS;
 }
 
 struct cred_dialog_params
@@ -145,6 +186,7 @@ DWORD WINAPI CredUIPromptForCredentialsW(PCREDUI_INFOW pUIInfo,
 {
     INT_PTR ret;
     struct cred_dialog_params params;
+    DWORD result = ERROR_SUCCESS;
 
     TRACE("(%p, %s, %p, %d, %s, %d, %p, %d, %p, 0x%08x)\n", pUIInfo,
           debugstr_w(pszTargetName), Reserved, dwAuthError, debugstr_w(pszUsername),
@@ -183,7 +225,50 @@ DWORD WINAPI CredUIPromptForCredentialsW(PCREDUI_INFOW pUIInfo,
     if (pfSave)
         *pfSave = params.fSave;
 
-    return ERROR_SUCCESS;
+    if (params.fSave)
+    {
+        if (dwFlags & CREDUI_FLAGS_EXPECT_CONFIRMATION)
+        {
+            BOOL found = FALSE;
+            struct pending_credentials *entry;
+            int len;
+
+            EnterCriticalSection(&csPendingCredentials);
+
+            /* find existing pending credentials for the same target and overwrite */
+            /* FIXME: is this correct? */
+            LIST_FOR_EACH_ENTRY(entry, &pending_credentials_list, struct pending_credentials, entry)
+                if (!strcmpW(pszTargetName, entry->pszTargetName))
+                {
+                    found = TRUE;
+                    HeapFree(GetProcessHeap(), 0, entry->pszUsername);
+                    HeapFree(GetProcessHeap(), 0, entry->pszPassword);
+                }
+
+            if (!found)
+            {
+                entry = HeapAlloc(GetProcessHeap(), 0, sizeof(*entry));
+                list_init(&entry->entry);
+                len = strlenW(pszTargetName);
+                entry->pszTargetName = HeapAlloc(GetProcessHeap(), 0, (len + 1)*sizeof(WCHAR));
+                memcpy(entry->pszTargetName, pszTargetName, (len + 1)*sizeof(WCHAR));
+                list_add_tail(&entry->entry, &pending_credentials_list);
+            }
+
+            len = strlenW(params.pszUsername);
+            entry->pszUsername = HeapAlloc(GetProcessHeap(), 0, (len + 1)*sizeof(WCHAR));
+            memcpy(entry->pszUsername, params.pszUsername, (len + 1)*sizeof(WCHAR));
+            len = strlenW(params.pszPassword);
+            entry->pszPassword = HeapAlloc(GetProcessHeap(), 0, (len + 1)*sizeof(WCHAR));
+            memcpy(entry->pszPassword, params.pszPassword, (len + 1)*sizeof(WCHAR));
+
+            LeaveCriticalSection(&csPendingCredentials);
+        }
+        else
+            result = save_credentials(pszTargetName, pszUsername, pszPassword);
+    }
+
+    return result;
 }
 
 /******************************************************************************
@@ -191,9 +276,39 @@ DWORD WINAPI CredUIPromptForCredentialsW(PCREDUI_INFOW pUIInfo,
  */
 DWORD WINAPI CredUIConfirmCredentialsW(PCWSTR pszTargetName, BOOL bConfirm)
 {
-    FIXME("(%s, %s): stub\n", debugstr_w(pszTargetName),
-          bConfirm ? "TRUE" : "FALSE");
-    return ERROR_SUCCESS;
+    struct pending_credentials *entry;
+    DWORD result = ERROR_NOT_FOUND;
+
+    TRACE("(%s, %s)\n", debugstr_w(pszTargetName), bConfirm ? "TRUE" : "FALSE");
+
+    if (!pszTargetName)
+        return ERROR_INVALID_PARAMETER;
+
+    EnterCriticalSection(&csPendingCredentials);
+
+    LIST_FOR_EACH_ENTRY(entry, &pending_credentials_list, struct pending_credentials, entry)
+    {
+        if (!strcmpW(pszTargetName, entry->pszTargetName))
+        {
+            if (bConfirm)
+                result = save_credentials(entry->pszTargetName, entry->pszUsername, entry->pszPassword);
+            else
+                result = ERROR_SUCCESS;
+
+            list_remove(&entry->entry);
+
+            HeapFree(GetProcessHeap(), 0, entry->pszTargetName);
+            HeapFree(GetProcessHeap(), 0, entry->pszUsername);
+            HeapFree(GetProcessHeap(), 0, entry->pszPassword);
+            HeapFree(GetProcessHeap(), 0, entry);
+
+            break;
+        }
+    }
+
+    LeaveCriticalSection(&csPendingCredentials);
+
+    return result;
 }
 
 /******************************************************************************




More information about the wine-cvs mailing list