750 lines
23 KiB
C++
750 lines
23 KiB
C++
/*****************************************************************************
|
|
*
|
|
* account.cpp -
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#include "priv.h"
|
|
#include "account.h"
|
|
#include "passwordapi.h"
|
|
#include <richedit.h>
|
|
#include <regapix.h>
|
|
#include <commctrl.h>
|
|
|
|
#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);
|
|
}
|
|
|