⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 passworddlg.cpp

📁 一款密码保险箱源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -