/***************************************************************************** * * account.cpp - * * *****************************************************************************/ #include "priv.h" #include "account.h" #include "passwordapi.h" #include #include #include #define SZ_REGKEY_SEPARATOR TEXT("\\") // Server Level Login Attributes #define ATTRIB_NONE 0x00000000 #define ATTRIB_LOGIN_ANONYMOUSLY 0x00000001 #define ATTRIB_SAVE_USERNAME 0x00000002 #define ATTRIB_SAVE_PASSWORD 0x00000004 #define ATTRIB_DEFAULT (ATTRIB_LOGIN_ANONYMOUSLY | ATTRIB_SAVE_USERNAME) /*****************************************************************************\ FUNCTION: _GetAccountKey DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_GetAccountKey(LPCTSTR pszServer, LPTSTR pszKey, DWORD cchKeySize) { HRESULT hr = S_OK; StrCpyN(pszKey, SZ_REGKEY_FTPFOLDER_ACCOUNTS, cchKeySize); StrCatBuff(pszKey, pszServer, cchKeySize); return hr; } /*****************************************************************************\ FUNCTION: _GetUserAccountKey DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_GetUserAccountKey(LPCTSTR pszServer, LPCTSTR pszUserName, LPTSTR pszKey, DWORD cchKeySize) { TCHAR szUserNameEscaped[MAX_PATH]; HRESULT hr = _GetAccountKey(pszServer, pszKey, cchKeySize); EscapeString(pszUserName, szUserNameEscaped, ARRAYSIZE(szUserNameEscaped)); StrCatBuff(pszKey, SZ_REGKEY_SEPARATOR, cchKeySize); StrCatBuff(pszKey, szUserNameEscaped, cchKeySize); return hr; } /*****************************************************************************\ FUNCTION: GetUserName DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::GetUserName(LPCTSTR pszServer, LPTSTR pszUserName, DWORD cchUserName) { HRESULT hr = E_FAIL; TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH]; DWORD dwType = REG_SZ; DWORD cbSize = cchUserName * sizeof(TCHAR); hr = _GetAccountKey(pszServer, szKey, ARRAYSIZE(szKey)); if (EVAL(SUCCEEDED(hr))) { if (ERROR_SUCCESS != SHGetValue(HKEY_CURRENT_USER, szKey, SZ_REGVALUE_DEFAULT_USER, &dwType, pszUserName, &cbSize)) hr = E_FAIL; } return hr; } /*****************************************************************************\ FUNCTION: _LoadLoginAttributes DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_LoadLoginAttributes(DWORD * pdwLoginAttribs) { HRESULT hr = E_FAIL; TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH]; DWORD dwType = REG_DWORD; DWORD cbSize = sizeof(*pdwLoginAttribs); // TODO: Walk the tree so these are read from the correct place. ASSERT(pdwLoginAttribs); hr = _GetAccountKey(m_pszServer, szKey, ARRAYSIZE(szKey)); if (EVAL(SUCCEEDED(hr))) { // Do we also want to check on a per user basis? if ((ERROR_SUCCESS != SHGetValue(HKEY_CURRENT_USER, szKey, SZ_REGKEY_LOGIN_ATTRIBS, &dwType, pdwLoginAttribs, &cbSize)) || (ERROR_SUCCESS != SHGetValue(HKEY_CURRENT_USER, SZ_REGKEY_FTPFOLDER_ACCOUNTS, SZ_REGKEY_LOGIN_ATTRIBS, &dwType, pdwLoginAttribs, &cbSize))) { hr = E_FAIL; } } return hr; } /*****************************************************************************\ FUNCTION: _SaveLoginAttributes DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_SaveLoginAttributes(LPCTSTR pszServer, DWORD dwLoginAttribs) { HRESULT hr = E_FAIL; TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH]; // TODO: Walk the tree so these are saved to the correct place. hr = _GetAccountKey(pszServer, szKey, ARRAYSIZE(szKey)); if (EVAL(SUCCEEDED(hr))) { if (!EVAL(ERROR_SUCCESS == SHSetValue(HKEY_CURRENT_USER, szKey, SZ_REGKEY_LOGIN_ATTRIBS, REG_DWORD, &dwLoginAttribs, sizeof(dwLoginAttribs))) || !EVAL(ERROR_SUCCESS == SHSetValue(HKEY_CURRENT_USER, SZ_REGKEY_FTPFOLDER_ACCOUNTS, SZ_REGKEY_LOGIN_ATTRIBS, REG_DWORD, &dwLoginAttribs, sizeof(dwLoginAttribs)))) { hr = E_FAIL; } } return hr; } /*****************************************************************************\ FUNCTION: GetPassword DESCRIPTION: Update m_pszUser with pszUserName and get the password if we are allowed to. pszPassword is optional. \*****************************************************************************/ HRESULT CAccounts::GetPassword(LPCTSTR pszServer, LPCTSTR pszUserName, LPTSTR pszPassword, DWORD cchPassword) { HRESULT hr = E_NOTIMPL; DWORD dwLogAttribs = 0; Str_SetPtr((LPTSTR *) &m_pszServer, pszServer); Str_SetPtr((LPTSTR *) &m_pszUser, pszUserName); _LoadLoginAttributes(&dwLogAttribs); hr = _LoadDefaultPassword((dwLogAttribs & ATTRIB_SAVE_PASSWORD)); if (pszPassword) { pszPassword[0] = 0; // Incase this password isn't stored yet. if (SUCCEEDED(hr)) StrCpyN(pszPassword, m_pszPassword, cchPassword); } return hr; } /*****************************************************************************\ FUNCTION: _GetPassword DESCRIPTION: Always get a password even if persist is off. \*****************************************************************************/ HRESULT CAccounts::_GetPassword(LPCTSTR pszServer, LPCTSTR pszUserName, LPTSTR pszPassword, DWORD cchPassword) { HRESULT hr = E_NOTIMPL; pszPassword[0] = 0; // Incase this password isn't stored yet. #ifdef FEATURE_SAVE_PASSWORD TCHAR wzKey[MAX_URL_STRING]; wnsprintfW(wzKey, ARRAYSIZE(wzKey), L"ftp://%ls@%ls", pszUserName, pszServer); hr = GetCachedCredentials(wzKey, pszPassword, cchPassword); #endif // FEATURE_SAVE_PASSWORD return hr; } /*****************************************************************************\ FUNCTION: _UserChangeSelect DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_UserChangeSelect(HWND hDlg, BOOL fSelectChange) { HRESULT hr = S_OK; TCHAR szUser[INTERNET_MAX_USER_NAME_LENGTH]; HWND hwndComboBox = GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME); // SelectChange requires we get the text thru ComboBox_GetLBText because // it's not in GetWindowText yet. KILLFOCUS requires we get it from // GetWindowText because nothing is selected. szUser[0] = 0; if (fSelectChange) { if (ARRAYSIZE(szUser) > ComboBox_GetLBTextLen(hwndComboBox, ComboBox_GetCurSel(hwndComboBox))) ComboBox_GetLBText(hwndComboBox, ComboBox_GetCurSel(hwndComboBox), szUser); } else GetWindowText(hwndComboBox, szUser, ARRAYSIZE(szUser)); if (szUser[0]) { GetPassword(m_pszServer, szUser, NULL, 0); SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), m_pszPassword); } return hr; } /*****************************************************************************\ FUNCTION: _SaveUserName DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_SaveUserName(HWND hDlg) { HRESULT hr = S_OK; TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH]; TCHAR szUser[INTERNET_MAX_USER_NAME_LENGTH]; GetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME), szUser, ARRAYSIZE(szUser)); Str_SetPtr((LPTSTR *) &m_pszUser, szUser); // Always save the user name hr = _GetAccountKey(m_pszServer, szKey, ARRAYSIZE(szKey)); if (EVAL(SUCCEEDED(hr))) { if (!EVAL(ERROR_SUCCESS == SHSetValue(HKEY_CURRENT_USER, szKey, SZ_REGVALUE_DEFAULT_USER, REG_SZ, szUser, (lstrlen(szUser) + 1) * sizeof(TCHAR)))) hr = E_FAIL; hr = _GetUserAccountKey(m_pszServer, m_pszUser, szKey, ARRAYSIZE(szKey)); if (EVAL(SUCCEEDED(hr))) SHSetValue(HKEY_CURRENT_USER, szKey, TEXT(""), REG_SZ, TEXT(""), sizeof(TEXT(""))); } return hr; } /*****************************************************************************\ FUNCTION: _SavePassword DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_SavePassword(HWND hDlg, LPCTSTR pszUser, BOOL fPersist) { HRESULT hr = S_OK; TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH]; TCHAR wzKey[MAX_URL_STRING]; GetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), szPassword, ARRAYSIZE(szPassword)); Str_SetPtr((LPTSTR *) &m_pszPassword, szPassword); #ifdef FEATURE_SAVE_PASSWORD if (fPersist) { wnsprintfW(wzKey, ARRAYSIZE(wzKey), L"ftp://%ls@%ls", pszUser, m_pszServer); hr = SetCachedCredentials(wzKey, szPassword); } #endif // FEATURE_SAVE_PASSWORD return hr; } /*****************************************************************************\ FUNCTION: _SetLoginType DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_SetLoginType(HWND hDlg, BOOL fLoginAnnonymously) { ////// The "Annonymous" section // Set the Radio Button CheckDlgButton(hDlg, IDC_LOGINDLG_ANONYMOUS_CBOX, (fLoginAnnonymously ? BST_CHECKED : BST_UNCHECKED)); // Disable or Enable applicable items if (fLoginAnnonymously) { ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME_ANON), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_LABEL_DLG1), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_LABEL_DLG2), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_NOTES_DLG1), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_NOTES_DLG2), SW_SHOW); // Hide "Save Password" in Anonymous mode. ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_SAVE_PASSWORD), SW_HIDE); } else { ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME_ANON), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_LABEL_DLG1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_LABEL_DLG2), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_NOTES_DLG1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_NOTES_DLG2), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_SAVE_PASSWORD), SW_SHOW); } if (fLoginAnnonymously) // Select all the text. { int iStart = 0; int iEnd = -1; SendMessage(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), EM_GETSEL, (WPARAM) &iStart, (LPARAM) &iEnd); } SetFocus(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2)); return S_OK; } /*****************************************************************************\ FUNCTION: _PopulateUserNameDropDown DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_PopulateUserNameDropDown(HWND hDlg, LPCTSTR pszServer) { HRESULT hr = S_OK; HWND hwndUserComboBox = GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME); if (EVAL(hwndUserComboBox)) { TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH]; TCHAR szDefaultUser[INTERNET_MAX_USER_NAME_LENGTH]; szDefaultUser[0] = 0; hr = _GetAccountKey(pszServer, szKey, ARRAYSIZE(szKey)); if (EVAL(SUCCEEDED(hr))) { HKEY hKey; SendMessage(hwndUserComboBox, CB_RESETCONTENT, 0, 0); // Empty the contents. if (ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER, szKey, &hKey)) { TCHAR szUser[INTERNET_MAX_USER_NAME_LENGTH]; DWORD dwIndex = 0; while (ERROR_SUCCESS == RegEnumKey(hKey, dwIndex++, szUser, ARRAYSIZE(szUser))) { UnEscapeString(NULL, szUser, ARRAYSIZE(szUser)); SendMessage(hwndUserComboBox, CB_ADDSTRING, NULL, (LPARAM) szUser); } RegCloseKey(hKey); } SendMessage(hwndUserComboBox, CB_SETCURSEL, 0, 0); } if (!m_pszUser[0]) GetUserName(pszServer, szDefaultUser, ARRAYSIZE(szDefaultUser)); if (CB_ERR == SendMessage(hwndUserComboBox, CB_FINDSTRINGEXACT, 0, (LPARAM) (m_pszUser ? m_pszUser : szDefaultUser))) SendMessage(hwndUserComboBox, CB_ADDSTRING, NULL, (LPARAM) (m_pszUser ? m_pszUser : szDefaultUser)); SetWindowText(hwndUserComboBox, (m_pszUser ? m_pszUser : szDefaultUser)); } return hr; } /*****************************************************************************\ FUNCTION: _LoadDefaultPassword DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_LoadDefaultPassword(BOOL fLoadPersisted) { TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH]; HRESULT hr = S_FALSE; if (fLoadPersisted) hr = _GetPassword(m_pszServer, m_pszUser, szPassword, ARRAYSIZE(szPassword)); else szPassword[0] = 0; Str_SetPtr((LPTSTR *) &m_pszPassword, szPassword); return hr; } /*****************************************************************************\ FUNCTION: _LoadMessage DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_LoadMessage(HWND hDlg) { // if it's allowed, we need to load the anonymous email. This needs to be // be hard coded in English because that's how FTP works. SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME_ANON), TEXT("Anonymous")); if (LOGINFLAGS_ANON_LOGINJUSTFAILED & m_dwLoginFlags) { ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_NORMAL), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_USERREJECT), SW_HIDE); } else if (LOGINFLAGS_USER_LOGINJUSTFAILED & m_dwLoginFlags) { ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_ANONREJECT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_NORMAL), SW_HIDE); } else { ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_ANONREJECT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_USERREJECT), SW_HIDE); } return S_OK; } /*****************************************************************************\ FUNCTION: _LoadEMailName DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_LoadEMailName(HWND hDlg) { TCHAR szEmailName[MAX_PATH]; DWORD dwType = REG_SZ; DWORD cbSize = sizeof(szEmailName); if (ERROR_SUCCESS == SHGetValue(HKEY_CURRENT_USER, SZ_REGKEY_INTERNET_SETTINGS, SZ_REGKEY_EMAIL_NAME, &dwType, szEmailName, &cbSize)) SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), szEmailName); return S_OK; } /*****************************************************************************\ FUNCTION: _SaveEMailName DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::_SaveEMailName(HWND hDlg) { HRESULT hr = E_FAIL; TCHAR szEmailName[MAX_PATH]; if (GetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), szEmailName, ARRAYSIZE(szEmailName))) { if (ERROR_SUCCESS == SHSetValue(HKEY_CURRENT_USER, SZ_REGKEY_INTERNET_SETTINGS, SZ_REGKEY_EMAIL_NAME, REG_SZ, szEmailName, (lstrlen(szEmailName) + 1) * sizeof(TCHAR))) hr = S_OK; } return hr; } /*****************************************************************************\ FUNCTION: _InitDialog DESCRIPTION: \*****************************************************************************/ BOOL CAccounts::_InitDialog(HWND hDlg) { DWORD dwLogAttribs = ATTRIB_SAVE_USERNAME; BOOL fSucceeded = SetProp(hDlg, SZ_ACCOUNT_PROP, this); ASSERT(fSucceeded); // Init the dialog controls _LoadMessage(hDlg); // Load Message _LoadLoginAttributes(&dwLogAttribs); if (m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT) // Do we want to login anonymously? dwLogAttribs |= ATTRIB_LOGIN_ANONYMOUSLY; // Yes. CheckDlgButton(hDlg, IDC_LOGINDLG_ANONYMOUS_CBOX, (m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT)); SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_FTPSERVER), m_pszServer); _SetLoginType(hDlg, ATTRIB_LOGIN_ANONYMOUSLY & dwLogAttribs); _LoadEMailName(hDlg); _PopulateUserNameDropDown(hDlg, m_pszServer); _LoadDefaultPassword((dwLogAttribs & ATTRIB_SAVE_PASSWORD)); SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), m_pszPassword); #ifdef FEATURE_SAVE_PASSWORD if (S_OK == InitCredentialPersist()) CheckDlgButton(hDlg, IDC_LOGINDLG_SAVE_PASSWORD, (dwLogAttribs & ATTRIB_SAVE_PASSWORD)); else EnableWindow(GetDlgItem(hDlg, IDC_LOGINDLG_SAVE_PASSWORD), FALSE); #endif // FEATURE_SAVE_PASSWORD return TRUE; } /*****************************************************************************\ FUNCTION: _SaveDialogData DESCRIPTION: \*****************************************************************************/ BOOL CAccounts::_SaveDialogData(HWND hDlg) { DWORD dwLogAttribs = ATTRIB_NONE; if (IsDlgButtonChecked(hDlg, IDC_LOGINDLG_ANONYMOUS_CBOX)) m_dwLoginFlags |= LOGINFLAGS_ANON_ISDEFAULT; else m_dwLoginFlags &= ~LOGINFLAGS_ANON_ISDEFAULT; // Alway save user name dwLogAttribs |= ATTRIB_SAVE_USERNAME; _SaveUserName(hDlg); #ifdef FEATURE_SAVE_PASSWORD if (IsDlgButtonChecked(hDlg, IDC_LOGINDLG_SAVE_PASSWORD)) dwLogAttribs |= ATTRIB_SAVE_PASSWORD; if (!(m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT)) _SavePassword(hDlg, m_pszUser, (dwLogAttribs & ATTRIB_SAVE_PASSWORD)); #endif // FEATURE_SAVE_PASSWORD _SaveLoginAttributes(m_pszServer, dwLogAttribs); // Init the dialog controls _SaveEMailName(hDlg); return TRUE; } LRESULT CAccounts::_OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; UINT idc = GET_WM_COMMAND_ID(wParam, lParam); switch (idc) { case IDOK: if (m_hDlg == hDlg) // (IDOK) { _SaveDialogData(hDlg); EndDialog(hDlg, TRUE); lResult = 1; } break; case IDCANCEL: EndDialog(hDlg, FALSE); lResult = 1; break; case IDC_LOGINDLG_ANONYMOUS_CBOX: _SetLoginType(hDlg, IsDlgButtonChecked(hDlg, IDC_LOGINDLG_ANONYMOUS_CBOX)); lResult = 1; break; case IDC_LOGINDLG_USERNAME: { UINT uCmd = GET_WM_COMMAND_CMD(wParam, lParam); switch (uCmd) { case CBN_SELCHANGE: case CBN_KILLFOCUS: _UserChangeSelect(hDlg, (CBN_SELCHANGE == uCmd)); lResult = 1; break; } } break; } return lResult; } LRESULT CAccounts::_OnNotify(HWND hDlg, NMHDR * pNMHdr, int idControl) { BOOL fHandled = 1; // Not handled (WM_COMMAND seems to be different) if (pNMHdr) { switch (pNMHdr->code) { case NM_RETURN: case NM_CLICK: { PNMLINK pNMLink = (PNMLINK) pNMHdr; if (!StrCmpW(pNMLink->item.szID, L"idWebDAV")) { TCHAR szCommand[MAX_PATH]; LoadString(HINST_THISDLL, IDS_LOGIN_WEBDAVLINK, szCommand, ARRAYSIZE(szCommand)); HrShellExecute(hDlg, NULL, szCommand, NULL, NULL, SW_NORMAL); } break; } }; } return fHandled; } /*****************************************************************************\ FUNCTION: _LoginDialogProc DESCRIPTION: \*****************************************************************************/ INT_PTR CALLBACK CAccounts::_LoginDialogProc(HWND hDlg, UINT wm, WPARAM wParam, LPARAM lParam) { LRESULT lResult = 0; switch (wm) { case WM_INITDIALOG: { CAccounts * pThis = (CAccounts *) lParam; pThis->m_hDlg = hDlg; lResult = pThis->_InitDialog(hDlg); break; } case WM_COMMAND: { CAccounts * pThis = (CAccounts *)GetProp(hDlg, SZ_ACCOUNT_PROP); if (EVAL(pThis)) lResult = pThis->_OnCommand(hDlg, wParam, lParam); break; } case WM_NOTIFY: { CAccounts * pThis = (CAccounts *)GetProp(hDlg, SZ_ACCOUNT_PROP); if (pThis) { lResult = pThis->_OnNotify(hDlg, (NMHDR *)lParam, (int) wParam); } break; } }; return lResult; } /*****************************************************************************\ FUNCTION: GetAccountUrl DESCRIPTION: \*****************************************************************************/ HRESULT CAccounts::DisplayLoginDialog(HWND hwnd, DWORD dwLoginFlags, LPCTSTR pszServer, LPTSTR pszUserName, DWORD cchUserNameSize, LPTSTR pszPassword, DWORD cchPasswordSize) { HRESULT hr = S_OK; HRESULT hrOle = SHCoInitialize(); INITCOMMONCONTROLSEX icex = {0}; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = (ICC_USEREX_CLASSES | ICC_STANDARD_CLASSES | ICC_LINK_CLASS); InitCommonControlsEx(&icex); // Init the Link control for the login dialog ASSERT(hwnd && pszServer[0]); if (TEXT('\0') == pszUserName[0]) hr = GetUserName(pszServer, pszUserName, cchUserNameSize); Str_SetPtr((LPTSTR *) &m_pszServer, pszServer); Str_SetPtr((LPTSTR *) &m_pszUser, pszUserName); Str_SetPtr((LPTSTR *) &m_pszPassword, pszPassword); m_dwLoginFlags = dwLoginFlags; if (DialogBoxParam(HINST_THISDLL, MAKEINTRESOURCE(IDD_LOGINDLG), hwnd, _LoginDialogProc, (LPARAM)this)) { StrCpyN(pszUserName, ((m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT) ? TEXT("") : m_pszUser), cchUserNameSize); StrCpyN(pszPassword, ((m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT) ? TEXT("") : m_pszPassword), cchPasswordSize); hr = S_OK; } else hr = S_FALSE; if (SUCCEEDED(hrOle)) { SHCoUninitialize(hrOle); } return hr; } /****************************************************\ Constructor \****************************************************/ CAccounts::CAccounts() { DllAddRef(); // NOTE: We may be put on the stack, so we will not // automatically have our member variables inited. m_pszServer = 0; m_pszUser = 0; m_pszPassword = 0; LEAK_ADDREF(LEAK_CAccount); } /****************************************************\ Destructor \****************************************************/ CAccounts::~CAccounts() { Str_SetPtr((LPTSTR *) &m_pszServer, NULL); Str_SetPtr((LPTSTR *) &m_pszUser, NULL); Str_SetPtr((LPTSTR *) &m_pszPassword, NULL); DllRelease(); LEAK_DELREF(LEAK_CAccount); }