📄 passworddlg.cpp
字号:
bFound = TRUE;
break;
}
}
if(bFound == FALSE)
{
COMBOBOXEXITEM cbi;
ZeroMemory(&cbi, sizeof(COMBOBOXEXITEM));
cbi.mask = CBEIF_IMAGE | CBEIF_TEXT | CBEIF_INDENT | CBEIF_SELECTEDIMAGE;
cbi.iItem = m_cbDiskList.GetCount();
cbi.pszText = (LPTSTR)m_lpPreSelectPath;
cbi.cchTextMax = (int)_tcslen(cbi.pszText);
cbi.iImage = cbi.iSelectedImage = 28;
cbi.iIndent = 0;
int nx = m_cbDiskList.InsertItem(&cbi);
m_cbDiskList.SetCurSel(nx);
OnSelChangeComboDiskList();
}
m_bKeyMethod = TRUE;
UpdateData(FALSE);
EnableClientWindows();
}
m_pEditPw.SetFocus();
return FALSE; // Return TRUE unless you set the focus to a control
}
void CPasswordDlg::CleanUp()
{
m_cbDiskList.ResetContent();
m_ilIcons.DeleteImageList();
m_fStyle.DeleteObject();
m_fSymbol.DeleteObject();
m_fBold.DeleteObject();
}
void CPasswordDlg::FreePasswords()
{
ASSERT(m_lpKey != NULL);
if(m_lpKey != NULL)
{
CSecureEditEx::DeletePassword(m_lpKey);
m_lpKey = NULL;
}
if(m_lpKey2 != NULL)
{
CSecureEditEx::DeletePassword(m_lpKey2);
m_lpKey2 = NULL;
}
}
void CPasswordDlg::OnOK()
{
CString strTemp;
ULARGE_INTEGER aBytes[3];
LPTSTR lpPassword;
UpdateData(TRUE);
ASSERT((m_lpKey == NULL) && (m_lpKey2 == NULL));
m_lpKey = m_pEditPw.GetPassword();
lpPassword = m_lpKey;
if(m_bConfirm == FALSE)
{
// Validate input
if(m_bKeyMethod == PWM_KEYMETHOD_OR)
{
if(!((_tcslen(m_lpKey) == 0) ^ (m_cbDiskList.GetCurSel() == 0)))
{
MessageBox(TRL("EITHER enter a master password OR select a key file."),
TRL("Password Safe"), MB_OK | MB_ICONINFORMATION);
FreePasswords();
return;
}
}
else // m_bKeyMethod == PWM_KEYMETHOD_AND
{
if((_tcslen(m_lpKey) == 0) || (m_cbDiskList.GetCurSel() == 0))
{
MessageBox(TRL("You've selected the AND key mode, so you must enter a password AND select a key file."),
TRL("Password Safe"), MB_OK | MB_ICONINFORMATION);
FreePasswords();
return;
}
}
}
if((m_bKeyMethod == PWM_KEYMETHOD_OR) && (m_cbDiskList.GetCurSel() == 0))
{
m_bKeyFile = FALSE;
}
else // Key file provided
{
m_cbDiskList.GetLBText(m_cbDiskList.GetCurSel(), strTemp);
if(m_bLoadMode == FALSE)
{
if(strTemp.GetAt(strTemp.GetLength() - 1) == _T('\\'))
{
if(GetDiskFreeSpaceEx((LPCTSTR)strTemp, &aBytes[0], &aBytes[1], &aBytes[2]) == FALSE)
{
strTemp = TRL("Cannot access the selected drive.");
strTemp += _T("\r\n\r\n");
strTemp += TRL("Make sure a writable medium is inserted.");
MessageBox(strTemp, TRL("Stop"), MB_OK | MB_ICONWARNING);
FreePasswords();
return;
}
if(aBytes[2].QuadPart < 128)
{
MessageBox(TRL("Not enough free disk space!"), TRL("Stop"), MB_OK | MB_ICONWARNING);
FreePasswords();
return;
}
}
FILE *fpTest = NULL;
CString strTemp2 = strTemp;
strTemp2 += _T("t2ub8rf6.tmp"); // Just a random filename, will work for directories and files
_tfopen_s(&fpTest, (LPCTSTR)strTemp2, _T("wb"));
if(fpTest == NULL)
{
strTemp = TRL("Cannot access the selected drive.");
strTemp += _T("\r\n\r\n");
strTemp += TRL("Make sure a writable medium is inserted.");
MessageBox(strTemp, TRL("Stop"), MB_OK | MB_ICONWARNING);
FreePasswords();
return;
}
fclose(fpTest); Sleep(100);
DeleteFile(strTemp2);
}
else // Load the key file
{
const DWORD dwDummyErrorCode = 0x6F4B1C80;
::SetLastError(dwDummyErrorCode);
HANDLE hKeyFile = CreateFile(strTemp, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
if(hKeyFile != INVALID_HANDLE_VALUE) CloseHandle(hKeyFile);
else // hKeyFile == INVALID_HANDLE_VALUE
{
DWORD dwKeyFileError = ::GetLastError();
if(dwKeyFileError != dwDummyErrorCode)
{
std::basic_string<TCHAR> strKeyError = strTemp;
strKeyError += _T("\r\n\r\n");
strKeyError += WU_FormatSystemMessage(dwKeyFileError);
MessageBox(strKeyError.c_str(), TRL("Password Safe"), MB_OK | MB_ICONWARNING);
FreePasswords();
return;
}
}
}
m_bKeyFile = TRUE;
if(m_bKeyMethod == PWM_KEYMETHOD_OR) m_pEditPw.DeletePassword(m_lpKey);
else m_lpKey2 = m_lpKey;
size_t sizeKeyBuffer = strTemp.GetLength() + 1;
m_lpKey = new TCHAR[sizeKeyBuffer];
ASSERT(m_lpKey != NULL); if(m_lpKey == NULL) { FreePasswords(); return; }
_tcscpy_s(m_lpKey, sizeKeyBuffer, (LPCTSTR)strTemp);
}
CleanUp();
ASSERT(m_bOnce == FALSE); m_bOnce = TRUE;
CDialog::OnOK();
}
void CPasswordDlg::OnCancel()
{
CleanUp();
ASSERT(m_bOnce == FALSE); m_bOnce = TRUE;
CDialog::OnCancel();
}
void CPasswordDlg::OnCheckStars()
{
BOOL bPrevState = m_bStars;
UpdateData(TRUE);
if((bPrevState == TRUE) && (m_bStars == FALSE) &&
(CPwSafeDlg::IsUnsafeAllowed(this->m_hWnd) == FALSE))
{
m_bStars = TRUE;
UpdateData(FALSE);
return;
}
if(m_bStars == FALSE)
{
m_pEditPw.EnableSecureMode(FALSE);
m_pEditPw.SetPasswordChar(0);
m_pEditPw.SetFont(&m_fStyle, TRUE);
}
else
{
// TCHAR tchDot = (TCHAR)(_T('z') + 27);
TCHAR tchDot = CPwSafeApp::GetPasswordCharacter();
m_pEditPw.EnableSecureMode(CPwSafeDlg::m_bSecureEdits);
m_pEditPw.SetPasswordChar(tchDot);
m_pEditPw.SetFont(&m_fSymbol, TRUE);
}
m_tipSecClear.Activate(m_pEditPw.IsSecureModeEnabled());
UpdateData(FALSE);
m_pEditPw.RedrawWindow();
m_pEditPw.SetFocus();
}
void CPasswordDlg::OnHelpBtn()
{
WU_OpenAppHelp(PWM_HELP_KEYS);
}
void CPasswordDlg::OnChangeEditPassword()
{
UpdateData(TRUE);
LPTSTR lp = m_pEditPw.GetPassword();
NewGUI_ShowQualityMeter(&m_cPassQuality, GetDlgItem(IDC_STATIC_PASSBITS), lp);
m_pEditPw.DeletePassword(lp); lp = NULL;
EnableClientWindows();
}
void CPasswordDlg::OnSelChangeComboDiskList()
{
EnableClientWindows();
}
void CPasswordDlg::EnableClientWindows()
{
UpdateData(TRUE);
int nPwLength = m_pEditPw.GetWindowTextLength();
int nComboSel = m_cbDiskList.GetCurSel();
if(m_bKeyMethod == PWM_KEYMETHOD_OR)
{
if(nPwLength != 0)
{
m_btBrowseKeyFile.EnableWindow(FALSE);
m_btStars.EnableWindow(TRUE);
m_pEditPw.EnableWindow(TRUE);
m_cbDiskList.EnableWindow(FALSE);
return;
}
else if(nComboSel != 0)
{
m_btBrowseKeyFile.EnableWindow(TRUE);
m_btStars.EnableWindow(FALSE);
m_pEditPw.EnableWindow(FALSE);
m_cbDiskList.EnableWindow(TRUE);
return;
}
}
m_btStars.EnableWindow(TRUE);
m_pEditPw.EnableWindow(TRUE);
m_cbDiskList.EnableWindow(TRUE);
if(nComboSel == 0) m_btBrowseKeyFile.EnableWindow(TRUE);
else m_btBrowseKeyFile.EnableWindow(FALSE);
}
void CPasswordDlg::OnCheckKeymethodAnd()
{
EnableClientWindows();
}
BOOL CPasswordDlg::PreTranslateMessage(MSG* pMsg)
{
m_tipSecClear.RelayEvent(pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
void CPasswordDlg::OnBnClickedBrowseKeyFile()
{
CString strFile;
DWORD dwFlags;
CString strFilter;
UpdateData(TRUE);
strFilter = TRL("All Files");
strFilter += _T(" (*.*)|*.*||");
dwFlags = OFN_LONGNAMES | OFN_EXTENSIONDIFFERENT;
// OFN_EXPLORER = 0x00080000, OFN_ENABLESIZING = 0x00800000
dwFlags |= 0x00080000 | 0x00800000;
if(m_bLoadMode == TRUE)
dwFlags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
else
dwFlags |= OFN_HIDEREADONLY;
CFileDialog dlg(m_bLoadMode, NULL, NULL, dwFlags, strFilter, this);
if(dlg.DoModal() == IDOK)
{
strFile = dlg.GetPathName();
COMBOBOXEXITEM cbi;
ZeroMemory(&cbi, sizeof(COMBOBOXEXITEM));
cbi.mask = CBEIF_IMAGE | CBEIF_TEXT | CBEIF_INDENT | CBEIF_SELECTEDIMAGE;
cbi.iItem = m_cbDiskList.GetCount();
cbi.pszText = (LPTSTR)(LPCTSTR)strFile;
cbi.cchTextMax = (int)_tcslen(cbi.pszText);
cbi.iImage = cbi.iSelectedImage = 28;
cbi.iIndent = 0;
int nx = m_cbDiskList.InsertItem(&cbi);
// m_cbDiskList.SelectString(-1, (LPCTSTR)strFile);
m_cbDiskList.SetCurSel(nx);
}
UpdateData(FALSE);
}
#pragma warning(pop)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -