diff options
author | George Hazan <ghazan@miranda.im> | 2021-01-08 17:55:06 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2021-01-08 17:55:06 +0300 |
commit | 8f3e583fffeba6606cf4442008c65e6902308080 (patch) | |
tree | 3dc085bc50bb64993faaaa5e4aeeaa273396887e /src/mir_app | |
parent | 64579d553e4089d55c136140bd0058696d2cf526 (diff) |
encryption code unification, part 2: initialization & data storage
Diffstat (limited to 'src/mir_app')
-rw-r--r-- | src/mir_app/res/database.ico | bin | 0 -> 5430 bytes | |||
-rw-r--r-- | src/mir_app/res/resource.rc | 15 | ||||
-rw-r--r-- | src/mir_app/src/MDatabaseCommonCrypt.cpp | 130 | ||||
-rw-r--r-- | src/mir_app/src/MDatabaseReadonly.cpp | 27 | ||||
-rw-r--r-- | src/mir_app/src/ei_services.cpp | 9 | ||||
-rw-r--r-- | src/mir_app/src/mir_app.def | 8 | ||||
-rw-r--r-- | src/mir_app/src/mir_app64.def | 8 | ||||
-rw-r--r-- | src/mir_app/src/resource.h | 6 |
8 files changed, 190 insertions, 13 deletions
diff --git a/src/mir_app/res/database.ico b/src/mir_app/res/database.ico Binary files differnew file mode 100644 index 0000000000..f49bbe83d6 --- /dev/null +++ b/src/mir_app/res/database.ico diff --git a/src/mir_app/res/resource.rc b/src/mir_app/res/resource.rc index 30b353082e..895593352c 100644 --- a/src/mir_app/res/resource.rc +++ b/src/mir_app/res/resource.rc @@ -890,6 +890,20 @@ BEGIN LTEXT "",IDC_CRYPTOPROVIDER_DESCR,17,29,197,14,NOT WS_GROUP
END
+IDD_LOGIN DIALOGEX 0, 0, 190, 86
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_TOPMOST | WS_EX_TOOLWINDOW
+CAPTION "Login to Miranda NG"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ CONTROL "",IDC_HEADERBAR,"MHeaderbarCtrl",0x0,0,0,190,26
+ CTEXT "",IDC_LANG,158,34,13,13,SS_CENTERIMAGE | NOT WS_GROUP
+ EDITTEXT IDC_USERPASS,21,34,128,14,ES_PASSWORD | ES_AUTOHSCROLL | WS_GROUP
+ DEFPUSHBUTTON "OK",IDOK,36,64,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,102,64,50,14
+ CONTROL "",IDC_STATIC,"Static",SS_ETCHEDFRAME,0,55,190,1
+END
+
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
@@ -1338,6 +1352,7 @@ IDI_PASSWORD ICON "icon_password.ico" IDI_SOUND ICON "sound.ico"
+IDI_DATABASE ICON "database.ico"
/////////////////////////////////////////////////////////////////////////////
//
diff --git a/src/mir_app/src/MDatabaseCommonCrypt.cpp b/src/mir_app/src/MDatabaseCommonCrypt.cpp index 0b3a135e46..10a3e21881 100644 --- a/src/mir_app/src/MDatabaseCommonCrypt.cpp +++ b/src/mir_app/src/MDatabaseCommonCrypt.cpp @@ -90,16 +90,11 @@ CRYPTO_PROVIDER* MDatabaseCommon::SelectProvider() return (StoreProvider(pProv)) ? pProv : nullptr; } -STDMETHODIMP_(BOOL) MDatabaseCommon::StoreProvider(CRYPTO_PROVIDER *) -{ - return FALSE; -} - ///////////////////////////////////////////////////////////////////////////////////////// BOOL MDatabaseCommon::IsSettingEncrypted(LPCSTR szModule, LPCSTR szSetting) { - if (!_strnicmp(szSetting, "password", 8)) return true; + if (!_strnicmp(szSetting, "password", 8)) return true; if (!mir_strcmp(szSetting, "NLProxyAuthPassword")) return true; if (!mir_strcmp(szSetting, "LNPassword")) return true; if (!mir_strcmp(szSetting, "FileProxyPassword")) return true; @@ -111,3 +106,126 @@ BOOL MDatabaseCommon::IsSettingEncrypted(LPCSTR szModule, LPCSTR szSetting) } return false; } + +///////////////////////////////////////////////////////////////////////////////////////// + +class CEnterPasswordDialog : public CDlgBase +{ + friend class MDatabaseCommon; + + CTimer m_timer; + CCtrlData m_header; + CCtrlData m_language; + CCtrlEdit m_passwordEdit; + + int m_wrongPass = 0; + wchar_t m_newPass[100]; + MDatabaseCommon *m_db; + + void OnTimer(CTimer*) + { + UINT_PTR LangID = (UINT_PTR)GetKeyboardLayout(0); + char Lang[3] = { 0 }; + GetLocaleInfoA(MAKELCID((LangID & 0xffffffff), SORT_DEFAULT), LOCALE_SABBREVLANGNAME, Lang, 2); + Lang[0] = toupper(Lang[0]); + Lang[1] = tolower(Lang[1]); + m_language.SetTextA(Lang); + } + + INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) override + { + if (msg == WM_CTLCOLORSTATIC) { + if ((HWND)lParam == m_language.GetHwnd()) { + SetTextColor((HDC)wParam, GetSysColor(COLOR_HIGHLIGHTTEXT)); + SetBkMode((HDC)wParam, TRANSPARENT); + return (INT_PTR)GetSysColorBrush(COLOR_HIGHLIGHT); + } + } + return CDlgBase::DlgProc(msg, wParam, lParam); + } + +public: + CEnterPasswordDialog(MDatabaseCommon *db) : + CDlgBase(g_plugin, IDD_LOGIN), + m_timer(this, 1), + m_header(this, IDC_HEADERBAR), + m_language(this, IDC_LANG), + m_passwordEdit(this, IDC_USERPASS), + m_db(db) + { + m_newPass[0] = 0; + m_timer.OnEvent = Callback(this, &CEnterPasswordDialog::OnTimer); + } + + bool OnInitDialog() override + { + m_header.SendMsg(WM_SETICON, ICON_SMALL, (LPARAM)g_plugin.getIcon(IDI_DATABASE, true)); + + if (m_wrongPass) { + if (m_wrongPass > 2) { + m_passwordEdit.Disable(); + EnableWindow(GetDlgItem(m_hwnd, IDOK), false); + m_header.SetText(TranslateT("Too many errors!")); + } + else m_header.SetText(TranslateT("Password is not correct!")); + } + else m_header.SetText(TranslateT("Please type in your password")); + + m_timer.Start(200); + return true; + } + + bool OnApply() override + { + m_passwordEdit.GetText(m_newPass, _countof(m_newPass)); + return true; + } + + void OnDestroy() override + { + Window_FreeIcon_IcoLib(m_header.GetHwnd()); + } +}; + +int MDatabaseCommon::InitCrypt() +{ + if (m_crypto != nullptr) + return 0; + + CRYPTO_PROVIDER *pProvider = ReadProvider(); + if (pProvider == nullptr) + pProvider = SelectProvider(); + if (pProvider == nullptr) + return 1; + + if ((m_crypto = pProvider->pFactory()) == nullptr) + return 3; + + MBinBuffer key; + BOOL bSuccess = ReadCryptoKey(key); + if (bSuccess && (key.length() == m_crypto->getKeyLength())) { + if (!m_crypto->setKey((const BYTE*)key.data(), key.length())) { + CEnterPasswordDialog dlg(this); + while (true) { + if (!dlg.DoModal()) + return 4; + + m_crypto->setPassword(pass_ptrA(mir_utf8encodeW(dlg.m_newPass))); + if (m_crypto->setKey((const BYTE*)key.data(), key.length())) { + m_bUsesPassword = true; + SecureZeroMemory(&dlg.m_newPass, sizeof(dlg.m_newPass)); + break; + } + dlg.m_wrongPass++; + } + } + } + else { + if (!m_crypto->generateKey()) + return 6; + StoreCryptoKey(); + } + + m_bEncrypted = ReadEncryption(); + return 0; +} diff --git a/src/mir_app/src/MDatabaseReadonly.cpp b/src/mir_app/src/MDatabaseReadonly.cpp index 7490eff643..a1fef48769 100644 --- a/src/mir_app/src/MDatabaseReadonly.cpp +++ b/src/mir_app/src/MDatabaseReadonly.cpp @@ -44,6 +44,33 @@ BOOL MDatabaseReadonly::EnumModuleNames(DBMODULEENUMPROC, void*) ///////////////////////////////////////////////////////////////////////////////////////// +STDMETHODIMP_(BOOL) MDatabaseReadonly::ReadCryptoKey(MBinBuffer&) +{ + return FALSE; +} + +STDMETHODIMP_(BOOL) MDatabaseReadonly::StoreCryptoKey() +{ + return FALSE; +} + +STDMETHODIMP_(CRYPTO_PROVIDER*) MDatabaseReadonly::ReadProvider() +{ + return nullptr; +} + +STDMETHODIMP_(BOOL) MDatabaseReadonly::StoreProvider(CRYPTO_PROVIDER *) +{ + return FALSE; +} + +STDMETHODIMP_(BOOL) MDatabaseReadonly::ReadEncryption() +{ + return FALSE; +} + +///////////////////////////////////////////////////////////////////////////////////////// + MCONTACT MDatabaseReadonly::AddContact(void) { return 0; diff --git a/src/mir_app/src/ei_services.cpp b/src/mir_app/src/ei_services.cpp index d44a310d09..c891ef3f7a 100644 --- a/src/mir_app/src/ei_services.cpp +++ b/src/mir_app/src/ei_services.cpp @@ -465,10 +465,11 @@ MIR_APP_DLL(int) ExtraIcon_Clear(HANDLE hExtraIcon, MCONTACT hContact) static IconItem iconList[] = { - { LPGEN("Chat activity"), "ChatActivity", IDI_CHAT }, - { LPGEN("Mute chat"), "ChatMute", IDI_OFF }, - { LPGEN("Male"), "gender_male", IDI_MALE }, - { LPGEN("Female"), "gender_female", IDI_FEMALE } + { LPGEN("Chat activity"), "ChatActivity", IDI_CHAT }, + { LPGEN("Mute chat"), "ChatMute", IDI_OFF }, + { LPGEN("Male"), "gender_male", IDI_MALE }, + { LPGEN("Female"), "gender_female", IDI_FEMALE }, + { LPGEN("Database"), "database", IDI_DATABASE }, }; void LoadExtraIconsModule() diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index 70dc5372b8..8e4c4994c5 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -757,7 +757,13 @@ _Netlib_GetTlsUnique@8 @831 NONAME ?getCrypt@MDatabaseCommon@@QBEPAUMICryptoEngine@@XZ @845 NONAME
?isEncrypted@MDatabaseCommon@@QBE_NXZ @846 NONAME
?SelectProvider@MDatabaseCommon@@IAEPAUCRYPTO_PROVIDER@@XZ @847 NONAME
-?StoreProvider@MDatabaseCommon@@MAGHPAUCRYPTO_PROVIDER@@@Z @848 NONAME
+?StoreProvider@MDatabaseReadonly@@UAGHPAUCRYPTO_PROVIDER@@@Z @848 NONAME
?Crypto_GetProvider@@YGPAUCRYPTO_PROVIDER@@PBD@Z @849 NONAME
?Crypto_ListProviders@@YGXPAHPAPAPAUCRYPTO_PROVIDER@@@Z @850 NONAME
?Crypto_RegisterEngine@@YGXPBUCRYPTO_PROVIDER@@@Z @851 NONAME
+?InitCrypt@MDatabaseCommon@@IAEHXZ @852 NONAME
+?ReadCryptoKey@MDatabaseReadonly@@UAGHAAVMBinBuffer@@@Z @853 NONAME
+?ReadEncryption@MDatabaseReadonly@@UAGHXZ @854 NONAME
+?ReadProvider@MDatabaseReadonly@@UAGPAUCRYPTO_PROVIDER@@XZ @855 NONAME
+?StoreCryptoKey@MDatabaseReadonly@@UAGHXZ @856 NONAME
+?usesPassword@MDatabaseCommon@@QBE_NXZ @857 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 804cbf7c55..f9f3d0e791 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -757,7 +757,13 @@ Netlib_GetTlsUnique @831 NONAME ?getCrypt@MDatabaseCommon@@QEBAPEAUMICryptoEngine@@XZ @845 NONAME
?isEncrypted@MDatabaseCommon@@QEBA_NXZ @846 NONAME
?SelectProvider@MDatabaseCommon@@IEAAPEAUCRYPTO_PROVIDER@@XZ @847 NONAME
-?StoreProvider@MDatabaseCommon@@MEAAHPEAUCRYPTO_PROVIDER@@@Z @848 NONAME
+?StoreProvider@MDatabaseReadonly@@UEAAHPEAUCRYPTO_PROVIDER@@@Z @848 NONAME
?Crypto_GetProvider@@YAPEAUCRYPTO_PROVIDER@@PEBD@Z @849 NONAME
?Crypto_ListProviders@@YAXPEAHPEAPEAPEAUCRYPTO_PROVIDER@@@Z @850 NONAME
?Crypto_RegisterEngine@@YAXPEBUCRYPTO_PROVIDER@@@Z @851 NONAME
+?InitCrypt@MDatabaseCommon@@IEAAHXZ @852 NONAME
+?ReadCryptoKey@MDatabaseReadonly@@UEAAHAEAVMBinBuffer@@@Z @853 NONAME
+?ReadEncryption@MDatabaseReadonly@@UEAAHXZ @854 NONAME
+?ReadProvider@MDatabaseReadonly@@UEAAPEAUCRYPTO_PROVIDER@@XZ @855 NONAME
+?StoreCryptoKey@MDatabaseReadonly@@UEAAHXZ @856 NONAME
+?usesPassword@MDatabaseCommon@@QEBA_NXZ @857 NONAME
diff --git a/src/mir_app/src/resource.h b/src/mir_app/src/resource.h index 9784e98b46..c4fb0e3a94 100644 --- a/src/mir_app/src/resource.h +++ b/src/mir_app/src/resource.h @@ -29,6 +29,8 @@ #define IDD_OPT_CHAT_EVENTS 120
#define IDD_AUTHREQ 121
#define IDD_SELECT_CRYPTOPROVIDER 122
+#define IDD_LOGIN 123
+#define IDI_DATABASE 124
#define IDD_DETAILS 125
#define IDD_HISTORY 127
#define IDI_AWAY 128
@@ -351,8 +353,10 @@ #define IDC_USESPECIFIC 1212
#define IDC_FILEDIR 1213
#define IDC_TRANSFERCOMPLETED 1214
+#define IDC_LANG 1215
+#define IDC_USERPASS 1216
#define IDC_ALLFILESPROGRESS 1217
-#define IDC_WHITERECT 1221
+#define IDC_WHITERECT 1220
#define IDC_ALLSPEED 1221
#define IDC_FIRSTNAME 1224
#define IDC_LASTNAME 1225
|