From 5657453dcc8626b9f7f13f7ade1eb3e5afa13cc8 Mon Sep 17 00:00:00 2001 From: Gluzskiy Alexandr Date: Sun, 3 Feb 2013 15:46:24 +0200 Subject: ability to change key password (because of fucked gpg which does not want to give us his stdin/stdout only via ugly windows console) --- utilities.cpp | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) (limited to 'utilities.cpp') diff --git a/utilities.cpp b/utilities.cpp index dd94ac9..b42d8e7 100755 --- a/utilities.cpp +++ b/utilities.cpp @@ -2253,3 +2253,126 @@ void ShowExportKeysDlg() extern HINSTANCE hInst; DialogBox(hInst, MAKEINTRESOURCE(IDD_EXPORT_TYPE), NULL, DlgProcExportKeys); } + +static INT_PTR CALLBACK DlgProcChangePasswd(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + TranslateDialogDefault(hwndDlg); + return TRUE; + } + + + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDC_OK: + //TODO: show some prgress + { + std::string old_pass, new_pass; + extern TCHAR key_id_global[17]; + TCHAR buf[256] = {0}; + GetDlgItemText(hwndDlg, IDC_NEW_PASSWD1, buf, 255); + new_pass = toUTF8(buf); + GetDlgItemText(hwndDlg, IDC_NEW_PASSWD2, buf, 255); + if(new_pass != toUTF8(buf)) + { + MessageBox(hwndDlg, TranslateT("New passwords not match"), TranslateT("Error"), MB_OK); + //key_id_global[0] = 0; + break; + } + GetDlgItemText(hwndDlg, IDC_OLD_PASSWD, buf, 255); + old_pass = toUTF8(buf); + bool old_pass_match = false; + TCHAR *pass = UniGetContactSettingUtf(NULL, szGPGModuleName, "szKeyPassword", _T("")); + if(!_tcscmp(pass,buf)) + old_pass_match = true; + mir_free(pass); + if(!old_pass_match) + { + if(key_id_global[0]) + { + string dbsetting = "szKey_"; + dbsetting += toUTF8(key_id_global); + dbsetting += "_Password"; + pass = UniGetContactSettingUtf(NULL, szGPGModuleName, dbsetting.c_str(), _T("")); + if(!_tcscmp(pass,buf)) + old_pass_match = true; + mir_free(pass); + } + } + if(!old_pass_match) + { + if(MessageBox(hwndDlg, TranslateT("Old password not match, you can continue, but gpg will reject wrong password.\nDo you want to continue?"), TranslateT("Error"), MB_YESNO) == IDNO) + { + //key_id_global[0] = 0; + break; + } + } + std::vector cmd; + TCHAR tmp2[MAX_PATH] = {0}; + string output; + DWORD exitcode; + cmd.push_back(L"--edit-key"); + cmd.push_back(key_id_global); + cmd.push_back(L"passwd"); + gpg_execution_params_pass params(cmd, old_pass, new_pass); + pxResult result; + params.useless = ""; + params.out = &output; + params.code = &exitcode; + params.result = &result; + boost::thread gpg_thread(boost::bind(&pxEexcute_passwd_change_thread, ¶ms)); + if(!gpg_thread.timed_join(boost::posix_time::seconds(100))) + { + gpg_thread.~thread(); + TerminateProcess(params.hProcess, 1); + params.hProcess = NULL; + if(bDebugLog) + debuglog<