📄 pwsafe.cpp
字号:
/*
KeePass Password Safe - The Open-Source Password Manager
Copyright (C) 2003-2007 Dominik Reichl <dominik.reichl@t-online.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "StdAfx.h"
#include "PwSafe.h"
#include "PwSafeDlg.h"
#include "../KeePassLibCpp/Util/TranslateEx.h"
#include "../KeePassLibCpp/Util/MemUtil.h"
#include "Util/PrivateConfigEx.h"
#include "Util/CmdLine/CmdArgs.h"
#include "Util/CmdLine/Executable.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static UINT g_uThreadACP = 0;
static BOOL g_bForceSimpleAsterisks = FALSE;
static TCHAR g_pFontNameNormal[12];
static TCHAR g_pFontNameSymbol[8];
/////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CPwSafeApp, CWinApp)
//{{AFX_MSG_MAP(CPwSafeApp)
//}}AFX_MSG
// ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
CPwSafeApp::CPwSafeApp()
{
_tcscpy_s(g_pFontNameNormal, _countof(g_pFontNameNormal), _T("MS Serif"));
_tcscpy_s(g_pFontNameSymbol, _countof(g_pFontNameSymbol), _T("Symbol"));
}
/////////////////////////////////////////////////////////////////////////////
CPwSafeApp theApp;
/////////////////////////////////////////////////////////////////////////////
BOOL CPwSafeApp::InitInstance()
{
#if (_MFC_VER < 0x0500)
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
#endif
if(ProcessControlCommands() == TRUE) return FALSE;
// Create application's mutex object to make our presence public
m_pAppMutex = new CMutex(FALSE, _T("KeePassApplicationMutex"), NULL);
if(m_pAppMutex == NULL) { ASSERT(FALSE); }
VERIFY(AfxOleInit());
AfxEnableControlContainer();
#ifndef _UNICODE
AfxInitRichEdit();
#else
AfxInitRichEditEx();
#endif
InitCommonControls();
// SetDialogBkColor(NewGUI_GetBgColor(), CR_FRONT); // Setup the "new" dialog look
ASSERT(TRUE == 1); ASSERT(FALSE == 0);
g_uThreadACP = GetACP();
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if((osvi.dwMajorVersion == 5) && (osvi.dwMinorVersion == 0)) // Windows 2000
g_bForceSimpleAsterisks = TRUE;
CPwSafeDlg dlg;
m_pMainWnd = &dlg;
CPrivateConfigEx *pc = new CPrivateConfigEx(FALSE);
if(pc != NULL)
{
dlg.m_bCheckForInstance = pc->GetBool(PWMKEY_SINGLEINSTANCE, FALSE);
delete pc; pc = NULL;
}
if(dlg.m_bCheckForInstance == TRUE)
{
dlg.m_instanceChecker.ActivateChecker();
if(dlg.m_instanceChecker.PreviousInstanceRunning())
{
/* CString strFile;
LPCTSTR lpPassword = NULL;
LPCTSTR lpKeyFile = NULL;
LPCTSTR lpPreSelectPath = NULL;
DWORD dwData = 0;
ParseCurrentCommandLine(&strFile, &lpPassword, &lpKeyFile, &lpPreSelectPath);
if(strFile.GetLength() != 0)
{
if(lpPassword != NULL)
{
dwData |= (DWORD)_tcslen(lpPassword) << 16;
strFile = CString(lpPassword) + strFile;
}
if(lpKeyFile != NULL)
{
dwData |= (DWORD)_tcslen(lpKeyFile);
strFile = CString(lpKeyFile) + strFile;
}
dlg.m_instanceChecker.ActivatePreviousInstance((LPCTSTR)strFile, dwData);
}
else dlg.m_instanceChecker.ActivatePreviousInstance(_T(""), 0xF0FFFFF0); */
const FullPathName& database = CmdArgs::instance().getDatabase();
if(database.getState()==FullPathName::PATH_AND_FILENAME)
{
std_string string(database.getFullPathName());
DWORD dwData = 0;
if(!CmdArgs::instance().getPassword().empty())
{
dwData |= (DWORD)CmdArgs::instance().getPassword().length() << 16;
string = CmdArgs::instance().getPassword() + string;
}
const FullPathName& keyfile = CmdArgs::instance().getKeyfile();
enum {PATH_EXISTS = FullPathName::PATH_ONLY | FullPathName::PATH_AND_FILENAME};
if(keyfile.getState() & PATH_EXISTS && !CmdArgs::instance().preselectIsInEffect())
{
dwData |= (DWORD)keyfile.getFullPathName().length();
string = keyfile.getFullPathName() + string;
}
dlg.m_instanceChecker.ActivatePreviousInstance(string.c_str(), dwData);
}
else dlg.m_instanceChecker.ActivatePreviousInstance(_T(""), 0xF0FFFFF0);
m_pMainWnd = NULL;
return FALSE;
}
}
const INT_PTR nResponse = dlg.DoModal();
if(nResponse == IDOK) { }
else if(nResponse == IDCANCEL) { }
return FALSE;
}
int CPwSafeApp::ExitInstance()
{
// Release application's mutex object
if(m_pAppMutex != NULL)
{
m_pAppMutex->Unlock();
delete m_pAppMutex;
m_pAppMutex = NULL;
}
return CWinApp::ExitInstance();
}
BOOL CPwSafeApp::RegisterShellAssociation()
{
LONG l;
HKEY hBase, hShell, hTemp, hTemp2;
// TCHAR tszTemp[MAX_PATH * 2];
// TCHAR tszMe[MAX_PATH * 2];
DWORD dw;
// VERIFY(GetModuleFileName(NULL, tszMe, MAX_PATH * 2 - 2) != 0);
std_string strMe = Executable::instance().getFullPathName();
// HKEY_CLASSES_ROOT/.kdb
l = RegCreateKey(HKEY_CLASSES_ROOT, _T(".kdb"), &hBase);
if(l != ERROR_SUCCESS) return FALSE;
std_string strTemp = _T("kdbfile");
dw = static_cast<DWORD>((strTemp.length() + 1) * sizeof(TCHAR));
l = RegSetValueEx(hBase, _T(""), 0, REG_SZ, (CONST BYTE *)strTemp.c_str(), dw);
ASSERT(l == ERROR_SUCCESS); if(l != ERROR_SUCCESS) { RegCloseKey(hBase); return FALSE; }
RegCloseKey(hBase);
// HKEY_CLASSES_ROOT/kdbfile
l = RegCreateKey(HKEY_CLASSES_ROOT, _T("kdbfile"), &hBase);
ASSERT(l == ERROR_SUCCESS); if(l != ERROR_SUCCESS) return FALSE;
// _tcscpy_s(tszTemp, _countof(tszTemp), TRL("KeePass Password Database"));
strTemp = TRL("KeePass Password Database");
dw = static_cast<DWORD>((strTemp.length() + 1) * sizeof(TCHAR));
l = RegSetValueEx(hBase, _T(""), 0, REG_SZ, (CONST BYTE *)strTemp.c_str(), dw);
ASSERT(l == ERROR_SUCCESS); if(l != ERROR_SUCCESS) { RegCloseKey(hBase); return FALSE; }
// _tcscpy_s(tszTemp, _countof(tszTemp), _T(""));
strTemp = _T("");
dw = static_cast<DWORD>((strTemp.length() + 1) * sizeof(TCHAR));
l = RegSetValueEx(hBase, _T("AlwaysShowExt"), 0, REG_SZ, (CONST BYTE *)strTemp.c_str(), dw);
ASSERT(l == ERROR_SUCCESS); if(l != ERROR_SUCCESS) { RegCloseKey(hBase); return FALSE; }
l = RegCreateKey(hBase, _T("DefaultIcon"), &hTemp);
ASSERT(l == ERROR_SUCCESS); if(l != ERROR_SUCCESS) return FALSE;
// _tcscpy_s(tszTemp, _countof(tszTemp), tszMe);
strTemp = strMe;
// _tcscat_s(tszTemp, _countof(tszTemp), _T(",0"));
strTemp += _T(",0");
dw = static_cast<DWORD>((strTemp.length() + 1) * sizeof(TCHAR));
l = RegSetValueEx(hTemp, _T(""), 0, REG_SZ, (CONST BYTE *)strTemp.c_str(), dw);
ASSERT(l == ERROR_SUCCESS); if(l != ERROR_SUCCESS) { RegCloseKey(hTemp); RegCloseKey(hBase); return FALSE; }
RegCloseKey(hTemp);
// HKEY_CLASSES_ROOT/kdbfile/shell
l = RegCreateKey(hBase, _T("shell"), &hShell);
ASSERT(l == ERROR_SUCCESS); if(l != ERROR_SUCCESS) return FALSE;
// HKEY_CLASSES_ROOT/kdbfile/shell/open
l = RegCreateKey(hShell, _T("open"), &hTemp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -