summaryrefslogtreecommitdiff
path: root/plugins/New_GPG/src/gpg_wrapper.cpp
diff options
context:
space:
mode:
authorAlexander Gluzsky <sss123next@list.ru>2013-02-03 12:54:02 +0000
committerAlexander Gluzsky <sss123next@list.ru>2013-02-03 12:54:02 +0000
commit2637b7479c3e531f891346dbe84c73805a8b5e36 (patch)
treebdfe96ed34c5f08b856fa760c2cdc70ba6763352 /plugins/New_GPG/src/gpg_wrapper.cpp
parent32e17cfa965980f07e8321fb29d38d62a2e1ad27 (diff)
ability to change key password (because of fucked gpg which does not want to give us his stdin/stdout only via ugly windows console)
git-svn-id: http://svn.miranda-ng.org/main/trunk@3406 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/New_GPG/src/gpg_wrapper.cpp')
-rwxr-xr-xplugins/New_GPG/src/gpg_wrapper.cpp177
1 files changed, 177 insertions, 0 deletions
diff --git a/plugins/New_GPG/src/gpg_wrapper.cpp b/plugins/New_GPG/src/gpg_wrapper.cpp
index f253b2571e..adce958b50 100755
--- a/plugins/New_GPG/src/gpg_wrapper.cpp
+++ b/plugins/New_GPG/src/gpg_wrapper.cpp
@@ -173,3 +173,180 @@ void pxEexcute_thread(void *param)
gpg_execution_params *params = (gpg_execution_params*)param;
pxResult result = pxExecute(params->cmd, params->useless, params->out, params->code, params->result, params->hProcess, params->proc);
}
+
+
+
+pxResult pxExecute_passwd_change(std::vector<std::wstring> &aargv, char *ainput, string *aoutput, LPDWORD aexitcode, pxResult *result, HANDLE hProcess, PROCESS_INFORMATION *pr, string &old_pass, string &new_pass)
+{
+// gpg_mutex.lock();
+ if(!gpg_valid)
+ return pxNotConfigured;
+ extern logtofile debuglog;
+
+ TCHAR *bin_path = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", _T(""));
+ {
+ if(_waccess(bin_path, 0) == -1)
+ {
+ if(errno == ENOENT)
+ {
+ 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];
+ CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)"\\", (LPARAM)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 = execute(run_exe("c:\\windows\\system32\\cmd.exe"), bind_stdin(sin), inherit_env(), set_env(env), start_in_dir(toUTF16(mir_path)));
+
+ 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(c);
+
+/* 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];
+ CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)"\\", (LPARAM)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->useless, params->out, params->code, params->result, params->hProcess, params->proc, params->old_pass, params->new_pass);
+}