diff options
author | Vadim Dashevskiy <watcherhd@gmail.com> | 2013-05-17 21:10:14 +0000 |
---|---|---|
committer | Vadim Dashevskiy <watcherhd@gmail.com> | 2013-05-17 21:10:14 +0000 |
commit | 03e7b6d63bdfff3e4b5b7d0eb6899e5bf0108e4e (patch) | |
tree | 820abb884bfc0393316691094d78b3c06baec3b0 /plugins/New_GPG/src/gpg_wrapper.cpp | |
parent | 61b053584dec4563b308f98d210d7d0b84999983 (diff) |
- New_GPG: reinstated
git-svn-id: http://svn.miranda-ng.org/main/trunk@4716 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/New_GPG/src/gpg_wrapper.cpp')
-rw-r--r-- | plugins/New_GPG/src/gpg_wrapper.cpp | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/plugins/New_GPG/src/gpg_wrapper.cpp b/plugins/New_GPG/src/gpg_wrapper.cpp new file mode 100644 index 0000000000..112d86080f --- /dev/null +++ b/plugins/New_GPG/src/gpg_wrapper.cpp @@ -0,0 +1,340 @@ +// Copyright © 2010-2012 sss +// +// 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" +//thx gpg module from Harald Treder, Zakhar V. Bardymov + + +pxResult pxExecute(std::vector<std::wstring> &aargv, string *aoutput, LPDWORD aexitcode, pxResult *result, boost::process::child *_child) +{ + if(!gpg_valid) + return pxNotConfigured; + extern logtofile debuglog; + + + TCHAR *bin_path = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", _T("")); + { + if(!boost::filesystem::exists(bin_path)) + { + mir_free(bin_path); + if(bDebugLog) + debuglog<<std::string(time_str()+": GPG executable not found"); + *result = pxNotFound; + return pxNotFound; + } + } + + using namespace boost::process; + using namespace boost::process::initializers; + using namespace boost::iostreams; + + + std::vector<std::wstring> argv; + std::vector<std::wstring> env; + env.push_back(L"LANGUAGE=en@quot"); + env.push_back(L"LC_ALL=English"); + argv.push_back(bin_path); + argv.push_back(L"--homedir"); + TCHAR *home_dir = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T("")); + argv.push_back(home_dir); + mir_free(home_dir); + argv.push_back(L"--display-charset"); + argv.push_back(L"utf-8"); + argv.push_back(L"-z9"); + argv.insert(argv.end(), aargv.begin(), aargv.end()); + + if(bDebugLog) + { + std::wstring args; + for(int i = 0; i < argv.size(); ++i) + { + args += argv[i]; + args += L" "; + } + args.erase(args.size()-1, 1); + debuglog<<std::string(time_str()+": gpg in: "+toUTF8(args)); + } + + + pipe pout = create_pipe(); + pipe perr = create_pipe(); + child *c = nullptr; + { + file_descriptor_sink sout(pout.sink, close_handle); + file_descriptor_sink serr(perr.sink, close_handle); + + char *mir_path = new char [MAX_PATH]; + PathToAbsolute("\\", mir_path); + + c = new child(execute(set_args(argv), bind_stdout(sout), bind_stderr(serr), close_stdin(),/*bind_stdin(sin),*/ show_window(SW_HIDE), hide_console(), inherit_env(), set_env(env), start_in_dir(toUTF16(mir_path)))); + _child = c; + + delete [] mir_path; + } + + + file_descriptor_source source(pout.source, close_handle); + + stream<file_descriptor_source> is(source); + + try{ + std::string s; + while(std::getline(is, s)) + { + aoutput->append(s); + aoutput->append("\n"); + } + } + catch(const std::exception &e) + { + if(bDebugLog) + debuglog<<std::string(time_str()+": failed to read from stream with error: " + e.what() + "\n\tSuccesfully read : " + *aoutput); + } + + file_descriptor_source source2(perr.source, close_handle); + + stream<file_descriptor_source> is2(source2); + + try{ + std::string s; + while(std::getline(is2, s)) + { + aoutput->append(s); + aoutput->append("\n"); + } + } + catch(const std::exception &e) + { + if(bDebugLog) + debuglog<<std::string(time_str()+": failed to read from stream with error: " + e.what() + "\n\tSuccesfully read : " + *aoutput); + } + + fix_line_term(*aoutput); + + if(bDebugLog) + debuglog<<std::string(time_str()+": gpg out: "+*aoutput); + + auto ec = wait_for_exit(*c); + delete c; + *aexitcode = ec; + _child = nullptr; + + + if(*aexitcode) + { + if(bDebugLog) + debuglog<<std::string(time_str()+": warning: wrong gpg exit status, gpg output: "+*aoutput); + return pxSuccessExitCodeInvalid; + } + + + return pxSuccess; +} + +void pxEexcute_thread(gpg_execution_params ¶ms) +{ + pxExecute(params.aargv, params.out, params.code, params.result, params.child); +} + +bool gpg_launcher(gpg_execution_params ¶ms, boost::posix_time::time_duration t) +{ + bool ret = true; + boost::thread *gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, params)); + if(!gpg_thread->timed_join(t)) + { + ret = false; + delete gpg_thread; + if(params.child) + boost::process::terminate(*(params.child)); + if(bDebugLog) + debuglog<<std::string(time_str()+": GPG execution timed out, aborted"); + } + return ret; +} + + + +pxResult pxExecute_passwd_change(std::vector<std::wstring> &aargv, string *aoutput, LPDWORD aexitcode, pxResult *result, boost::process::child *_child, string &old_pass, string &new_pass) +{ + if(!gpg_valid) + return pxNotConfigured; + extern logtofile debuglog; + + TCHAR *bin_path = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", _T("")); + { + if(!boost::filesystem::exists(bin_path)) + { + mir_free(bin_path); + if(bDebugLog) + debuglog<<std::string(time_str()+": GPG executable not found"); + *result = pxNotFound; + return pxNotFound; + } + } + + using namespace boost::process; + using namespace boost::process::initializers; + using namespace boost::iostreams; + + + std::vector<std::wstring> argv; + std::vector<std::wstring> env; + env.push_back(L"LANGUAGE=en@quot"); + env.push_back(L"LC_ALL=English"); + argv.push_back(bin_path); + argv.push_back(L"--homedir"); + TCHAR *home_dir = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T("")); + argv.push_back(home_dir); + mir_free(home_dir); + argv.push_back(L"--display-charset"); + argv.push_back(L"utf-8"); + argv.push_back(L"-z9"); + argv.insert(argv.end(), aargv.begin(), aargv.end()); + +// pipe pout = create_pipe(); +// pipe pin = create_pipe(); +// file_descriptor_sink sout(pout.sink, close_handle); +// file_descriptor_source sin(pin.source, close_handle); + + char *mir_path = new char [MAX_PATH]; + PathToAbsolute("\\", mir_path); + + //execute(set_args(argv), bind_stdout(sout), bind_stdin(sin), show_window(SW_HIDE), hide_console(), inherit_env(), set_env(env), start_in_dir(toUTF16(mir_path))); + child c = execute(set_args(argv), /*bind_stdin(sin), */inherit_env(), set_env(env), start_in_dir(toUTF16(mir_path))); + _child = &c; + + delete [] mir_path; + +// file_descriptor_source source(pout.source, close_handle); +/* file_descriptor_sink _sin(pin.sink, close_handle); + + stream<file_descriptor_sink> out(_sin); + + + std::wstring cmd; + for(int i = 0; i < argv.size(); i++) + { + cmd += argv[i]; + cmd += L" "; + } + */ +// out<<toUTF8(cmd)<<std::endl; + + //fucked gpg does not want to give us stdin/stdout + wait_for_exit(*_child); + _child = nullptr; + +/* out<<old_pass<<std::endl; + out<<new_pass<<std::endl; + out<<new_pass<<std::endl; + out<<"save"<<std::endl; */ + +// stream<file_descriptor_source> is(source); +/* std::string s; + + is>>s; + + MessageBoxA(NULL, s.c_str(), "", MB_OK); */ + + +/* ctx.environment = boost::process::self::get_environment(); + ctx.environment.insert(boost::process::environment::value_type("LANGUAGE", "en@quot")); + ctx.environment["LC_ALL"] = "English"; + + char *mir_path = new char [MAX_PATH]; + PathToAbsolute("\\", mir_path); + ctx.work_directory = mir_path; + delete [] mir_path; + + boost::process::win32_child proc = boost::process::win32_launch(toUTF8(bin_path), argv, ctx); + + mir_free(bin_path); + +// boost::process::pistream &_stdout = proc.get_stdout(); + boost::process::postream &_stdin = proc.get_stdin(); + + boost::this_thread::sleep(boost::posix_time::milliseconds(50)); + + std::string buf; */ + + +/* std::getline(_stdout, buf); + while(_stdout.good()) + { + *aoutput += buf; + if(aoutput->find("Enter passphrase") != std::string::npos) + break; + boost::this_thread::sleep(boost::posix_time::milliseconds(50)); + std::getline(_stdout, buf); + } + *aoutput += buf; */ + + //_stdin<<old_pass<<std::endl; + +/* std::getline(_stdout, buf); + while(_stdout.good()) + { + *aoutput += buf; + if(aoutput->find("Enter the new passphrase for this secret key.") != std::string::npos) + break; + boost::this_thread::sleep(boost::posix_time::milliseconds(50)); + std::getline(_stdout, buf); + } + + *aoutput += buf; + + if(aoutput->find("Enter passphrase") != std::string::npos)*/ + //_stdin<<new_pass<<std::endl; + +/* std::getline(_stdout, buf); + while(_stdout.good()) + { + *aoutput += buf; + if(aoutput->find("Repeat passphrase") != std::string::npos) + break; + boost::this_thread::sleep(boost::posix_time::milliseconds(50)); + std::getline(_stdout, buf); + } + *aoutput += buf; */ + + //_stdin<<new_pass<<std::endl; + +/* std::getline(_stdout, buf); + while(_stdout.good()) + { + *aoutput += buf; + if(aoutput->find("Command") != std::string::npos) + break; + boost::this_thread::sleep(boost::posix_time::milliseconds(50)); + std::getline(_stdout, buf); + } + *aoutput += buf; */ + + //_stdin<<"save"<<std::endl; + + //proc.wait(); + + //MessageBoxA(NULL, aoutput->c_str(), "info", MB_OK); + + return pxSuccess; +} + + +void pxEexcute_passwd_change_thread(void *param) +{ + gpg_execution_params_pass *params = (gpg_execution_params_pass*)param; + pxResult result = pxExecute_passwd_change(params->args, params->out, params->code, params->result, params->child, params->old_pass, params->new_pass); +} |