summaryrefslogtreecommitdiff
path: root/utilities.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utilities.cpp')
-rw-r--r--utilities.cpp168
1 files changed, 144 insertions, 24 deletions
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 <file_in_transfer*> 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<file_in_transfer*>::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, &params));
+ 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<std::wstring>(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, &params));
+ 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<list<file_in_transfer*>::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;