From 2e511ab1b1ff3d78c695874e3b28ff4ce7680cc8 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 2 Apr 2015 17:28:07 +0000 Subject: kyotocabinet based db driver first version that compiles DO NOT USE IT, dragons live there git-svn-id: http://svn.miranda-ng.org/main/trunk@12580 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/Dbx_kyoto/src/ui.cpp | 340 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 plugins/Dbx_kyoto/src/ui.cpp (limited to 'plugins/Dbx_kyoto/src/ui.cpp') diff --git a/plugins/Dbx_kyoto/src/ui.cpp b/plugins/Dbx_kyoto/src/ui.cpp new file mode 100644 index 0000000000..a4ba3d12c5 --- /dev/null +++ b/plugins/Dbx_kyoto/src/ui.cpp @@ -0,0 +1,340 @@ +/* + +Miranda NG: the free IM client for Microsoft* Windows* + +Copyright (ñ) 2012-15 Miranda NG project (http://miranda-ng.org) +all portions of this codebase are copyrighted to the people +listed in contributors.txt. + +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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "commonheaders.h" + +struct DlgChangePassParam +{ + CDbxKV *db; + TCHAR newPass[100]; + int wrongPass; +}; + +#define MS_DB_CHANGEPASSWORD "DB/UI/ChangePassword" + +static IconItem iconList[] = +{ + { LPGEN("Logo"), "logo", IDI_LOGO }, + { LPGEN("Password"), "password", IDI_ICONPASS } +}; + +static HGENMENU hSetPwdMenu; + +static UINT oldLangID; +void LanguageChanged(HWND hwndDlg) +{ + UINT LangID = (UINT)GetKeyboardLayout(0); + char Lang[3] = { 0 }; + if (LangID != oldLangID) { + oldLangID = LangID; + GetLocaleInfoA(MAKELCID((LangID & 0xffffffff), SORT_DEFAULT), LOCALE_SABBREVLANGNAME, Lang, 2); + Lang[0] = toupper(Lang[0]); + Lang[1] = tolower(Lang[1]); + SetDlgItemTextA(hwndDlg, IDC_LANG, Lang); + } +} + +///////////////////////////////////////////////////////////////////////////////////////// + +static INT_PTR CALLBACK sttEnterPassword(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + DlgChangePassParam *param = (DlgChangePassParam*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + switch (uMsg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + SendDlgItemMessage(hwndDlg, IDC_HEADERBAR, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(g_hInst, MAKEINTRESOURCE(iconList[0].defIconID))); + + param = (DlgChangePassParam*)lParam; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + if (param->wrongPass) { + if (param->wrongPass > 2) { + HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_USERPASS); + EnableWindow(hwndCtrl, FALSE); + hwndCtrl = GetDlgItem(hwndDlg, IDOK); + EnableWindow(hwndCtrl, FALSE); + SetDlgItemText(hwndDlg, IDC_HEADERBAR, TranslateT("Too many errors!")); + } + else SetDlgItemText(hwndDlg, IDC_HEADERBAR, TranslateT("Password is not correct!")); + } + else SetDlgItemText(hwndDlg, IDC_HEADERBAR, TranslateT("Please type in your password")); + + oldLangID = 0; + SetTimer(hwndDlg, 1, 200, NULL); + LanguageChanged(hwndDlg); + return TRUE; + + case WM_CTLCOLORSTATIC: + if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_LANG)) { + SetTextColor((HDC)wParam, GetSysColor(COLOR_HIGHLIGHTTEXT)); + SetBkMode((HDC)wParam, TRANSPARENT); + return (BOOL)GetSysColorBrush(COLOR_HIGHLIGHT); + } + return FALSE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDCANCEL: + EndDialog(hwndDlg, IDCANCEL); + break; + + case IDOK: + GetDlgItemText(hwndDlg, IDC_USERPASS, param->newPass, SIZEOF(param->newPass)); + EndDialog(hwndDlg, IDOK); + } + break; + + case WM_TIMER: + LanguageChanged(hwndDlg); + return FALSE; + + case WM_DESTROY: + KillTimer(hwndDlg, 1); + DestroyIcon((HICON)SendMessage(hwndDlg, WM_GETICON, ICON_SMALL, 0)); + } + + return FALSE; +} + +bool CDbxKV::EnterPassword(const BYTE *pKey, const size_t keyLen) +{ + DlgChangePassParam param = { this }; + while (true) { + // Esc pressed + if (IDOK != DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_LOGIN), 0, sttEnterPassword, (LPARAM)¶m)) + return false; + + m_crypto->setPassword(ptrA(mir_utf8encodeT(param.newPass))); + if (m_crypto->setKey(pKey, keyLen)) { + m_bUsesPassword = true; + SecureZeroMemory(¶m, sizeof(param)); + return true; + } + + param.wrongPass++; + } +} + +///////////////////////////////////////////////////////////////////////////////////////// + +static bool CheckOldPassword(HWND hwndDlg, CDbxKV *db) +{ + if (db->usesPassword()) { + TCHAR buf[100]; + GetDlgItemText(hwndDlg, IDC_OLDPASS, buf, SIZEOF(buf)); + ptrA oldPass(mir_utf8encodeT(buf)); + if (!db->m_crypto->checkPassword(oldPass)) { + SetDlgItemText(hwndDlg, IDC_HEADERBAR, TranslateT("Wrong old password entered!")); + return false; + } + } + return true; +} + +static INT_PTR CALLBACK sttChangePassword(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + DlgChangePassParam *param = (DlgChangePassParam*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + TCHAR buf[100]; + + switch (uMsg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + SendDlgItemMessage(hwndDlg, IDC_HEADERBAR, WM_SETICON, ICON_SMALL, (LPARAM)Skin_GetIconByHandle(iconList[0].hIcolib, true)); + + param = (DlgChangePassParam*)lParam; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + oldLangID = 0; + SetTimer(hwndDlg, 1, 200, NULL); + LanguageChanged(hwndDlg); + return TRUE; + + case WM_CTLCOLORSTATIC: + if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_LANG)) { + SetTextColor((HDC)wParam, GetSysColor(COLOR_HIGHLIGHTTEXT)); + SetBkMode((HDC)wParam, TRANSPARENT); + return (BOOL)GetSysColorBrush(COLOR_HIGHLIGHT); + } + return FALSE; + + case WM_COMMAND: + switch (LOWORD(wParam)) { + case IDCANCEL: + EndDialog(hwndDlg, IDCANCEL); + break; + + case IDREMOVE: + if (!CheckOldPassword(hwndDlg, param->db)) { + LBL_Error: + SendDlgItemMessage(hwndDlg, IDC_HEADERBAR, WM_NCPAINT, 0, 0); + SetDlgItemTextA(hwndDlg, IDC_USERPASS1, ""); + SetDlgItemTextA(hwndDlg, IDC_USERPASS2, ""); + } + else { + // param->db->WriteSignature(dbSignatureU); + param->db->SetPassword(NULL); + param->db->StoreKey(); + EndDialog(hwndDlg, IDREMOVE); + } + break; + + case IDOK: + TCHAR buf2[100]; + GetDlgItemText(hwndDlg, IDC_USERPASS1, buf2, SIZEOF(buf2)); + if (_tcslen(buf2) < 3) { + SetDlgItemText(hwndDlg, IDC_HEADERBAR, TranslateT("Password is too short!")); + goto LBL_Error; + } + + GetDlgItemText(hwndDlg, IDC_USERPASS2, buf, SIZEOF(buf)); + if (_tcscmp(buf2, buf)) { + SetDlgItemText(hwndDlg, IDC_HEADERBAR, TranslateT("Passwords do not match!")); + goto LBL_Error; + } + + if (!CheckOldPassword(hwndDlg, param->db)) + goto LBL_Error; + + // param->db->WriteSignature(dbSignatureE); + param->db->SetPassword(buf2); + param->db->StoreKey(); + SecureZeroMemory(buf2, sizeof(buf2)); + EndDialog(hwndDlg, IDOK); + } + break; + + case WM_TIMER: + LanguageChanged(hwndDlg); + return FALSE; + + case WM_DESTROY: + KillTimer(hwndDlg, 1); + Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_GETICON, ICON_SMALL, 0)); + } + + return FALSE; +} + +static INT_PTR ChangePassword(void* obj, WPARAM, LPARAM) +{ + CDbxKV *db = (CDbxKV*)obj; + DlgChangePassParam param = { db }; + DialogBoxParam(g_hInst, MAKEINTRESOURCE(db->usesPassword() ? IDD_CHANGEPASS : IDD_NEWPASS), 0, sttChangePassword, (LPARAM)¶m); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +INT_PTR CALLBACK DlgProcOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + CDbxKV *db = (CDbxKV *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + db = (CDbxKV*)lParam; + CheckRadioButton(hwndDlg, IDC_STANDARD, IDC_TOTAL, IDC_STANDARD + db->isEncrypted()); + return TRUE; + + case WM_COMMAND: + if (HIWORD(wParam) == BN_CLICKED && (HWND)lParam == GetFocus()) { + if (LOWORD(wParam) == IDC_USERPASS) + CallService(MS_DB_CHANGEPASSWORD, 0, 0); + else + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + + case WM_NOTIFY: + if (((LPNMHDR)lParam)->code == PSN_APPLY) { + if (IsDlgButtonChecked(hwndDlg, IDC_TOTAL) != (UINT)db->isEncrypted()) { + db->ToggleEncryption(); + CheckRadioButton(hwndDlg, IDC_STANDARD, IDC_TOTAL, IDC_STANDARD + db->isEncrypted()); + } + break; + } + break; + } + + return FALSE; +} + +static int OnOptionsInit(PVOID obj, WPARAM wParam, LPARAM) +{ + OPTIONSDIALOGPAGE odp = { sizeof(odp) }; + odp.position = -790000000; + odp.hInstance = g_hInst; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS); + odp.flags = ODPF_BOLDGROUPS; + odp.pszTitle = LPGEN("Database"); + odp.pfnDlgProc = DlgProcOptions; + odp.dwInitParam = (LPARAM)obj; + Options_AddPage(wParam, &odp); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +void CDbxKV::UpdateMenuItem() +{ + CLISTMENUITEM mi = { sizeof(mi) }; + mi.flags = CMIM_NAME; + mi.icolibItem = iconList[1].hIcolib; + mi.pszName = GetMenuTitle(); + Menu_ModifyItem(hSetPwdMenu, &mi); +} + +static int OnModulesLoaded(PVOID obj, WPARAM, LPARAM) +{ + CDbxKV *db = (CDbxKV*)obj; + + Icon_Register(g_hInst, LPGEN("Database"), iconList, SIZEOF(iconList), "mmap"); + + HookEventObj(ME_OPT_INITIALISE, OnOptionsInit, db); + + // main menu item + CLISTMENUITEM mi = { sizeof(mi) }; + mi.pszName = LPGEN("Database"); + mi.position = 500000000; + mi.flags = CMIF_ROOTHANDLE; + mi.icolibItem = iconList[0].hIcolib; + HGENMENU hMenuRoot = Menu_AddMainMenuItem(&mi); + + mi.icolibItem = iconList[1].hIcolib; + mi.pszName = db->GetMenuTitle(); + mi.hParentMenu = hMenuRoot; + mi.pszService = MS_DB_CHANGEPASSWORD; + hSetPwdMenu = Menu_AddMainMenuItem(&mi); + return 0; +} + +///////////////////////////////////////////////////////////////////////////////////////// + +void CDbxKV::InitDialogs() +{ + hService = CreateServiceFunctionObj(MS_DB_CHANGEPASSWORD, ChangePassword, this); + hHook = HookEventObj(ME_SYSTEM_MODULESLOADED, OnModulesLoaded, this); +} -- cgit v1.2.3