account.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 23k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /*****************************************************************************
  2.  *
  3.  *    account.cpp -
  4.  *
  5.  *
  6.  *****************************************************************************/
  7. #include "priv.h"
  8. #include "account.h"
  9. #include "passwordapi.h"
  10. #include <richedit.h>
  11. #include <regapix.h>
  12. #define SZ_REGKEY_SEPARATOR                 TEXT("\")
  13. // Server Level Login Attributes
  14. #define ATTRIB_NONE                         0x00000000
  15. #define ATTRIB_LOGIN_ANONYMOUSLY            0x00000001
  16. #define ATTRIB_SAVE_USERNAME                0x00000002
  17. #define ATTRIB_SAVE_PASSWORD                0x00000004
  18. #define ATTRIB_DEFAULT                      (ATTRIB_LOGIN_ANONYMOUSLY | ATTRIB_SAVE_USERNAME)
  19. /*****************************************************************************
  20.     FUNCTION: _GetAccountKey
  21.     DESCRIPTION: 
  22. *****************************************************************************/
  23. HRESULT CAccounts::_GetAccountKey(LPCTSTR pszServer, LPTSTR pszKey, DWORD cchKeySize)
  24. {
  25.     HRESULT hr = S_OK;
  26.     StrCpyN(pszKey, SZ_REGKEY_FTPFOLDER_ACCOUNTS, cchKeySize);
  27.     StrCatBuff(pszKey, pszServer, cchKeySize);
  28.     return hr;
  29. }
  30. /*****************************************************************************
  31.     FUNCTION: _GetUserAccountKey
  32.     DESCRIPTION: 
  33. *****************************************************************************/
  34. HRESULT CAccounts::_GetUserAccountKey(LPCTSTR pszServer, LPCTSTR pszUserName, LPTSTR pszKey, DWORD cchKeySize)
  35. {
  36.     TCHAR szUserNameEscaped[MAX_PATH];
  37.     HRESULT hr = _GetAccountKey(pszServer, pszKey, cchKeySize);
  38.     EscapeString(pszUserName, szUserNameEscaped, ARRAYSIZE(szUserNameEscaped));
  39.     StrCatBuff(pszKey, SZ_REGKEY_SEPARATOR, cchKeySize);
  40.     StrCatBuff(pszKey, szUserNameEscaped, cchKeySize);
  41.     return hr;
  42. }
  43. /*****************************************************************************
  44.     FUNCTION: GetUserName
  45.     DESCRIPTION: 
  46. *****************************************************************************/
  47. HRESULT CAccounts::GetUserName(LPCTSTR pszServer, LPTSTR pszUserName, DWORD cchUserName)
  48. {
  49.     HRESULT hr = E_FAIL;
  50.     TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH];
  51.     DWORD dwType = REG_SZ;
  52.     DWORD cbSize = cchUserName * sizeof(TCHAR);
  53.     hr = _GetAccountKey(pszServer, szKey, ARRAYSIZE(szKey));
  54.     if (EVAL(SUCCEEDED(hr)))
  55.     {
  56.         if (ERROR_SUCCESS != SHGetValue(HKEY_CURRENT_USER, szKey, SZ_REGVALUE_DEFAULT_USER, &dwType, pszUserName, &cbSize))
  57.             hr = E_FAIL;
  58.     }
  59.     return hr;
  60. }
  61. /*****************************************************************************
  62.     FUNCTION: _LoadLoginAttributes
  63.     DESCRIPTION: 
  64. *****************************************************************************/
  65. HRESULT CAccounts::_LoadLoginAttributes(DWORD * pdwLoginAttribs)
  66. {
  67.     HRESULT hr = E_FAIL;
  68.     TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH];
  69.     DWORD dwType = REG_DWORD;
  70.     DWORD cbSize = sizeof(*pdwLoginAttribs);
  71.     // TODO: Walk the tree so these are read from the correct place.
  72.     ASSERT(pdwLoginAttribs);
  73.     hr = _GetAccountKey(m_pszServer, szKey, ARRAYSIZE(szKey));
  74.     if (EVAL(SUCCEEDED(hr)))
  75.     {
  76.         // Do we also want to check on a per user basis?
  77.         if ((ERROR_SUCCESS != SHGetValue(HKEY_CURRENT_USER, szKey, SZ_REGKEY_LOGIN_ATTRIBS, &dwType, pdwLoginAttribs, &cbSize)) ||
  78.             (ERROR_SUCCESS != SHGetValue(HKEY_CURRENT_USER, SZ_REGKEY_FTPFOLDER_ACCOUNTS, SZ_REGKEY_LOGIN_ATTRIBS, &dwType, pdwLoginAttribs, &cbSize)))
  79.         {
  80.             hr = E_FAIL;
  81.         }
  82.     }
  83.     return hr;
  84. }
  85. /*****************************************************************************
  86.     FUNCTION: _SaveLoginAttributes
  87.     DESCRIPTION: 
  88. *****************************************************************************/
  89. HRESULT CAccounts::_SaveLoginAttributes(LPCTSTR pszServer, DWORD dwLoginAttribs)
  90. {
  91.     HRESULT hr = E_FAIL;
  92.     TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH];
  93.     // TODO: Walk the tree so these are saved to the correct place.
  94.     hr = _GetAccountKey(pszServer, szKey, ARRAYSIZE(szKey));
  95.     if (EVAL(SUCCEEDED(hr)))
  96.     {
  97.         if (!EVAL(ERROR_SUCCESS == SHSetValue(HKEY_CURRENT_USER, szKey, SZ_REGKEY_LOGIN_ATTRIBS, REG_DWORD, &dwLoginAttribs, sizeof(dwLoginAttribs))) ||
  98.             !EVAL(ERROR_SUCCESS == SHSetValue(HKEY_CURRENT_USER, SZ_REGKEY_FTPFOLDER_ACCOUNTS, SZ_REGKEY_LOGIN_ATTRIBS, REG_DWORD, &dwLoginAttribs, sizeof(dwLoginAttribs))))
  99.         {
  100.             hr = E_FAIL;
  101.         }
  102.     }
  103.     return hr;
  104. }
  105. /*****************************************************************************
  106.     FUNCTION: GetPassword
  107.     DESCRIPTION: 
  108.         Update m_pszUser with pszUserName and get the password if we are allowed
  109.     to.  pszPassword is optional.
  110. *****************************************************************************/
  111. HRESULT CAccounts::GetPassword(LPCTSTR pszServer, LPCTSTR pszUserName, LPTSTR pszPassword, DWORD cchPassword)
  112. {
  113.     HRESULT hr = E_NOTIMPL;
  114.     DWORD dwLogAttribs = 0;
  115.     Str_SetPtr((LPTSTR *) &m_pszServer, pszServer);
  116.     Str_SetPtr((LPTSTR *) &m_pszUser, pszUserName);
  117.     _LoadLoginAttributes(&dwLogAttribs);
  118.     hr = _LoadDefaultPassword((dwLogAttribs & ATTRIB_SAVE_PASSWORD));
  119.     if (pszPassword)
  120.     {
  121.         pszPassword[0] = 0;  // Incase this password isn't stored yet.
  122.         if (SUCCEEDED(hr))
  123.             StrCpyN(pszPassword, m_pszPassword, cchPassword);
  124.     }
  125.     return hr;
  126. }
  127. /*****************************************************************************
  128.     FUNCTION: _GetPassword
  129.     DESCRIPTION: 
  130.         Always get a password even if persist is off.
  131. *****************************************************************************/
  132. HRESULT CAccounts::_GetPassword(LPCTSTR pszServer, LPCTSTR pszUserName, LPTSTR pszPassword, DWORD cchPassword)
  133. {
  134.     HRESULT hr = E_NOTIMPL;
  135.     pszPassword[0] = 0;  // Incase this password isn't stored yet.
  136. #ifdef FEATURE_SAVE_PASSWORD
  137.     TCHAR wzKey[MAX_URL_STRING];
  138.     wnsprintfW(wzKey, ARRAYSIZE(wzKey), L"ftp://%ls@%ls", pszUserName, pszServer);
  139.     hr = GetCachedCredentials(wzKey, pszPassword, cchPassword);
  140. #endif // FEATURE_SAVE_PASSWORD
  141.     return hr;
  142. }
  143. /*****************************************************************************
  144.     FUNCTION: _UserChangeSelect
  145.     DESCRIPTION:
  146. *****************************************************************************/
  147. HRESULT CAccounts::_UserChangeSelect(HWND hDlg, BOOL fSelectChange)
  148. {
  149.     HRESULT hr = S_OK;
  150.     TCHAR szUser[INTERNET_MAX_USER_NAME_LENGTH];
  151.     HWND hwndComboBox = GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME);
  152.     // SelectChange requires we get the text thru ComboBox_GetLBText because
  153.     // it's not in GetWindowText yet.  KILLFOCUS requires we get it from
  154.     // GetWindowText because nothing is selected.
  155.     szUser[0] = 0;
  156.     if (fSelectChange)
  157.     {
  158.         if (ARRAYSIZE(szUser) > ComboBox_GetLBTextLen(hwndComboBox, ComboBox_GetCurSel(hwndComboBox)))
  159.             ComboBox_GetLBText(hwndComboBox, ComboBox_GetCurSel(hwndComboBox), szUser);
  160.     }
  161.     else
  162.         GetWindowText(hwndComboBox, szUser, ARRAYSIZE(szUser));
  163.     if (szUser[0])
  164.     {
  165.         GetPassword(m_pszServer, szUser, NULL, 0);
  166.         SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), m_pszPassword);
  167.     }
  168.     return hr;
  169. }
  170. /*****************************************************************************
  171.     FUNCTION: _SaveUserName
  172.     DESCRIPTION:
  173. *****************************************************************************/
  174. HRESULT CAccounts::_SaveUserName(HWND hDlg)
  175. {
  176.     HRESULT hr = S_OK;
  177.     TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH];
  178.     TCHAR szUser[INTERNET_MAX_USER_NAME_LENGTH];
  179.     GetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME), szUser, ARRAYSIZE(szUser));
  180.     Str_SetPtr((LPTSTR *) &m_pszUser, szUser);
  181.     // Always save the user name
  182.     hr = _GetAccountKey(m_pszServer, szKey, ARRAYSIZE(szKey));
  183.     if (EVAL(SUCCEEDED(hr)))
  184.     {
  185.         if (!EVAL(ERROR_SUCCESS == SHSetValue(HKEY_CURRENT_USER, szKey, SZ_REGVALUE_DEFAULT_USER, REG_SZ, szUser, (lstrlen(szUser) + 1) * sizeof(TCHAR))))
  186.             hr = E_FAIL;
  187.         hr = _GetUserAccountKey(m_pszServer, m_pszUser, szKey, ARRAYSIZE(szKey));
  188.         if (EVAL(SUCCEEDED(hr)))
  189.             SHSetValue(HKEY_CURRENT_USER, szKey, TEXT(""), REG_SZ, TEXT(""), sizeof(TEXT("")));
  190.     }
  191.     return hr;
  192. }
  193. /*****************************************************************************
  194.     FUNCTION: _SavePassword
  195.     DESCRIPTION:
  196. *****************************************************************************/
  197. HRESULT CAccounts::_SavePassword(HWND hDlg, LPCTSTR pszUser, BOOL fPersist)
  198. {
  199.     HRESULT hr = S_OK;
  200.     TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH];
  201.     TCHAR wzKey[MAX_URL_STRING];
  202.     GetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), szPassword, ARRAYSIZE(szPassword));
  203.     Str_SetPtr((LPTSTR *) &m_pszPassword, szPassword);
  204. #ifdef FEATURE_SAVE_PASSWORD
  205.     if (fPersist)
  206.     {
  207.         wnsprintfW(wzKey, ARRAYSIZE(wzKey), L"ftp://%ls@%ls", pszUser, m_pszServer);
  208.         hr = SetCachedCredentials(wzKey, szPassword);
  209.     }
  210. #endif // FEATURE_SAVE_PASSWORD
  211.     return hr;
  212. }
  213. /*****************************************************************************
  214.     FUNCTION: _SetLoginType
  215.     DESCRIPTION:
  216. *****************************************************************************/
  217. HRESULT CAccounts::_SetLoginType(HWND hDlg, BOOL fLoginAnnonymously)
  218. {
  219.     ////// The "Annonymous" section
  220.     // Set the Radio Button
  221.     CheckDlgButton(hDlg, IDC_LOGINDLG_ANONYMOUS_CBOX, (fLoginAnnonymously ? BST_CHECKED : BST_UNCHECKED));
  222.     // Disable or Enable applicable items
  223.     if (fLoginAnnonymously)
  224.     {
  225.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME), SW_HIDE);
  226.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME_ANON), SW_SHOW);
  227.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), SW_HIDE);
  228.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), SW_SHOW);
  229.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_LABEL_DLG1), SW_HIDE);
  230.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_LABEL_DLG2), SW_SHOW);
  231.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_NOTES_DLG1), SW_HIDE);
  232.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_NOTES_DLG2), SW_SHOW);
  233.         // Hide "Save Password" in Anonymous mode.
  234.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_SAVE_PASSWORD), SW_HIDE);
  235.     }
  236.     else
  237.     {
  238.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME), SW_SHOW);
  239.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME_ANON), SW_HIDE);
  240.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), SW_SHOW);
  241.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), SW_HIDE);
  242.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_LABEL_DLG1), SW_SHOW);
  243.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_LABEL_DLG2), SW_HIDE);
  244.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_NOTES_DLG1), SW_SHOW);
  245.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_NOTES_DLG2), SW_HIDE);
  246.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_SAVE_PASSWORD), SW_SHOW);
  247.     }
  248.     if (fLoginAnnonymously) // Select all the text.
  249.     {
  250.         int iStart = 0;
  251.         int iEnd = -1;
  252.         SendMessage(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), EM_GETSEL, (WPARAM) &iStart, (LPARAM) &iEnd);
  253.     }
  254.     SetFocus(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2));
  255.     return S_OK;
  256. }
  257. /*****************************************************************************
  258.     FUNCTION: _PopulateUserNameDropDown
  259.     DESCRIPTION:
  260. *****************************************************************************/
  261. HRESULT CAccounts::_PopulateUserNameDropDown(HWND hDlg, LPCTSTR pszServer)
  262. {
  263.     HRESULT hr = S_OK;
  264.     HWND hwndUserComboBox = GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME);
  265.     if (EVAL(hwndUserComboBox))
  266.     {
  267.         TCHAR szKey[MAXIMUM_SUB_KEY_LENGTH];
  268.         TCHAR szDefaultUser[INTERNET_MAX_USER_NAME_LENGTH];
  269.         szDefaultUser[0] = 0;
  270.         hr = _GetAccountKey(pszServer, szKey, ARRAYSIZE(szKey));
  271.         if (EVAL(SUCCEEDED(hr)))
  272.         {
  273.             HKEY hKey;
  274.             SendMessage(hwndUserComboBox, CB_RESETCONTENT, 0, 0);      // Empty the contents.
  275.             if (ERROR_SUCCESS == RegOpenKey(HKEY_CURRENT_USER, szKey, &hKey))
  276.             {
  277.                 TCHAR szUser[INTERNET_MAX_USER_NAME_LENGTH];
  278.                 DWORD dwIndex = 0;
  279.                 while (ERROR_SUCCESS == RegEnumKey(hKey, dwIndex++, szUser, sizeof(szUser)))
  280.                 {
  281.                     UnEscapeString(NULL, szUser, ARRAYSIZE(szUser));
  282.                     SendMessage(hwndUserComboBox, CB_ADDSTRING, NULL, (LPARAM) szUser);
  283.                 }
  284.                 RegCloseKey(hKey);
  285.             }
  286.             SendMessage(hwndUserComboBox, CB_SETCURSEL, 0, 0);
  287.         }
  288.         if (!m_pszUser[0])
  289.             GetUserName(pszServer, szDefaultUser, ARRAYSIZE(szDefaultUser));
  290.         if (CB_ERR == SendMessage(hwndUserComboBox, CB_FINDSTRINGEXACT, 0, (LPARAM) (m_pszUser ? m_pszUser : szDefaultUser)))
  291.             SendMessage(hwndUserComboBox, CB_ADDSTRING, NULL, (LPARAM) (m_pszUser ? m_pszUser : szDefaultUser));
  292.         SetWindowText(hwndUserComboBox, (m_pszUser ? m_pszUser : szDefaultUser));
  293.     }
  294.     return hr;
  295. }
  296. /*****************************************************************************
  297.     FUNCTION: _LoadDefaultPassword
  298.     DESCRIPTION:
  299. *****************************************************************************/
  300. HRESULT CAccounts::_LoadDefaultPassword(BOOL fLoadPersisted)
  301. {
  302.     TCHAR szPassword[INTERNET_MAX_PASSWORD_LENGTH];
  303.     HRESULT hr = S_FALSE;
  304.     if (fLoadPersisted)
  305.         hr = _GetPassword(m_pszServer, m_pszUser, szPassword, ARRAYSIZE(szPassword));
  306.     else
  307.         szPassword[0] = 0;
  308.     Str_SetPtr((LPTSTR *) &m_pszPassword, szPassword);
  309.     return hr;
  310. }
  311. /*****************************************************************************
  312.     FUNCTION: _LoadMessage
  313.     DESCRIPTION:
  314. *****************************************************************************/
  315. HRESULT CAccounts::_LoadMessage(HWND hDlg)
  316. {
  317.     // if it's allowed, we need to load the anonymous email.  This needs to be
  318.     // be hard coded in English because that's how FTP works.
  319.     SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_USERNAME_ANON), TEXT("Anonymous"));
  320.     if (LOGINFLAGS_ANON_LOGINJUSTFAILED & m_dwLoginFlags)
  321.     {
  322.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_NORMAL), SW_HIDE);
  323.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_USERREJECT), SW_HIDE);
  324.     }
  325.     else if (LOGINFLAGS_USER_LOGINJUSTFAILED & m_dwLoginFlags)
  326.     {
  327.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_ANONREJECT), SW_HIDE);
  328.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_NORMAL), SW_HIDE);
  329.     }
  330.     else
  331.     {
  332.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_ANONREJECT), SW_HIDE);
  333.         ShowWindow(GetDlgItem(hDlg, IDC_LOGINDLG_MESSAGE_USERREJECT), SW_HIDE);
  334.     }
  335.     return S_OK;
  336. }
  337. /*****************************************************************************
  338.     FUNCTION: _LoadEMailName
  339.     DESCRIPTION:
  340. *****************************************************************************/
  341. HRESULT CAccounts::_LoadEMailName(HWND hDlg)
  342. {
  343.     TCHAR szEmailName[MAX_PATH];
  344.     DWORD dwType = REG_SZ;
  345.     DWORD cbSize = sizeof(szEmailName);
  346.     if (ERROR_SUCCESS == SHGetValue(HKEY_CURRENT_USER, SZ_REGKEY_INTERNET_SETTINGS, SZ_REGKEY_EMAIL_NAME, &dwType, szEmailName, &cbSize))
  347.         SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), szEmailName);
  348.     return S_OK;
  349. }
  350. /*****************************************************************************
  351.     FUNCTION: _SaveEMailName
  352.     DESCRIPTION:
  353. *****************************************************************************/
  354. HRESULT CAccounts::_SaveEMailName(HWND hDlg)
  355. {
  356.     HRESULT hr = E_FAIL;
  357.     TCHAR szEmailName[MAX_PATH];
  358.     if (GetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG2), szEmailName, ARRAYSIZE(szEmailName)))
  359.     {
  360.         if (ERROR_SUCCESS == SHSetValue(HKEY_CURRENT_USER, SZ_REGKEY_INTERNET_SETTINGS, SZ_REGKEY_EMAIL_NAME, REG_SZ, szEmailName, (lstrlen(szEmailName) + 1) * sizeof(TCHAR)))
  361.             hr = S_OK;
  362.     }
  363.     return hr;
  364. }
  365. /*****************************************************************************
  366.     FUNCTION: _InitDialog
  367.     DESCRIPTION:
  368. *****************************************************************************/
  369. BOOL CAccounts::_InitDialog(HWND hDlg)
  370. {
  371.     DWORD dwLogAttribs = ATTRIB_SAVE_USERNAME;
  372.     BOOL fSucceeded = SetProp(hDlg, SZ_ACCOUNT_PROP, this);
  373.     ASSERT(fSucceeded);
  374.     // Init the dialog controls
  375.     _LoadMessage(hDlg);     // Load Message
  376.     _LoadLoginAttributes(&dwLogAttribs);
  377.     if (m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT) // Do we want to login anonymously?
  378.         dwLogAttribs |= ATTRIB_LOGIN_ANONYMOUSLY;   // Yes.
  379.     CheckDlgButton(hDlg, IDC_LOGINDLG_ANONYMOUS_CBOX, (m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT));
  380.     SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_FTPSERVER), m_pszServer);
  381.     _SetLoginType(hDlg, ATTRIB_LOGIN_ANONYMOUSLY & dwLogAttribs);
  382.     _LoadEMailName(hDlg);
  383.     _PopulateUserNameDropDown(hDlg, m_pszServer);
  384.     _LoadDefaultPassword((dwLogAttribs & ATTRIB_SAVE_PASSWORD));
  385.     SetWindowText(GetDlgItem(hDlg, IDC_LOGINDLG_PASSWORD_DLG1), m_pszPassword);
  386. #ifdef FEATURE_SAVE_PASSWORD
  387.     if (S_OK == InitCredentialPersist())
  388.         CheckDlgButton(hDlg, IDC_LOGINDLG_SAVE_PASSWORD, (dwLogAttribs & ATTRIB_SAVE_PASSWORD));
  389.     else
  390.         EnableWindow(GetDlgItem(hDlg, IDC_LOGINDLG_SAVE_PASSWORD), FALSE);
  391. #endif // FEATURE_SAVE_PASSWORD
  392.     return TRUE;
  393. }
  394. /*****************************************************************************
  395.     FUNCTION: _SaveDialogData
  396.     DESCRIPTION:
  397. *****************************************************************************/
  398. BOOL CAccounts::_SaveDialogData(HWND hDlg)
  399. {
  400.     DWORD dwLogAttribs = ATTRIB_NONE;
  401.     if (IsDlgButtonChecked(hDlg, IDC_LOGINDLG_ANONYMOUS_CBOX))
  402.         m_dwLoginFlags |= LOGINFLAGS_ANON_ISDEFAULT;
  403.     else
  404.         m_dwLoginFlags &= ~LOGINFLAGS_ANON_ISDEFAULT;
  405.     // Alway save user name
  406.     dwLogAttribs |= ATTRIB_SAVE_USERNAME;
  407.     _SaveUserName(hDlg);
  408. #ifdef FEATURE_SAVE_PASSWORD
  409.     if (IsDlgButtonChecked(hDlg, IDC_LOGINDLG_SAVE_PASSWORD))
  410.         dwLogAttribs |= ATTRIB_SAVE_PASSWORD;
  411.     if (!(m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT))
  412.         _SavePassword(hDlg, m_pszUser, (dwLogAttribs & ATTRIB_SAVE_PASSWORD));
  413. #endif // FEATURE_SAVE_PASSWORD
  414.     _SaveLoginAttributes(m_pszServer, dwLogAttribs);
  415.     // Init the dialog controls
  416.     _SaveEMailName(hDlg);
  417.     return TRUE;
  418. }
  419. /*****************************************************************************
  420.     FUNCTION: _OnCommand
  421.     DESCRIPTION:
  422. *****************************************************************************/
  423. LRESULT CAccounts::_OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
  424. {
  425.     LRESULT lResult = 0;
  426.     UINT idc = GET_WM_COMMAND_ID(wParam, lParam);
  427.     switch (idc)
  428.     {
  429.     case IDOK:
  430.         if (m_hDlg == hDlg)  // (IDOK)
  431.         {
  432.             _SaveDialogData(hDlg);
  433.             EndDialog(hDlg, TRUE);
  434.             lResult = 1;
  435.         }
  436.         break;
  437.     case IDCANCEL:
  438.         EndDialog(hDlg, FALSE);
  439.         lResult = 1;
  440.         break;
  441.     case IDC_LOGINDLG_ANONYMOUS_CBOX:
  442.         _SetLoginType(hDlg, IsDlgButtonChecked(hDlg, IDC_LOGINDLG_ANONYMOUS_CBOX));
  443.         lResult = 1;
  444.         break;
  445.     case IDC_LOGINDLG_USERNAME:
  446.         {
  447.             UINT uCmd = GET_WM_COMMAND_CMD(wParam, lParam);
  448.             switch (uCmd)
  449.             {
  450.             case CBN_SELCHANGE:
  451.             case CBN_KILLFOCUS:
  452.                 _UserChangeSelect(hDlg, (CBN_SELCHANGE == uCmd));
  453.                 lResult = 1;
  454.                 break;
  455.             }
  456.         }
  457.         break;
  458.     }
  459.     return lResult;
  460. }
  461. /*****************************************************************************
  462.     FUNCTION: _LoginDialogProc
  463.     DESCRIPTION:
  464. *****************************************************************************/
  465. INT_PTR CALLBACK CAccounts::_LoginDialogProc(HWND hDlg, UINT wm, WPARAM wParam, LPARAM lParam)
  466. {
  467.     LRESULT lResult = 0;
  468.     switch (wm)
  469.     {
  470.     case WM_INITDIALOG:
  471.         {
  472.             CAccounts * pThis = (CAccounts *) lParam;
  473.             pThis->m_hDlg = hDlg;
  474.             lResult = pThis->_InitDialog(hDlg);
  475.             break;
  476.         }
  477.     case WM_COMMAND:
  478.         {
  479.             CAccounts * pThis = (CAccounts *)GetProp(hDlg, SZ_ACCOUNT_PROP);
  480.             if (EVAL(pThis))
  481.                 lResult = pThis->_OnCommand(hDlg, wParam, lParam);
  482.             break;
  483.         }
  484.     }
  485.     return lResult;
  486. }
  487. /*****************************************************************************
  488.     FUNCTION: GetAccountUrl
  489.     DESCRIPTION:
  490. *****************************************************************************/
  491. HRESULT CAccounts::DisplayLoginDialog(HWND hwnd, DWORD dwLoginFlags, LPCTSTR pszServer, LPTSTR pszUserName, DWORD cchUserNameSize, LPTSTR pszPassword, DWORD cchPasswordSize)
  492. {
  493.     HRESULT hr;
  494.     ASSERT(hwnd && pszServer[0]);
  495.     if (TEXT('') == pszUserName[0])
  496.         hr = GetUserName(pszServer, pszUserName, cchUserNameSize);
  497.     Str_SetPtr((LPTSTR *) &m_pszServer, pszServer);
  498.     Str_SetPtr((LPTSTR *) &m_pszUser, pszUserName);
  499.     Str_SetPtr((LPTSTR *) &m_pszPassword, pszPassword);
  500.     m_dwLoginFlags = dwLoginFlags;
  501.     if (DialogBoxParam(HINST_THISDLL, MAKEINTRESOURCE(IDD_LOGINDLG), hwnd, _LoginDialogProc, (LPARAM)this))
  502.     {
  503.         StrCpyN(pszUserName, ((m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT) ? TEXT("") : m_pszUser), cchUserNameSize);
  504.         StrCpyN(pszPassword, ((m_dwLoginFlags & LOGINFLAGS_ANON_ISDEFAULT) ? TEXT("") : m_pszPassword), cchPasswordSize);
  505.         hr = S_OK;
  506.     }
  507.     else
  508.         hr = S_FALSE;
  509.     return hr;
  510. }
  511. /****************************************************
  512.     Constructor
  513. ****************************************************/
  514. CAccounts::CAccounts()
  515. {
  516.     DllAddRef();
  517.     // NOTE: We may be put on the stack, so we will not
  518.     //    automatically have our member variables inited.
  519.     m_pszServer = 0;
  520.     m_pszUser = 0;
  521.     m_pszPassword = 0;
  522.     LEAK_ADDREF(LEAK_CAccount);
  523. }
  524. /****************************************************
  525.     Destructor
  526. ****************************************************/
  527. CAccounts::~CAccounts()
  528. {
  529.     Str_SetPtr((LPTSTR *) &m_pszServer, NULL);
  530.     Str_SetPtr((LPTSTR *) &m_pszUser, NULL);
  531.     Str_SetPtr((LPTSTR *) &m_pszPassword, NULL);
  532.     DllRelease();
  533.     LEAK_DELREF(LEAK_CAccount);
  534. }