From f0bca208f1d668f0ad3d51afdafbb9d30ec8555b Mon Sep 17 00:00:00 2001 From: Gluzskiy Alexandr Date: Mon, 11 Oct 2010 23:37:54 +0300 Subject: encrypted filetransfers //two paralell threads of more than one file will fail, miranda api lack of documentation, and ghaza does not remember how to edentify thread ) --- utilities.cpp | 168 +++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 144 insertions(+), 24 deletions(-) (limited to 'utilities.cpp') diff --git a/utilities.cpp b/utilities.cpp index ebe38dc..0d51010 100644 --- a/utilities.cpp +++ b/utilities.cpp @@ -270,18 +270,21 @@ int OnPreBuildContactMenu(WPARAM w, LPARAM l) return 0; } +struct file_in_transfer +{ + wstring file; + CCSDATA *thread; +}; + +list transfers; + int onProtoAck(WPARAM w, LPARAM l) { - extern bool bFileTransfers; - bool isContactHaveKey(HANDLE); ACKDATA *ack=(ACKDATA*)l; + CCSDATA *ccs=(CCSDATA*)ack->lParam; if (ack->type!=ACKTYPE_FILE) return 0; - if(!isContactHaveKey(ack->hContact)) - return 0; PROTOFILETRANSFERSTATUS *f = (PROTOFILETRANSFERSTATUS*) ack->lParam; - if (f && (f->flags & PFTS_SENDING) && !bFileTransfers) - return 0; if(!f) f = (PROTOFILETRANSFERSTATUS*) ack->hProcess; @@ -289,29 +292,65 @@ int onProtoAck(WPARAM w, LPARAM l) { case ACKRESULT_DENIED: case ACKRESULT_FAILED: { - if(!f->tszWorkingDir) - return 0; - if(_tcsstr(f->tszCurrentFile, _T(".gpg"))) - ; - } - break; - case ACKRESULT_NEXTFILE: case ACKRESULT_FILERESUME: //works only on receiving (than it useless ...) - { - wstring str = _T("Next:\n"); - str.append(f->tszCurrentFile).append(_T("\n")); - MessageBox(0, str.c_str(), _T(""), MB_OK); + TCHAR *temp = _wgetenv(_T("TEMP")); + if(_tcsstr(f->tszCurrentFile, temp) && _tcsstr(f->tszCurrentFile, _T(".gpg"))) //ok, succesfuly sent, delete temporary file + DeleteFile(f->tszCurrentFile); + return 0; } break; case ACKRESULT_SUCCESS: { - if(!f->tszWorkingDir) + TCHAR *temp = _wgetenv(_T("TEMP")); + if(_tcsstr(f->tszCurrentFile, temp)) + { + if(!transfers.empty()) + { + for(list::iterator i = transfers.begin(); i != transfers.end(); i++) //bad solution +// if((*i)->thread == ccs) + DeleteFile((*i)->file.c_str()); + transfers.clear(); + } +// if(_tcsstr(f->tszCurrentFile, _T(".gpg"))) //ok, succesfuly sent, delete temporary file +// DeleteFile(f->tszCurrentFile); return 0; - if(_tcsstr(f->tszCurrentFile, _T(".gpg"))) + } + else if(_tcsstr(f->tszCurrentFile, _T(".gpg"))) //decrypt it { //process encrypted file - if(f->flags & PFTS_SENDING) - DeleteFile(f->tszCurrentFile); - if(f->flags & PFTS_RECEIVING) - ; + if(_waccess(f->tszCurrentFile, 0) == -1) + { + if(errno == ENOENT) + return 0; + } + string out; + DWORD code; + pxResult result; + wstring cmd = _T("-o "); + wstring file = f->tszCurrentFile; + wstring::size_type p1 = file.find(_T(".gpg")); + file.erase(p1, _tcslen(_T(".gpg"))); + file.insert(0, _T("\"")); + file.insert(file.length(), _T("\" ")); + cmd += file; + cmd += _T(" -d \""); + cmd += f->tszCurrentFile; + cmd += _T("\""); + gpg_execution_params params; + params.cmd = &cmd; + params.useless = ""; + params.out = &out; + params.code = &code; + params.result = &result; + boost::thread *gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread->timed_join(boost::posix_time::seconds(10))) + { + delete gpg_thread; + MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + } + if(result == pxNotFound) + { + MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK); + } + DeleteFile(f->tszCurrentFile); } } break; @@ -319,6 +358,85 @@ int onProtoAck(WPARAM w, LPARAM l) return 0; } + +//from secureim partially +int onSendFile(WPARAM w, LPARAM l) +{ + CCSDATA *ccs=(CCSDATA*)l; + if(isContactSecured(ccs->hContact)) + { + TCHAR **file=(TCHAR **)ccs->lParam; + int i; + for(i = 0; file[i]; i++) + { + if (_tcsstr(file[i],_T(".gpg"))) + continue; + TCHAR *name = _tcsrchr(file[i],_T('\\')); + if( !name ) + name = file[i]; + else + name++; + TCHAR *file_out = (TCHAR*) mir_alloc(_tcslen(name)+20); + mir_sntprintf(file_out, _tcslen(name)+7, _T("%s.gpg"), name); + string out; + DWORD code; + pxResult result; + char *keyid = UniGetContactSettingUtf(ccs->hContact, szGPGModuleName, "KeyID", ""); + wstring cmd = _T("-r "); + cmd += boost::lexical_cast(keyid); + mir_free(keyid); + cmd += _T(" -o \""); + TCHAR *temp = _wgetenv(_T("TEMP")); + cmd += temp; + cmd += _T("\\"); + cmd += file_out; + wstring path_out = temp; + path_out += _T("\\"); + path_out += file_out; + DeleteFile(path_out.c_str()); + cmd += _T("\" "); + mir_free(temp); + cmd += _T(" -e \""); + cmd += file[i]; + cmd += _T("\" "); + gpg_execution_params params; + params.cmd = &cmd; + params.useless = ""; + params.out = &out; + params.code = &code; + params.result = &result; + boost::thread *gpg_thread = new boost::thread(boost::bind(&pxEexcute_thread, ¶ms)); + if(!gpg_thread->timed_join(boost::posix_time::seconds(10))) + { + delete gpg_thread; + MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK); + } + if(result == pxNotFound) + { + MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK); + } + mir_free(file[i]); + file[i]=mir_wstrdup(path_out.c_str()); + mir_free(file_out); + file_in_transfer *file_transfer = new file_in_transfer; + file_transfer->file = path_out; + file_transfer->thread = ccs; + transfers.push_back(file_transfer); + } + } + + return CallService(PSS_FILE, w, l); +} + +void temp_cleaner_thread() +{ + while(true) + { + list::iterator> elements_to_del; + Sleep(10000); + } +} + void storeOutput(HANDLE ahandle, string *output) { BOOL success; @@ -503,9 +621,11 @@ static JABBER_HANDLER_FUNC SendHandler(IJabberInterface *ji, HXML node, void *pU mir_free(pass); mir_free(inkeyid); } - cmd += _T("--default-key "); + cmd += _T("--local-user "); path_c = UniGetContactSettingUtf(NULL, szGPGModuleName, "KeyID", _T("")); cmd += path_c; + cmd += _T(" --default-key "); + cmd += path_c; mir_free(path_c); cmd += _T(" --batch --yes -a -s \""); cmd += path_out; -- cgit v1.2.3