// 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 //boost::mutex gpg_mutex; pxResult pxExecute(wstring *acommandline, char *ainput, string *aoutput, LPDWORD aexitcode, pxResult *result, HANDLE hProcess, PROCESS_INFORMATION *pr) { // gpg_mutex.lock(); if(!gpg_valid) return pxNotConfigured; extern logtofile debuglog; BOOL success; STARTUPINFO sinfo = {0}; SECURITY_ATTRIBUTES sattrs = {0}; SECURITY_DESCRIPTOR sdesc = {0}; PROCESS_INFORMATION pri = {0}; HANDLE newstdin, newstdout, readstdout, writestdin; char *inputpos; unsigned long transfered; int size; wstring commandline; sattrs.nLength=sizeof(SECURITY_ATTRIBUTES); sattrs.bInheritHandle=TRUE; InitializeSecurityDescriptor(&sdesc,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sdesc,TRUE,NULL,FALSE); sattrs.lpSecurityDescriptor=&sdesc; success=CreatePipe(&newstdin,&writestdin,&sattrs,0); if (!success) { *result = pxCreatePipeFailed; return pxCreatePipeFailed; } success=CreatePipe(&readstdout,&newstdout,&sattrs,0); if (!success) { CloseHandle(newstdin); CloseHandle(writestdin); *result = pxCreatePipeFailed; return pxCreatePipeFailed; } GetStartupInfo(&sinfo); sinfo.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; sinfo.wShowWindow=SW_HIDE; sinfo.hStdOutput=newstdout; sinfo.hStdError=newstdout; sinfo.hStdInput=newstdin; char *mir_path = new char [MAX_PATH]; CallService(MS_UTILS_PATHTOABSOLUTE, (WPARAM)"\\", (LPARAM)mir_path); SetCurrentDirectoryA(mir_path); delete [] mir_path; TCHAR *bin_path = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", _T("")); { if(_waccess(bin_path, 0) == -1) { if(errno == ENOENT) { mir_free(bin_path); if(bDebugLog) debuglog<cmd, params->useless, params->out, params->code, params->result, params->hProcess, params->proc); } pxResult pxExecute_passwd_change(std::vector &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< argv; std::vector 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 out(_sin); std::wstring cmd; for(int i = 0; i < argv.size(); i++) { cmd += argv[i]; cmd += L" "; } */ // out< 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<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<find("Repeat passphrase") != std::string::npos) break; boost::this_thread::sleep(boost::posix_time::milliseconds(50)); std::getline(_stdout, buf); } *aoutput += buf; */ //_stdin<find("Command") != std::string::npos) break; boost::this_thread::sleep(boost::posix_time::milliseconds(50)); std::getline(_stdout, buf); } *aoutput += buf; */ //_stdin<<"save"<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); }