summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--messages.cpp1103
-rw-r--r--metacontacts.h22
-rw-r--r--options.cpp186
3 files changed, 669 insertions, 642 deletions
diff --git a/messages.cpp b/messages.cpp
index 54c7ca9..788c5bc 100644
--- a/messages.cpp
+++ b/messages.cpp
@@ -1,554 +1,555 @@
-// Copyright © 2010 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"
-
-
-wstring new_key;
-HANDLE new_key_hcnt = NULL;
-
-BOOL isProtoMetaContacts(HANDLE hContact);
-
-int RecvMsgSvc(WPARAM w, LPARAM l)
-{
- CCSDATA *ccs = (CCSDATA*)l;
- if (!ccs)
- return CallService(MS_PROTO_CHAINRECV, w, l);
- PROTORECVEVENT *pre = (PROTORECVEVENT*)(ccs->lParam);
- if (!pre)
- return CallService(MS_PROTO_CHAINRECV, w, l);
- char *msg = pre->szMessage;
- if (!msg)
- return CallService(MS_PROTO_CHAINRECV, w, l);
- BOOL unicode = (BOOL)(pre->flags&PREF_UNICODE);
- HANDLE hContact = ccs->hContact;
- if(isProtoMetaContacts(hContact))
- hContact = metaGetMostOnline(hContact);
-
-
- { //check for gpg related data
- wchar_t *tmp = mir_utf8decodeW(msg);
- wstring str = tmp;
- mir_free(tmp);
- wstring::size_type s1 = wstring::npos, s2 = wstring::npos;
-
- if((str.find(_T("-----END PGP PUBLIC KEY BLOCK-----")) != wstring::npos) && (str.find(_T("-----BEGIN PGP PUBLIC KEY BLOCK-----")) != wstring::npos))
- {
- s2 = str.find(_T("-----END PGP PUBLIC KEY BLOCK-----"));
- s1 = str.find(_T("-----BEGIN PGP PUBLIC KEY BLOCK-----"));
- }
- else if((str.find(_T("-----BEGIN PGP PRIVATE KEY BLOCK-----")) != wstring::npos) && (str.find(_T("-----END PGP PRIVATE KEY BLOCK-----")) != wstring::npos))
- {
- s2 = str.find(_T("-----END PGP PRIVATE KEY BLOCK-----"));
- s1 = str.find(_T("-----BEGIN PGP PRIVATE KEY BLOCK-----"));
- }
- if((s2 != wstring::npos) && (s1 != wstring::npos))
- { //this is public key
-/* if(!DBGetContactSettingByte(ccs->hContact, szGPGModuleName, "GPGEncryption", 0))
- ; */
- void ShowNewKeyDialog();
- s1 = 0;
- while((s1 = str.find(_T("\r"), s1)) != wstring::npos)
- {
- str.erase(s1, 1);
- }
- if((str.find(_T("-----END PGP PUBLIC KEY BLOCK-----")) != wstring::npos) && (str.find(_T("-----BEGIN PGP PUBLIC KEY BLOCK-----")) != wstring::npos))
- {
- s2 = str.find(_T("-----END PGP PUBLIC KEY BLOCK-----"));
- s1 = str.find(_T("-----BEGIN PGP PUBLIC KEY BLOCK-----"));
- s2 += _tcslen(_T("-----END PGP PUBLIC KEY BLOCK-----"));
- }
- else if((str.find(_T("-----BEGIN PGP PRIVATE KEY BLOCK-----")) != wstring::npos) && (str.find(_T("-----END PGP PRIVATE KEY BLOCK-----")) != wstring::npos))
- {
- s2 = str.find(_T("-----END PGP PRIVATE KEY BLOCK-----"));
- s1 = str.find(_T("-----BEGIN PGP PRIVATE KEY BLOCK-----"));
- s2 += _tcslen(_T("-----END PGP PRIVATE KEY BLOCK-----"));
- }
- new_key.append(str.substr(s1,s2-s1));
- new_key_hcnt = hContact;
- ShowNewKeyDialog();
- return CallService(MS_PROTO_CHAINRECV, w, l);
- }
- s1 = str.find(_T("-----BEGIN PGP MESSAGE-----"));
- s2 = str.find(_T("-----END PGP MESSAGE-----"));
- if((s2 != wstring::npos) && (s1 != wstring::npos))
- { //this is generic encrypted data block
- void setSrmmIcon(HANDLE);
- void setClistIcon(HANDLE);
- bool isContactHaveKey(HANDLE hContact);
- if(!DBGetContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 0))
- {
- if(MessageBox(0, _T("We received encrypted message from contact with encryption turned off.\nDo you want turn on encryption for this contact ?"), _T("Warning"), MB_YESNO) == IDYES)
- {
- if(!isContactHaveKey(hContact))
- {
- void ShowLoadPublicKeyDialog();
- extern map<int, HANDLE> user_data;
- extern int item_num;
- item_num = 0; //black magic here
- user_data[1] = hContact;
- ShowLoadPublicKeyDialog();
- }
- else
- {
- DBWriteContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 1);
- setSrmmIcon(hContact);
- setClistIcon(hContact);
- }
- if(isContactHaveKey(hContact))
- {
- DBWriteContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 1);
- setSrmmIcon(hContact);
- setClistIcon(hContact);
- }
- }
- else if(MessageBox(0, _T("Do you want try to decrypt encrypted message ?"), _T("Warning"), MB_YESNO) == IDNO)
- return CallService(MS_PROTO_CHAINRECV, w, l);
- }
- {
- wstring::size_type p = 0;
- while((p = str.find(_T("\r"), p)) != wstring::npos)
- str.erase(p, 1);
- }
- s2 += _tcslen(_T("-----END PGP MESSAGE-----"));
- char *tmp = mir_t2a(str.substr(s1,s2-s1).c_str());
- TCHAR *tmp2 = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T(""));
- wstring path = tmp2;
- path.append(_T("\\encrypted_data.asc"));
- wfstream f(path.c_str(), std::ios::out);
- f<<tmp;
- mir_free(tmp);
- f.close();
- {
- extern TCHAR *password;
- string out;
- DWORD code;
- wstring cmd;
- cmd += _T("--batch ");
- {
- TCHAR *tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szKeyPassword", _T(""));
- if(_tcslen(tmp) > 0)
- {
- cmd += _T("--passphrase \"");
- cmd += tmp;
- cmd += _T("\" ");
- }
- else if(password)
- {
- cmd += _T("--passphrase \"");
- cmd += password;
- cmd += _T("\" ");
- }
- mir_free(tmp);
- }
- cmd += _T("--output \"");
- cmd += tmp2;
- cmd += _T("\\decrypted_data\"");
- cmd += _T(" -d -a \"");
- cmd += path;
- cmd += _T("\"");
- gpg_execution_params params;
- pxResult result;
- params.cmd = &cmd;
- params.useless = "";
- params.out = &out;
- params.code = &code;
- params.result = &result;
- HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
- if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
- {
- TerminateThread(gpg_thread, 0);
- 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(path.c_str());
- return CallService(MS_PROTO_CHAINRECV, w, l);
- }
- while(out.find("public key decryption failed: bad passphrase") != string::npos)
- {
- void ShowLoadKeyPasswordWindow();
- ShowLoadKeyPasswordWindow();
- wstring cmd2 = cmd;
- if(password)
- {
- wstring tmp = _T("--passphrase \"");
- tmp += password;
- tmp += _T("\" ");
- cmd2.insert(0, tmp);
- }
- out.clear();
- gpg_execution_params params;
- pxResult result;
- params.cmd = &cmd2;
- params.useless = "";
- params.out = &out;
- params.code = &code;
- params.result = &result;
- HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
- if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
- {
- TerminateThread(gpg_thread, 0);
- 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(path.c_str());
- return CallService(MS_PROTO_CHAINRECV, w, l);
- }
- }
- out.clear();
- gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
- if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
- {
- TerminateThread(gpg_thread, 0);
- 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(path.c_str());
- return CallService(MS_PROTO_CHAINRECV, w, l);
- }
- {
- wstring tmp = tmp2;
- tmp += _T("\\encrypted_data.asc");
- DeleteFile(tmp.c_str());
- }
- {
- wstring tmp = tmp2;
- tmp += _T("\\decrypted_data");
- if(_waccess(tmp.c_str(), 0) == -1)
- {
- if(errno == ENOENT)
- {
- string str = pre->szMessage;
- mir_free((void**)pre->szMessage);
- str.insert(0, "Failed to decrypt GPG encrypted message:\n");
- char *tmp = new char [str.length()+1];
- strcpy(tmp, str.c_str());
- pre->szMessage = tmp;
- return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
- }
- }
- }
-
-
- str.clear();
- {
- wstring path = tmp2;
- mir_free(tmp2);
- path += _T("\\decrypted_data");
- fstream f(path.c_str(), std::ios::in);
- while(!f.eof() && f.is_open())
- {
- char tmp[256];
- f.getline(tmp, 256);
- TCHAR *tmp2;
-// if(unicode)
- tmp2 = mir_utf8decodeW(tmp);
-// else
-// tmp2 = mir_a2t(tmp);
- str.append(tmp2).append(_T("\n"));
- mir_free(tmp2);
- }
- f.close();
- DeleteFile(path.c_str());
- str.erase(str.find_last_of(_T("\n")), 1);
- if(!str.length())
- {
- mir_free((void**)pre->szMessage);
- pre->szMessage = "Failed to decrypt GPG encrypted message";
- return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
- }
- else
- {
- mir_free((void**)pre->szMessage);
- if(bAppendTags)
- {
- str.insert(0, inopentag);
- str.append(inclosetag);
- }
- char *utf = mir_utf8encodeW(str.c_str());
- pre->szMessage = utf;
- return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
- }
- }
- }
- }
- }
- if(DBGetContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 0))
- {
- wchar_t *tmp = mir_utf8decodeW(msg);
- wstring str = tmp;
- mir_free(tmp);
- mir_free((void**)pre->szMessage);
- str.insert(0, _T("Received unencrypted message:\n"));
- char *utf = mir_utf8encodeW(str.c_str());
- pre->szMessage = utf;
- return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
- }
- return CallService(MS_PROTO_CHAINRECV, w, l);
-}
-
-int SendMsgSvc(WPARAM w, LPARAM l)
-{
- CCSDATA *ccs = (CCSDATA*)l;
- if (!ccs)
- return CallService(MS_PROTO_CHAINSEND, w, l);
- if(!DBGetContactSettingByte(ccs->hContact, szGPGModuleName, "GPGEncryption", 0))
- return CallService(MS_PROTO_CHAINSEND, w, l);
-
- char *msg = (char*)(ccs->lParam);
- if (!msg)
- return CallService(MS_PROTO_CHAINSEND, w, l);
- BOOL unicode = (BOOL)(ccs->wParam&PREF_UNICODE);
- HANDLE hContact = ccs->hContact;
- if(isProtoMetaContacts(hContact))
- hContact = metaGetMostOnline(hContact);
-
- { //encrypt data here
- wchar_t *tmp = mir_utf8decodeW(msg);
- wstring str = tmp;
- mir_free(tmp);
- { //not xmpp, just replace whole message
- string out;
- DWORD code;
- wstring cmd;
- wstring path;
- extern bool bJabberAPI, bIsMiranda09;
- char *tmp = UniGetContactSettingUtf(hContact, szGPGModuleName, "KeyID", "");
- if(strlen(tmp) < 2)
- {
- mir_free(tmp);
- HistoryLog(hContact, "Failed to encrypt message with GPG", EVENTTYPE_MESSAGE, DBEF_SENT);
- return CallService(MS_PROTO_CHAINSEND, w, l);
- }
- if(!bJabberAPI || !bIsMiranda09)
- cmd += _T("--comment \"\" --no-version ");
- if(DBGetContactSettingByte(hContact, szGPGModuleName, "bAlwaysTrust", 0))
- cmd += _T("--trust-model always ");
- cmd += _T("--batch --yes -e -a -r ");
- TCHAR *tmp2 = mir_a2t(tmp);
- mir_free(tmp);
- cmd += tmp2;
- mir_free(tmp2);
- cmd += _T(" \"");
- tmp2 = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T(""));
- path.append(tmp2);
- cmd += tmp2;
- mir_free(tmp2);
- cmd += _T("\\exported_data");
- path.append(_T("\\exported_data"));
- cmd += _T("\"");
- {
- char *tmp;
-// if(unicode)
- tmp = mir_utf8encodeW(str.c_str());
-// else
-// tmp = mir_t2a(str.c_str());
- wfstream f(path.c_str(), std::ios::out);
- f<<tmp;
- mir_free(tmp);
- f.close();
- }
- gpg_execution_params params;
- pxResult result;
- params.cmd = &cmd;
- params.useless = "";
- params.out = &out;
- params.code = &code;
- params.result = &result;
- HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
- if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
- {
- TerminateThread(gpg_thread, 0);
- 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);
- return CallService(MS_PROTO_CHAINSEND, w, l);
- }
- if(out.find("There is no assurance this key belongs to the named user") != string::npos)
- {
- out.clear();
- if(MessageBox(0, _T("We trying to encrypt with untrusted key, do you want to trust this key permanently ?"), _T("Warning"), MB_YESNO) == IDYES)
- {
- DBWriteContactSettingByte(hContact, szGPGModuleName, "bAlwaysTrust", 1);
- cmd.insert(0, _T("--trust-model always "));
- gpg_execution_params params;
- pxResult result;
- params.cmd = &cmd;
- params.useless = "";
- params.out = &out;
- params.code = &code;
- params.result = &result;
- HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
- if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
- {
- TerminateThread(gpg_thread, 0);
- 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);
- return CallService(MS_PROTO_CHAINSEND, w, l);
- }
- }
- else
- return 0;
- }
- DeleteFile(path.c_str());
- path.append(_T(".asc"));
- wfstream f(path.c_str(), std::ios::in);
- str.clear();
- while(!f.eof() && f.is_open())
- {
- TCHAR tmp[128];
- f.getline(tmp, 128);
- str.append(tmp);
- if(bJabberAPI && bIsMiranda09)
- str.append(_T("\n"));
- else
- str.append(_T("\r\n"));
- }
- f.close();
- DeleteFile(path.c_str());
- if(!str.length())
- {
- HistoryLog(hContact, "Failed to encrypt message with GPG", EVENTTYPE_MESSAGE, DBEF_SENT);
- return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
- }
- mir_free((void**)ccs->lParam);
- char *utf = mir_u2a(str.c_str());
- ccs->lParam = (LPARAM)utf;
- if(bAppendTags)
- DBWriteContactSettingByte(hContact, szGPGModuleName, "MsgsForTagging", DBGetContactSettingByte(ccs->hContact, szGPGModuleName, "MsgsForTagging", 0) + 1);
- }
- }
- ccs->wParam&=~PREF_UNICODE;
- return CallService(MS_PROTO_CHAINSEND, w, l);
-}
-
-int HookSendMsg(WPARAM w, LPARAM l)
-{
- HANDLE hContact = (HANDLE)w;
- if(isProtoMetaContacts(hContact))
- hContact = metaGetMostOnline(hContact);
- if(!DBGetContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 0))
- return 0;
-
- if(bAppendTags)
- {
- if(!l)
- return 0;
- BYTE Msgs = DBGetContactSettingByte(hContact, szGPGModuleName, "MsgsForTagging", 0);
- if(!Msgs)
- return 0;
- DBEVENTINFO * dbei = (DBEVENTINFO*)l;
- if((dbei->eventType == EVENTTYPE_MESSAGE) && (dbei->flags & DBEF_SENT))
- {
- char *msg = (char*)dbei->pBlob;
- TCHAR *tmp = mir_utf8decodeW(msg);
- wstring str = tmp;
- mir_free(tmp);
- str.insert(0, outopentag);
- str.append(outclosetag);
- char *msg2 = mir_utf8encodeW(str.c_str());
- mir_free(dbei->pBlob);
- dbei->pBlob = (PBYTE)msg2;
- dbei->cbBlob = strlen(msg2)+1;
- DBWriteContactSettingByte(hContact, szGPGModuleName, "MsgsForTagging", Msgs - 1);
- }
- }
- return 0;
-}
-
-int TestHook(WPARAM w, LPARAM l)
-{
- return 0;
-}
-
-
-static BOOL CALLBACK DlgProcKeyPassword(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- TCHAR *tmp = NULL;
- switch (msg)
- {
- case WM_INITDIALOG:
- {
- TranslateDialogDefault(hwndDlg);
- return TRUE;
- }
-
-
- case WM_COMMAND:
- {
- switch (LOWORD(wParam))
- {
- case IDOK:
- {
- TCHAR tmp[64];
- GetDlgItemText(hwndDlg, IDC_KEY_PASSWORD, tmp, 64);
- if(_tcslen(tmp) > 0)
- {
- extern TCHAR *password;
- if(IsDlgButtonChecked(hwndDlg, IDC_SAVE_PASSWORD))
- DBWriteContactSettingTString(NULL, szGPGModuleName, "szKeyPassword", tmp);
- if(password)
- delete [] password;
- password = new TCHAR [_tcslen(tmp)+1];
- _tcscpy(password, tmp);
- }
- mir_free(tmp);
- DestroyWindow(hwndDlg);
- break;
- }
- case IDCANCEL:
- DestroyWindow(hwndDlg);
- break;
- default:
- break;
- }
-
- break;
- }
-
- case WM_NOTIFY:
- {
- switch (((LPNMHDR)lParam)->code)
- {
- default:
- break;
- }
- }
- break;
- case WM_CLOSE:
- DestroyWindow(hwndDlg);
- break;
- case WM_DESTROY:
- break;
-
- }
- return FALSE;
-}
-
+// Copyright © 2010 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"
+
+
+wstring new_key;
+HANDLE new_key_hcnt = NULL;
+
+BOOL isProtoMetaContacts(HANDLE hContact);
+
+int RecvMsgSvc(WPARAM w, LPARAM l)
+{
+ CCSDATA *ccs = (CCSDATA*)l;
+ if (!ccs)
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+ PROTORECVEVENT *pre = (PROTORECVEVENT*)(ccs->lParam);
+ if (!pre)
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+ char *msg = pre->szMessage;
+ if (!msg)
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+ BOOL unicode = (BOOL)(pre->flags&PREF_UNICODE);
+ HANDLE hContact = ccs->hContact;
+ if(isProtoMetaContacts(hContact))
+ hContact = metaGetMostOnline(hContact);
+
+
+ { //check for gpg related data
+ wchar_t *tmp = mir_utf8decodeW(msg);
+ wstring str = tmp;
+ mir_free(tmp);
+ wstring::size_type s1 = wstring::npos, s2 = wstring::npos;
+
+ if((str.find(_T("-----END PGP PUBLIC KEY BLOCK-----")) != wstring::npos) && (str.find(_T("-----BEGIN PGP PUBLIC KEY BLOCK-----")) != wstring::npos))
+ {
+ s2 = str.find(_T("-----END PGP PUBLIC KEY BLOCK-----"));
+ s1 = str.find(_T("-----BEGIN PGP PUBLIC KEY BLOCK-----"));
+ }
+ else if((str.find(_T("-----BEGIN PGP PRIVATE KEY BLOCK-----")) != wstring::npos) && (str.find(_T("-----END PGP PRIVATE KEY BLOCK-----")) != wstring::npos))
+ {
+ s2 = str.find(_T("-----END PGP PRIVATE KEY BLOCK-----"));
+ s1 = str.find(_T("-----BEGIN PGP PRIVATE KEY BLOCK-----"));
+ }
+ if((s2 != wstring::npos) && (s1 != wstring::npos))
+ { //this is public key
+/* if(!DBGetContactSettingByte(ccs->hContact, szGPGModuleName, "GPGEncryption", 0))
+ ; */
+ void ShowNewKeyDialog();
+ s1 = 0;
+ while((s1 = str.find(_T("\r"), s1)) != wstring::npos)
+ {
+ str.erase(s1, 1);
+ }
+ if((str.find(_T("-----END PGP PUBLIC KEY BLOCK-----")) != wstring::npos) && (str.find(_T("-----BEGIN PGP PUBLIC KEY BLOCK-----")) != wstring::npos))
+ {
+ s2 = str.find(_T("-----END PGP PUBLIC KEY BLOCK-----"));
+ s1 = str.find(_T("-----BEGIN PGP PUBLIC KEY BLOCK-----"));
+ s2 += _tcslen(_T("-----END PGP PUBLIC KEY BLOCK-----"));
+ }
+ else if((str.find(_T("-----BEGIN PGP PRIVATE KEY BLOCK-----")) != wstring::npos) && (str.find(_T("-----END PGP PRIVATE KEY BLOCK-----")) != wstring::npos))
+ {
+ s2 = str.find(_T("-----END PGP PRIVATE KEY BLOCK-----"));
+ s1 = str.find(_T("-----BEGIN PGP PRIVATE KEY BLOCK-----"));
+ s2 += _tcslen(_T("-----END PGP PRIVATE KEY BLOCK-----"));
+ }
+ new_key.append(str.substr(s1,s2-s1));
+ new_key_hcnt = hContact;
+ ShowNewKeyDialog();
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+ }
+ s1 = str.find(_T("-----BEGIN PGP MESSAGE-----"));
+ s2 = str.find(_T("-----END PGP MESSAGE-----"));
+ if((s2 != wstring::npos) && (s1 != wstring::npos))
+ { //this is generic encrypted data block
+ void setSrmmIcon(HANDLE);
+ void setClistIcon(HANDLE);
+ bool isContactHaveKey(HANDLE hContact);
+ if(!DBGetContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 0))
+ {
+ if(MessageBox(0, _T("We received encrypted message from contact with encryption turned off.\nDo you want turn on encryption for this contact ?"), _T("Warning"), MB_YESNO) == IDYES)
+ {
+ if(!isContactHaveKey(hContact))
+ {
+ void ShowLoadPublicKeyDialog();
+ extern map<int, HANDLE> user_data;
+ extern int item_num;
+ item_num = 0; //black magic here
+ user_data[1] = hContact;
+ ShowLoadPublicKeyDialog();
+ }
+ else
+ {
+ DBWriteContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 1);
+ setSrmmIcon(hContact);
+ setClistIcon(hContact);
+ }
+ if(isContactHaveKey(hContact))
+ {
+ DBWriteContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 1);
+ setSrmmIcon(hContact);
+ setClistIcon(hContact);
+ }
+ }
+ else if(MessageBox(0, _T("Do you want try to decrypt encrypted message ?"), _T("Warning"), MB_YESNO) == IDNO)
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+ }
+ {
+ wstring::size_type p = 0;
+ while((p = str.find(_T("\r"), p)) != wstring::npos)
+ str.erase(p, 1);
+ }
+ s2 += _tcslen(_T("-----END PGP MESSAGE-----"));
+ char *tmp = mir_t2a(str.substr(s1,s2-s1).c_str());
+ TCHAR *tmp2 = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T(""));
+ wstring path = tmp2;
+ path.append(_T("\\encrypted_data.asc"));
+ wfstream f(path.c_str(), std::ios::out);
+ f<<tmp;
+ mir_free(tmp);
+ f.close();
+ {
+ extern TCHAR *password;
+ string out;
+ DWORD code;
+ wstring cmd;
+ cmd += _T("--batch ");
+ {
+ TCHAR *tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szKeyPassword", _T(""));
+ if(_tcslen(tmp) > 0)
+ {
+ cmd += _T("--passphrase \"");
+ cmd += tmp;
+ cmd += _T("\" ");
+ }
+ else if(password)
+ {
+ cmd += _T("--passphrase \"");
+ cmd += password;
+ cmd += _T("\" ");
+ }
+ mir_free(tmp);
+ }
+ cmd += _T("--output \"");
+ cmd += tmp2;
+ cmd += _T("\\decrypted_data\"");
+ cmd += _T(" -d -a \"");
+ cmd += path;
+ cmd += _T("\"");
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd;
+ params.useless = "";
+ params.out = &out;
+ params.code = &code;
+ params.result = &result;
+ HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
+ if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
+ {
+ TerminateThread(gpg_thread, 0);
+ 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(path.c_str());
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+ }
+ while(out.find("public key decryption failed: bad passphrase") != string::npos)
+ {
+ void ShowLoadKeyPasswordWindow();
+ ShowLoadKeyPasswordWindow();
+ wstring cmd2 = cmd;
+ if(password)
+ {
+ wstring tmp = _T("--passphrase \"");
+ tmp += password;
+ tmp += _T("\" ");
+ cmd2.insert(0, tmp);
+ }
+ out.clear();
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd2;
+ params.useless = "";
+ params.out = &out;
+ params.code = &code;
+ params.result = &result;
+ HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
+ if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
+ {
+ TerminateThread(gpg_thread, 0);
+ 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(path.c_str());
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+ }
+ }
+ out.clear();
+ gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
+ if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
+ {
+ TerminateThread(gpg_thread, 0);
+ 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(path.c_str());
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+ }
+ {
+ wstring tmp = tmp2;
+ tmp += _T("\\encrypted_data.asc");
+ DeleteFile(tmp.c_str());
+ }
+ {
+ wstring tmp = tmp2;
+ tmp += _T("\\decrypted_data");
+ if(_waccess(tmp.c_str(), 0) == -1)
+ {
+ if(errno == ENOENT)
+ {
+ string str = pre->szMessage;
+ mir_free((void**)pre->szMessage);
+ str.insert(0, "Failed to decrypt GPG encrypted message:\n");
+ char *tmp = new char [str.length()+1];
+ strcpy(tmp, str.c_str());
+ pre->szMessage = tmp;
+ return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
+ }
+ }
+ }
+
+
+ str.clear();
+ {
+ wstring path = tmp2;
+ mir_free(tmp2);
+ path += _T("\\decrypted_data");
+ fstream f(path.c_str(), std::ios::in);
+ while(!f.eof() && f.is_open())
+ {
+ char tmp[256];
+ f.getline(tmp, 256);
+ TCHAR *tmp2;
+// if(unicode)
+ tmp2 = mir_utf8decodeW(tmp);
+// else
+// tmp2 = mir_a2t(tmp);
+ str.append(tmp2).append(_T("\n"));
+ mir_free(tmp2);
+ }
+ f.close();
+ DeleteFile(path.c_str());
+ str.erase(str.find_last_of(_T("\n")), 1);
+ if(!str.length())
+ {
+ mir_free((void**)pre->szMessage);
+ pre->szMessage = "Failed to decrypt GPG encrypted message";
+ return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
+ }
+ else
+ {
+ mir_free((void**)pre->szMessage);
+ if(bAppendTags)
+ {
+ str.insert(0, inopentag);
+ str.append(inclosetag);
+ }
+ char *utf = mir_utf8encodeW(str.c_str());
+ pre->szMessage = utf;
+ return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
+ }
+ }
+ }
+ }
+ }
+ if(DBGetContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 0))
+ {
+ wchar_t *tmp = mir_utf8decodeW(msg);
+ wstring str = tmp;
+ mir_free(tmp);
+ mir_free((void**)pre->szMessage);
+ str.insert(0, _T("Received unencrypted message:\n"));
+ char *utf = mir_utf8encodeW(str.c_str());
+ pre->szMessage = utf;
+ return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
+ }
+ return CallService(MS_PROTO_CHAINRECV, w, l);
+}
+
+int SendMsgSvc(WPARAM w, LPARAM l)
+{
+ CCSDATA *ccs = (CCSDATA*)l;
+ if (!ccs)
+ return CallService(MS_PROTO_CHAINSEND, w, l);
+
+ char *msg = (char*)(ccs->lParam);
+ if (!msg)
+ return CallService(MS_PROTO_CHAINSEND, w, l);
+ BOOL unicode = (BOOL)(ccs->wParam&PREF_UNICODE);
+ HANDLE hContact = ccs->hContact;
+ if(isProtoMetaContacts(hContact))
+ hContact = metaGetMostOnline(hContact);
+ if(!DBGetContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 0))
+ return CallService(MS_PROTO_CHAINSEND, w, l);
+
+
+ { //encrypt data here
+ wchar_t *tmp = mir_utf8decodeW(msg);
+ wstring str = tmp;
+ mir_free(tmp);
+ { //not xmpp, just replace whole message
+ string out;
+ DWORD code;
+ wstring cmd;
+ wstring path;
+ extern bool bJabberAPI, bIsMiranda09;
+ char *tmp = UniGetContactSettingUtf(hContact, szGPGModuleName, "KeyID", "");
+ if(strlen(tmp) < 2)
+ {
+ mir_free(tmp);
+ HistoryLog(hContact, "Failed to encrypt message with GPG", EVENTTYPE_MESSAGE, DBEF_SENT);
+ return CallService(MS_PROTO_CHAINSEND, w, l);
+ }
+ if(!bJabberAPI || !bIsMiranda09)
+ cmd += _T("--comment \"\" --no-version ");
+ if(DBGetContactSettingByte(hContact, szGPGModuleName, "bAlwaysTrust", 0))
+ cmd += _T("--trust-model always ");
+ cmd += _T("--batch --yes -e -a -r ");
+ TCHAR *tmp2 = mir_a2t(tmp);
+ mir_free(tmp);
+ cmd += tmp2;
+ mir_free(tmp2);
+ cmd += _T(" \"");
+ tmp2 = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T(""));
+ path.append(tmp2);
+ cmd += tmp2;
+ mir_free(tmp2);
+ cmd += _T("\\exported_data");
+ path.append(_T("\\exported_data"));
+ cmd += _T("\"");
+ {
+ char *tmp;
+// if(unicode)
+ tmp = mir_utf8encodeW(str.c_str());
+// else
+// tmp = mir_t2a(str.c_str());
+ wfstream f(path.c_str(), std::ios::out);
+ f<<tmp;
+ mir_free(tmp);
+ f.close();
+ }
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd;
+ params.useless = "";
+ params.out = &out;
+ params.code = &code;
+ params.result = &result;
+ HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
+ if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
+ {
+ TerminateThread(gpg_thread, 0);
+ 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);
+ return CallService(MS_PROTO_CHAINSEND, w, l);
+ }
+ if(out.find("There is no assurance this key belongs to the named user") != string::npos)
+ {
+ out.clear();
+ if(MessageBox(0, _T("We trying to encrypt with untrusted key, do you want to trust this key permanently ?"), _T("Warning"), MB_YESNO) == IDYES)
+ {
+ DBWriteContactSettingByte(hContact, szGPGModuleName, "bAlwaysTrust", 1);
+ cmd.insert(0, _T("--trust-model always "));
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd;
+ params.useless = "";
+ params.out = &out;
+ params.code = &code;
+ params.result = &result;
+ HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
+ if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
+ {
+ TerminateThread(gpg_thread, 0);
+ 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);
+ return CallService(MS_PROTO_CHAINSEND, w, l);
+ }
+ }
+ else
+ return 0;
+ }
+ DeleteFile(path.c_str());
+ path.append(_T(".asc"));
+ wfstream f(path.c_str(), std::ios::in);
+ str.clear();
+ while(!f.eof() && f.is_open())
+ {
+ TCHAR tmp[128];
+ f.getline(tmp, 128);
+ str.append(tmp);
+ if(bJabberAPI && bIsMiranda09)
+ str.append(_T("\n"));
+ else
+ str.append(_T("\r\n"));
+ }
+ f.close();
+ DeleteFile(path.c_str());
+ if(!str.length())
+ {
+ HistoryLog(hContact, "Failed to encrypt message with GPG", EVENTTYPE_MESSAGE, DBEF_SENT);
+ return CallService(MS_PROTO_CHAINRECV, w, (LPARAM)ccs);
+ }
+ mir_free((void**)ccs->lParam);
+ char *utf = mir_u2a(str.c_str());
+ ccs->lParam = (LPARAM)utf;
+ if(bAppendTags)
+ DBWriteContactSettingByte(hContact, szGPGModuleName, "MsgsForTagging", DBGetContactSettingByte(ccs->hContact, szGPGModuleName, "MsgsForTagging", 0) + 1);
+ }
+ }
+ ccs->wParam&=~PREF_UNICODE;
+ return CallService(MS_PROTO_CHAINSEND, w, l);
+}
+
+int HookSendMsg(WPARAM w, LPARAM l)
+{
+ HANDLE hContact = (HANDLE)w;
+ if(isProtoMetaContacts(hContact))
+ hContact = metaGetMostOnline(hContact);
+ if(!DBGetContactSettingByte(hContact, szGPGModuleName, "GPGEncryption", 0))
+ return 0;
+
+ if(bAppendTags)
+ {
+ if(!l)
+ return 0;
+ BYTE Msgs = DBGetContactSettingByte(hContact, szGPGModuleName, "MsgsForTagging", 0);
+ if(!Msgs)
+ return 0;
+ DBEVENTINFO * dbei = (DBEVENTINFO*)l;
+ if((dbei->eventType == EVENTTYPE_MESSAGE) && (dbei->flags & DBEF_SENT))
+ {
+ char *msg = (char*)dbei->pBlob;
+ TCHAR *tmp = mir_utf8decodeW(msg);
+ wstring str = tmp;
+ mir_free(tmp);
+ str.insert(0, outopentag);
+ str.append(outclosetag);
+ char *msg2 = mir_utf8encodeW(str.c_str());
+ mir_free(dbei->pBlob);
+ dbei->pBlob = (PBYTE)msg2;
+ dbei->cbBlob = strlen(msg2)+1;
+ DBWriteContactSettingByte(hContact, szGPGModuleName, "MsgsForTagging", Msgs - 1);
+ }
+ }
+ return 0;
+}
+
+int TestHook(WPARAM w, LPARAM l)
+{
+ return 0;
+}
+
+
+static BOOL CALLBACK DlgProcKeyPassword(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ TCHAR *tmp = NULL;
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+ return TRUE;
+ }
+
+
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ {
+ TCHAR tmp[64];
+ GetDlgItemText(hwndDlg, IDC_KEY_PASSWORD, tmp, 64);
+ if(_tcslen(tmp) > 0)
+ {
+ extern TCHAR *password;
+ if(IsDlgButtonChecked(hwndDlg, IDC_SAVE_PASSWORD))
+ DBWriteContactSettingTString(NULL, szGPGModuleName, "szKeyPassword", tmp);
+ if(password)
+ delete [] password;
+ password = new TCHAR [_tcslen(tmp)+1];
+ _tcscpy(password, tmp);
+ }
+ mir_free(tmp);
+ DestroyWindow(hwndDlg);
+ break;
+ }
+ case IDCANCEL:
+ DestroyWindow(hwndDlg);
+ break;
+ default:
+ break;
+ }
+
+ break;
+ }
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->code)
+ {
+ default:
+ break;
+ }
+ }
+ break;
+ case WM_CLOSE:
+ DestroyWindow(hwndDlg);
+ break;
+ case WM_DESTROY:
+ break;
+
+ }
+ return FALSE;
+}
+
void ShowLoadKeyPasswordWindow()
{
extern HINSTANCE hInst;
diff --git a/metacontacts.h b/metacontacts.h
new file mode 100644
index 0000000..8dadd81
--- /dev/null
+++ b/metacontacts.h
@@ -0,0 +1,22 @@
+// Copyright © 2010 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.
+
+BOOL isProtoMetaContacts(HANDLE hContact);
+BOOL metaIsDefaultSubContact(HANDLE hContact) ;
+HANDLE metaGetContact(HANDLE hContact);
+HANDLE metaGetMostOnline(HANDLE hContact);
+DWORD metaGetContactsNum(HANDLE hContact);
+HANDLE metaGetSubcontact(HANDLE hContact, int num); \ No newline at end of file
diff --git a/options.cpp b/options.cpp
index c8e7777..7104f5e 100644
--- a/options.cpp
+++ b/options.cpp
@@ -136,7 +136,7 @@ static BOOL CALLBACK DlgProcGpgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA
{
TCHAR *name = (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_TCHAR);
item.mask = LVIF_TEXT;
- item.iItem = i;
+// item.iItem = i;
item.iSubItem = 0;
item.pszText = name;
iRow = ListView_InsertItem(hwndList, &item);
@@ -168,8 +168,8 @@ static BOOL CALLBACK DlgProcGpgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA
ListView_SetColumnWidth(hwndList, 2, LVSCW_AUTOSIZE);
ListView_SetColumnWidth(hwndList, 3, LVSCW_AUTOSIZE);
ListView_SetColumnWidth(hwndList, 4, LVSCW_AUTOSIZE);
- }
- i++;
+ i++;
+ }
}
tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szLogFilePath", _T(""));
SetDlgItemText(hwndDlg, IDC_LOG_FILE_EDIT, (_tcslen(tmp) > 1)?tmp:_T("c:\\GPGdebug.log"));
@@ -193,21 +193,25 @@ static BOOL CALLBACK DlgProcGpgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA
char *tmp;
bool keep = false;
bool ismetacontact = false;
- HANDLE meta = NULL, hContact = user_data[item_num+1];
+ HANDLE meta = NULL;
+ HANDLE hContact = user_data[item_num+1];
if(isProtoMetaContacts(hContact))
{
meta = hContact;
hContact = metaGetMostOnline(hContact);
ismetacontact = true;
}
- else if((meta = metaGetContact(hContact)) != NULL)
+ else if((meta = metaGetContact(user_data[item_num+1])) != NULL)
+ {
+ hContact = metaGetMostOnline(meta);
ismetacontact = true;
+ }
tmp = UniGetContactSettingUtf(hContact, szGPGModuleName, "KeyID", "");
- for(HANDLE hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hContact != NULL; hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, 0))
+ for(HANDLE hcnttmp = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0); hcnttmp != NULL; hcnttmp = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hcnttmp, 0))
{
- if(hContact != user_data[item_num+1])
+ if(hcnttmp != hContact)
{
- char *tmp2 = UniGetContactSettingUtf(hContact, szGPGModuleName, "KeyID", "");
+ char *tmp2 = UniGetContactSettingUtf(hcnttmp, szGPGModuleName, "KeyID", "");
if(!strcmp(tmp, tmp2))
{
mir_free(tmp2);
@@ -225,26 +229,26 @@ static BOOL CALLBACK DlgProcGpgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA
DWORD exitcode;
cmd += _T(" --batch --yes --delete-key ");
ptmp = mir_a2t(tmp);
- cmd += ptmp;
- mir_free(ptmp);
- gpg_execution_params params;
- pxResult result;
- params.cmd = &cmd;
- params.useless = "";
- params.out = &output;
- params.code = &exitcode;
- params.result = &result;
- HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
- if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
- {
- TerminateThread(gpg_thread, 0);
- MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK);
- }
- if(result == pxNotFound)
- {
+ cmd += ptmp;
+ mir_free(ptmp);
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd;
+ params.useless = "";
+ params.out = &output;
+ params.code = &exitcode;
+ params.result = &result;
+ HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
+ if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
+ {
+ TerminateThread(gpg_thread, 0);
+ 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(tmp);
- break;
+ break;
}
if(output.find("--delete-secret-keys") != string::npos)
MessageBoxA(0, "we have secret key for this public key, do not removing from GPG keyring", "info", MB_OK);
@@ -353,7 +357,7 @@ static BOOL CALLBACK DlgProcGpgOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARA
DBWriteContactSettingByte(user_data[i+1], szGPGModuleName, "GPGEncryption", 1);
else
DBWriteContactSettingByte(user_data[i+1], szGPGModuleName, "GPGEncryption", 0);
- item_num = hdr->iItem;
+ item_num = i;
setClistIcon(user_data[i+1]);
setSrmmIcon(user_data[i+1]);
}
@@ -676,24 +680,24 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
cmd += _T(" --batch ");
cmd += _T(" --import \"");
cmd += tmp2;
- cmd += _T("\"");
- }
- gpg_execution_params params;
- pxResult result;
- params.cmd = &cmd;
- params.useless = "";
- params.out = &output;
- params.code = &exitcode;
- params.result = &result;
- HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
- if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
- {
- TerminateThread(gpg_thread, 0);
- MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK);
- }
- if(result == pxNotFound)
+ cmd += _T("\"");
+ }
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd;
+ params.useless = "";
+ params.out = &output;
+ params.code = &exitcode;
+ params.result = &result;
+ HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
+ if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
{
- MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK);
+ TerminateThread(gpg_thread, 0);
+ 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);
break;
}
mir_free(begin);
@@ -728,9 +732,9 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
break;
}
char *tmp2;
- string::size_type s = output.find("gpg: key ") + strlen("gpg: key ");
- string::size_type s2 = output.find(":", s);
- tmp2 = new char [output.substr(s,s2-s).length()+1];
+ string::size_type s = output.find("gpg: key ") + strlen("gpg: key ");
+ string::size_type s2 = output.find(":", s);
+ tmp2 = new char [output.substr(s,s2-s).length()+1];
strcpy(tmp2, output.substr(s,s2-s).c_str());
mir_utf8decode(tmp2, 0);
{
@@ -760,8 +764,8 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
mir_free(tmp);
s2+=2;
s = output.find("\"", s2)-1;
- if(s != s2-1)
- {
+ if(s != s2-1)
+ {
tmp2 = new char [output.substr(s2,s-s2).length()+1];
strcpy(tmp2, output.substr(s2,s-s2).c_str());
mir_utf8decode(tmp2, 0);
@@ -790,8 +794,8 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
}
s+=2;
if((s2 = output.find("(", s)) == string::npos)
- s2 = output.find("<", s);
- tmp2 = new char [output.substr(s,s2-s-1).length()+1];
+ s2 = output.find("<", s);
+ tmp2 = new char [output.substr(s,s2-s-1).length()+1];
strcpy(tmp2, output.substr(s,s2-s-1).c_str());
mir_utf8decode(tmp2, 0);
if(hContact)
@@ -824,7 +828,7 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
s = output.find(">", s2);
s2++;
if(output[s] == ')')
- {
+ {
tmp2 = new char [output.substr(s2,s-s2).length()+1];
strcpy(tmp2, output.substr(s2,s-s2).c_str());
mir_utf8decode(tmp2, 0);
@@ -851,7 +855,7 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
}
mir_free(tmp2);
s+=3;
- s2 = output.find(">", s);
+ s2 = output.find(">", s);
tmp2 = new char [output.substr(s,s2-s).length()+1];
strcpy(tmp2, output.substr(s,s2-s).c_str());
mir_utf8decode(tmp2, 0);
@@ -883,7 +887,7 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
mir_free(tmp);
}
else
- {
+ {
tmp2 = new char [output.substr(s2,s-s2).length()+1];
strcpy(tmp2, output.substr(s2,s-s2).c_str());
mir_utf8decode(tmp2, 0);
@@ -922,39 +926,39 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
ListView_SetColumnWidth(hwndList_p, 3, LVSCW_AUTOSIZE);
}
}
- if(!hContact)
- {
- char *tmp = UniGetContactSettingUtf(hContact, szGPGModuleName, "KeyID", "");
- TCHAR *fp = mir_a2t(tmp);
- mir_free(tmp);
- {
- string out;
- DWORD code;
- wstring cmd = _T("--batch -a --export ");
- cmd += fp;
- mir_free(fp);
- gpg_execution_params params;
- pxResult result;
- params.cmd = &cmd;
- params.useless = "";
- params.out = &out;
- params.code = &code;
- params.result = &result;
- HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
- if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
- {
- TerminateThread(gpg_thread, 0);
- 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);
- break;
- }
- string::size_type s = 0;
- while((s = out.find("\r", s)) != string::npos)
- {
- out.erase(s, 1);
+ if(!hContact)
+ {
+ char *tmp = UniGetContactSettingUtf(hContact, szGPGModuleName, "KeyID", "");
+ TCHAR *fp = mir_a2t(tmp);
+ mir_free(tmp);
+ {
+ string out;
+ DWORD code;
+ wstring cmd = _T("--batch -a --export ");
+ cmd += fp;
+ mir_free(fp);
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd;
+ params.useless = "";
+ params.out = &out;
+ params.code = &code;
+ params.result = &result;
+ HANDLE gpg_thread = mir_forkthread(pxEexcute_thread, (void*)&params);
+ if(WaitForSingleObject(gpg_thread, 10000) == WAIT_TIMEOUT)
+ {
+ TerminateThread(gpg_thread, 0);
+ 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);
+ break;
+ }
+ string::size_type s = 0;
+ while((s = out.find("\r", s)) != string::npos)
+ {
+ out.erase(s, 1);
}
DBWriteContactSettingString(hContact, szGPGModuleName, "GPGPubKey", out.c_str());
}
@@ -963,10 +967,10 @@ static BOOL CALLBACK DlgProcLoadPublicKey(HWND hwndDlg,UINT msg,WPARAM wParam,LP
MessageBox(0, tmp, _T(""), MB_OK);
mir_free(tmp);
DeleteFile(tmp2);
- }
- key_buf.clear();
- if(IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ENCRYPTION))
- {
+ }
+ key_buf.clear();
+ if(IsDlgButtonChecked(hwndDlg, IDC_ENABLE_ENCRYPTION))
+ {
void setSrmmIcon(HANDLE);
void setClistIcon(HANDLE);
if(hContact)