📄 account.cpp
字号:
/*****************************************************************************
*
* account.cpp -
*
*
*****************************************************************************/
#include "priv.h"
#include "account.h"
#include "passwordapi.h"
#include <richedit.h>
#include <regapix.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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -