// ===================================================================================== // P A S S D L G . C P P // Written by Steven J. Bailey 1/26/96 // ===================================================================================== #include "pch.hxx" #include "passdlg.h" #include "xpcomm.h" #include "imnact.h" #include "imnxport.h" #include "demand.h" // ===================================================================================== // Prototypes // ===================================================================================== INT_PTR CALLBACK PasswordDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void PasswordDlgProc_OnCommand (HWND hwndDlg, int id, HWND hwndCtl, UINT codeNotify); void PasswordDlgProc_OnCancel (HWND hwndDlg, HWND hwndCtl, UINT uNotifyCode); void PasswordDlgProc_OnOk (HWND hwndDlg, HWND hwndCtl, UINT uNotifyCode); BOOL PasswordDlgProc_OnInitDialog (HWND hwndDlg, HWND hwndFocus, LPARAM lParam); // ===================================================================================== // HrGetPassword // ===================================================================================== HRESULT HrGetPassword (HWND hwndParent, LPPASSINFO lpPassInfo) { // Locals HRESULT hr = S_OK; // Check Params AssertSz (lpPassInfo, "NULL Parameter"); AssertSz (lpPassInfo->szTitle && lpPassInfo->lpszPassword && lpPassInfo->lpszAccount && lpPassInfo->lpszServer && (lpPassInfo->fRememberPassword == TRUE || lpPassInfo->fRememberPassword == FALSE), "PassInfo struct was not inited correctly."); // Display Dialog Box INT nResult = (INT) DialogBoxParam (g_hLocRes, MAKEINTRESOURCE (iddPassword), hwndParent, PasswordDlgProc, (LPARAM)lpPassInfo); if (nResult == IDCANCEL) hr = S_FALSE; // Done return hr; } // ===================================================================================== // PasswordDlgProc // ===================================================================================== INT_PTR CALLBACK PasswordDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG (hwndDlg, WM_INITDIALOG, PasswordDlgProc_OnInitDialog); HANDLE_MSG (hwndDlg, WM_COMMAND, PasswordDlgProc_OnCommand); } return 0; } // ===================================================================================== // OnInitDialog // ===================================================================================== BOOL PasswordDlgProc_OnInitDialog (HWND hwndDlg, HWND hwndFocus, LPARAM lParam) { // Locals LPPASSINFO lpPassInfo = NULL; TCHAR szServer[CCHMAX_ACCOUNT_NAME]; // Center CenterDialog (hwndDlg); // Make foreground SetForegroundWindow (hwndDlg); // Get Pass info struct lpPassInfo = (LPPASSINFO)lParam; if (lpPassInfo == NULL) { Assert (FALSE); return 0; } SetWndThisPtr (hwndDlg, lpPassInfo); // Set Window Title SetWindowText (hwndDlg, lpPassInfo->szTitle); // Default Edit_LimitText (GetDlgItem (hwndDlg, IDE_ACCOUNT), lpPassInfo->cbMaxAccount); Edit_LimitText (GetDlgItem (hwndDlg, IDE_PASSWORD), lpPassInfo->cbMaxPassword); // Set Defaults PszEscapeMenuStringA(lpPassInfo->lpszServer, szServer, sizeof(szServer) / sizeof(TCHAR)); Edit_SetText (GetDlgItem (hwndDlg, IDS_SERVER), szServer); Edit_SetText (GetDlgItem (hwndDlg, IDE_ACCOUNT), lpPassInfo->lpszAccount); Edit_SetText (GetDlgItem (hwndDlg, IDE_PASSWORD), lpPassInfo->lpszPassword); CheckDlgButton (hwndDlg, IDCH_REMEMBER, lpPassInfo->fRememberPassword); if (lpPassInfo->fAlwaysPromptPassword) EnableWindow(GetDlgItem(hwndDlg, IDCH_REMEMBER), FALSE); // Set Focus if (!FIsStringEmpty(lpPassInfo->lpszAccount)) SetFocus (GetDlgItem (hwndDlg, IDE_PASSWORD)); // Done return FALSE; } // ===================================================================================== // OnCommand // ===================================================================================== void PasswordDlgProc_OnCommand (HWND hwndDlg, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { HANDLE_COMMAND(hwndDlg, IDCANCEL, hwndCtl, codeNotify, PasswordDlgProc_OnCancel); HANDLE_COMMAND(hwndDlg, IDOK, hwndCtl, codeNotify, PasswordDlgProc_OnOk); } return; } // ===================================================================================== // OnCancel // ===================================================================================== void PasswordDlgProc_OnCancel (HWND hwndDlg, HWND hwndCtl, UINT uNotifyCode) { EndDialog (hwndDlg, IDCANCEL); } // ===================================================================================== // OnOk // ===================================================================================== void PasswordDlgProc_OnOk (HWND hwndDlg, HWND hwndCtl, UINT uNotifyCode) { // Locals LPPASSINFO lpPassInfo = NULL; lpPassInfo = (LPPASSINFO)GetWndThisPtr (hwndDlg); if (lpPassInfo == NULL) { Assert (FALSE); EndDialog (hwndDlg, IDOK); return; } Edit_GetText (GetDlgItem (hwndDlg, IDE_ACCOUNT), lpPassInfo->lpszAccount, lpPassInfo->cbMaxAccount); Edit_GetText (GetDlgItem (hwndDlg, IDE_PASSWORD), lpPassInfo->lpszPassword, lpPassInfo->cbMaxPassword); lpPassInfo->fRememberPassword = IsDlgButtonChecked (hwndDlg, IDCH_REMEMBER); EndDialog (hwndDlg, IDOK); } //*************************************************************************** // Function: PromptUserForPassword // // Purpose: // This function prompts the user with a password dialog and returns the // results to the caller. // // Arguments: // LPINETSERVER pInetServer [in/out] - provides default values for username // and password, and allows us to save password to account if user asks us // to. User-supplied username and password are saved to this structure // for return to the caller. // HWND hwnd [in] - parent hwnd to be used for password dialog. // // Returns: // TRUE if user pressed "OK" on dialog, FALSE if user pressed "CANCEL". //*************************************************************************** BOOL PromptUserForPassword(LPINETSERVER pInetServer, HWND hwnd) { PASSINFO pi; HRESULT hrResult; BOOL bReturn; Assert(NULL != hwnd); // Initialize variables hrResult = S_OK; bReturn = FALSE; // Setup PassInfo Struct ZeroMemory (&pi, sizeof (PASSINFO)); pi.lpszAccount = pInetServer->szUserName; pi.cbMaxAccount = sizeof(pInetServer->szUserName); pi.lpszPassword = pInetServer->szPassword; pi.cbMaxPassword = sizeof(pInetServer->szPassword); pi.lpszServer = pInetServer->szAccount; pi.fRememberPassword = !ISFLAGSET(pInetServer->dwFlags, ISF_ALWAYSPROMPTFORPASSWORD); pi.fAlwaysPromptPassword = ISFLAGSET(pInetServer->dwFlags, ISF_ALWAYSPROMPTFORPASSWORD); AthLoadString(idsImapLogon, pi.szTitle, ARRAYSIZE(pi.szTitle)); // Prompt for password hrResult = HrGetPassword (hwnd, &pi); if (S_OK == hrResult) { IImnAccount *pAcct; // Cache the password for this session SavePassword(pInetServer->dwPort, pInetServer->szServerName, pInetServer->szUserName, pInetServer->szPassword); // User wishes to proceed. Save account and password info hrResult = g_pAcctMan->FindAccount(AP_ACCOUNT_NAME, pInetServer->szAccount, &pAcct); if (SUCCEEDED(hrResult)) { // I'll ignore error results here, since not much we can do about 'em pAcct->SetPropSz(AP_IMAP_USERNAME, pInetServer->szUserName); if (pi.fRememberPassword) pAcct->SetPropSz(AP_IMAP_PASSWORD, pInetServer->szPassword); else pAcct->SetProp(AP_IMAP_PASSWORD, NULL, 0); pAcct->SaveChanges(); pAcct->Release(); } bReturn = TRUE; } Assert(SUCCEEDED(hrResult)); return bReturn; } // PromptUserForPassword