diff --git a/reactos/dll/win32/credui/CMakeLists.txt b/reactos/dll/win32/credui/CMakeLists.txt index 1ab2441d6b3..8030241a68d 100644 --- a/reactos/dll/win32/credui/CMakeLists.txt +++ b/reactos/dll/win32/credui/CMakeLists.txt @@ -1,15 +1,15 @@ add_definitions(-D__WINESRC__) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) + spec2def(credui.dll credui.spec ADD_IMPORTLIB) list(APPEND SOURCE credui_main.c - credui.rc ${CMAKE_CURRENT_BINARY_DIR}/credui_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/credui.def) -add_library(credui SHARED ${SOURCE}) +add_library(credui SHARED ${SOURCE} credui.rc) set_module_type(credui win32dll) target_link_libraries(credui wine) add_importlibs(credui advapi32 user32 comctl32 msvcrt kernel32 ntdll) diff --git a/reactos/dll/win32/credui/credui.spec b/reactos/dll/win32/credui/credui.spec index ef85c61467c..dd46303cef3 100644 --- a/reactos/dll/win32/credui/credui.spec +++ b/reactos/dll/win32/credui/credui.spec @@ -2,7 +2,7 @@ @ stub CredUICmdLinePromptForCredentialsW @ stub CredUIConfirmCredentialsA @ stdcall CredUIConfirmCredentialsW(wstr long) -@ stub CredUIInitControls +@ stdcall CredUIInitControls() @ stub CredUIParseUserNameA @ stdcall CredUIParseUserNameW(wstr ptr long ptr long) @ stub CredUIPromptForCredentialsA diff --git a/reactos/dll/win32/credui/credui_main.c b/reactos/dll/win32/credui/credui_main.c index 96f4d64b4fa..8e84d58386b 100644 --- a/reactos/dll/win32/credui/credui_main.c +++ b/reactos/dll/win32/credui/credui_main.c @@ -82,6 +82,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) break; case DLL_PROCESS_DETACH: + if (lpvReserved) break; LIST_FOR_EACH_ENTRY_SAFE(entry, cursor2, &pending_credentials_list, struct pending_credentials, entry) { list_remove(&entry->entry); @@ -339,7 +340,7 @@ static void CredDialogHideBalloonTip(HWND hwndDlg, struct cred_dialog_params *pa static inline BOOL CredDialogCapsLockOn(void) { - return GetKeyState(VK_CAPITAL) & 0x1 ? TRUE : FALSE; + return (GetKeyState(VK_CAPITAL) & 0x1) != 0; } static LRESULT CALLBACK CredDialogPasswordSubclassProc(HWND hwnd, UINT uMsg, @@ -412,7 +413,9 @@ static BOOL CredDialogInit(HWND hwndDlg, struct cred_dialog_params *params) SetWindowTextW(hwndDlg, title); } - if (params->dwFlags & (CREDUI_FLAGS_DO_NOT_PERSIST|CREDUI_FLAGS_PERSIST)) + if (params->dwFlags & CREDUI_FLAGS_PERSIST || + (params->dwFlags & CREDUI_FLAGS_DO_NOT_PERSIST && + !(params->dwFlags & CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX))) ShowWindow(GetDlgItem(hwndDlg, IDC_SAVE), SW_HIDE); else if (params->fSave) CheckDlgButton(hwndDlg, IDC_SAVE, BST_CHECKED); @@ -548,6 +551,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 +613,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) { @@ -651,13 +691,13 @@ DWORD WINAPI CredUIPromptForCredentialsW(PCREDUI_INFOW pUIInfo, len = strlenW(params.pszPassword); entry->pszPassword = HeapAlloc(GetProcessHeap(), 0, (len + 1)*sizeof(WCHAR)); memcpy(entry->pszPassword, params.pszPassword, (len + 1)*sizeof(WCHAR)); - entry->generic = dwFlags & CREDUI_FLAGS_GENERIC_CREDENTIALS ? TRUE : FALSE; + entry->generic = (dwFlags & CREDUI_FLAGS_GENERIC_CREDENTIALS) != 0; LeaveCriticalSection(&csPendingCredentials); } - else + else if (!(dwFlags & CREDUI_FLAGS_DO_NOT_PERSIST)) result = save_credentials(pszTargetName, pszUsername, pszPassword, - dwFlags & CREDUI_FLAGS_GENERIC_CREDENTIALS ? TRUE : FALSE); + (dwFlags & CREDUI_FLAGS_GENERIC_CREDENTIALS) != 0); } return result; @@ -802,3 +842,12 @@ DWORD WINAPI CredUIReadSSOCredW(PCWSTR pszRealm, PWSTR *ppszUsername) *ppszUsername = NULL; return ERROR_NOT_FOUND; } + +/****************************************************************************** + * CredUIInitControls [CREDUI.@] + */ +BOOL WINAPI CredUIInitControls(void) +{ + FIXME("() stub\n"); + return TRUE; +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 8064462e9fc..4f4870c1470 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -62,7 +62,7 @@ reactos/dll/win32/comcat # Synced to Wine-1.7.1 reactos/dll/win32/comctl32 # Synced to Wine 1.7.1 reactos/dll/win32/comdlg32 # Synced to Wine 1.3.37 reactos/dll/win32/compstui # Synced to Wine-1.5.19 -reactos/dll/win32/credui # Synced to Wine-1.5.4 +reactos/dll/win32/credui # Synced to Wine-1.7.1 reactos/dll/win32/crypt32 # Synced to Wine-1.5.26 reactos/dll/win32/cryptdlg # Synced to Wine-1.5.26 reactos/dll/win32/cryptdll # Synced to Wine-1.5.26