summaryrefslogtreecommitdiff
path: root/src/mir_app
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2021-01-08 17:55:06 +0300
committerGeorge Hazan <ghazan@miranda.im>2021-01-08 17:55:06 +0300
commit8f3e583fffeba6606cf4442008c65e6902308080 (patch)
tree3dc085bc50bb64993faaaa5e4aeeaa273396887e /src/mir_app
parent64579d553e4089d55c136140bd0058696d2cf526 (diff)
encryption code unification, part 2: initialization & data storage
Diffstat (limited to 'src/mir_app')
-rw-r--r--src/mir_app/res/database.icobin0 -> 5430 bytes
-rw-r--r--src/mir_app/res/resource.rc15
-rw-r--r--src/mir_app/src/MDatabaseCommonCrypt.cpp130
-rw-r--r--src/mir_app/src/MDatabaseReadonly.cpp27
-rw-r--r--src/mir_app/src/ei_services.cpp9
-rw-r--r--src/mir_app/src/mir_app.def8
-rw-r--r--src/mir_app/src/mir_app64.def8
-rw-r--r--src/mir_app/src/resource.h6
8 files changed, 190 insertions, 13 deletions
diff --git a/src/mir_app/res/database.ico b/src/mir_app/res/database.ico
new file mode 100644
index 0000000000..f49bbe83d6
--- /dev/null
+++ b/src/mir_app/res/database.ico
Binary files differ
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