// 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" HWND hwndFirstRun = NULL, hwndSetDirs = NULL, hwndNewKey = NULL, hwndKeyGen = NULL, hwndSelectExistingKey = NULL; int itemnum = 0; HWND hwndList_g = NULL; static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM lParam) { HWND hwndList=GetDlgItem(hwndDlg, IDC_KEY_LIST); hwndList_g = hwndList; LVCOLUMN col = {0}; LVITEM item = {0}; NMLISTVIEW * hdr = (NMLISTVIEW *) lParam; TCHAR fp[16] = {0}; switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); col.pszText = _T("Key ID"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 50; ListView_InsertColumn(hwndList, 0, &col); ZeroMemory(&col,sizeof(col)); col.pszText = _T("Email"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 30; ListView_InsertColumn(hwndList, 1, &col); ZeroMemory(&col,sizeof(col)); col.pszText = _T("Name"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 250; ListView_InsertColumn(hwndList, 2, &col); ZeroMemory(&col,sizeof(col)); col.pszText = _T("Creation date"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 30; ListView_InsertColumn(hwndList, 3, &col); ZeroMemory(&col,sizeof(col)); col.pszText = _T("Key length"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 30; ListView_InsertColumn(hwndList, 4, &col); ListView_SetExtendedListViewStyleEx(hwndList, 0, LVS_EX_FULLROWSELECT); int i = 1, iRow = 0; { item.mask = LVIF_TEXT; item.iItem = i; item.iSubItem = 0; item.pszText = _T(""); {//parse gpg output string out; DWORD code; string::size_type p = 0, p2 = 0, stop = 0; { wstring cmd = _T("--batch --list-secret-keys"); if(pxExecute(&cmd, "", &out, &code) == pxNotFound) { MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK); break; } } cp866_to_cp1251(&out); while(p != string::npos) { if((p = out.find("sec ", p)) == string::npos) break; p += 5; if(p < stop) break; stop = p; p2 = out.find("/", p) - 1; TCHAR *tmp = mir_a2t(out.substr(p,p2-p).c_str()); item.pszText = tmp; iRow = ListView_InsertItem(hwndList, &item); ListView_SetItemText(hwndList, iRow, 4, tmp); mir_free(tmp); p2+=2; p = out.find(" ", p2); tmp = mir_a2t(out.substr(p2,p-p2).c_str()); ListView_SetItemText(hwndList, iRow, 0, tmp); mir_free(tmp); p = out.find("uid ", p); p2 = out.find_first_not_of(" ", p+5); p = out.find("<", p2); tmp = mir_a2t(out.substr(p2,p-p2).c_str()); ListView_SetItemText(hwndList, iRow, 2, tmp); mir_free(tmp); p++; p2 = out.find(">", p); tmp = mir_a2t(out.substr(p,p2-p).c_str()); ListView_SetItemText(hwndList, iRow, 1, tmp); mir_free(tmp); p = out.find("ssb ", p2) + 6; p = out.find(" ", p) + 1; p2 = out.find("\n", p); tmp = mir_a2t(out.substr(p,p2-p-1).c_str()); ListView_SetItemText(hwndList, iRow, 3, tmp); mir_free(tmp); ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE);// not sure about this ListView_SetColumnWidth(hwndList, 1, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList, 2, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList, 3, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList, 4, LVSCW_AUTOSIZE); i++; } } } return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_GENERATE_KEY: void ShowKeyGenDialog(); ShowKeyGenDialog(); break; case ID_OK: ListView_GetItemText(hwndList, itemnum, 0, fp, 16); { string out; DWORD code; wstring cmd = _T("--batch --export -a "); cmd += fp; if(pxExecute(&cmd, "", &out, &code) == 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(NULL, szGPGModuleName, "GPGPubKey", out.c_str()); } DBWriteContactSettingTString(NULL, szGPGModuleName, "KeyID", fp); TCHAR passwd[64]; GetDlgItemText(hwndDlg, IDC_KEY_PASSWORD, passwd, 64); if(_tcslen(passwd) > 0) DBWriteContactSettingTString(NULL, szGPGModuleName, "szKeyPassword", passwd); else DBDeleteContactSetting(NULL, szGPGModuleName, "szKeyPassword"); DBWriteContactSettingByte(NULL, szGPGModuleName, "FirstRun", 0); DestroyWindow(hwndDlg); break; case IDC_OTHER: { void ShowLoadPublicKeyDialog(); extern map user_data; extern int item_num; item_num = 0; //black magic here user_data[1] = 0; MessageBox(0, _T("Set secret key in following dialog.\nI do not know if password protected key is work..."), _T("Info"), MB_OK); ShowLoadPublicKeyDialog(); } break; } break; } case WM_NOTIFY: { if(hdr && IsWindowVisible(hdr->hdr.hwndFrom) && hdr->iItem != (-1)) { if(hdr->hdr.code == LVN_ITEMCHANGED) { EnableWindow(GetDlgItem(hwndDlg, ID_OK), 1); itemnum = hdr->iItem; } } switch (((LPNMHDR)lParam)->code) { default: break; } } break; case WM_CLOSE: DestroyWindow(hwndDlg); break; case WM_DESTROY: hwndFirstRun = NULL; break; } return FALSE; } void ShowFirstRunDialog(); static BOOL CALLBACK DlgProcGpgBinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { TCHAR *tmp = NULL; switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", _T("")); SetDlgItemText(hwndDlg, IDC_BIN_PATH, tmp); mir_free(tmp); tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T("")); SetDlgItemText(hwndDlg, IDC_HOME_DIR, tmp); mir_free(tmp); return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_SET_BIN_PATH: GetFilePath(_T("Choose gpg2.exe"), "szGpgBinPath", _T("*.exe"), _T("EXE Executables")); tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szGpgBinPath", _T("gpg2.exe")); SetDlgItemText(hwndDlg, IDC_BIN_PATH, tmp); mir_free(tmp); break; case IDC_SET_HOME_DIR: GetFolderPath(_T("Set home diractory"), "szHomePath"); tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T("")); SetDlgItemText(hwndDlg, IDC_HOME_DIR, tmp); mir_free(tmp); break; case ID_OK: { TCHAR tmp[512]; GetDlgItemText(hwndDlg, IDC_BIN_PATH, tmp, 512); DBWriteContactSettingTString(NULL, szGPGModuleName, "szGpgBinPath", tmp); GetDlgItemText(hwndDlg, IDC_HOME_DIR, tmp, 512); while(tmp[_tcslen(tmp)-1] == '\\') tmp[_tcslen(tmp)-1] = '\0'; DBWriteContactSettingTString(NULL, szGPGModuleName, "szHomePath", tmp); DestroyWindow(hwndDlg); ShowFirstRunDialog(); break; } default: break; } break; } case WM_NOTIFY: { switch (((LPNMHDR)lParam)->code) { default: break; } } break; case WM_CLOSE: DestroyWindow(hwndDlg); break; case WM_DESTROY: hwndSetDirs = NULL; break; } return FALSE; } static BOOL CALLBACK DlgProcNewKeyDialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { extern HANDLE new_key_hcnt; void ImportKey(); TCHAR *tmp = NULL; switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); TCHAR *tmp = UniGetContactSettingUtf(new_key_hcnt, szGPGModuleName, "GPGPubKey", _T("")); SetDlgItemText(hwndDlg, IDC_MESSAGE, (_tcslen(tmp) > 0)?_T("There is existing key for contact, would you like to replace with new key ?"):_T("New public key was received, do you want to import it?")); EnableWindow(GetDlgItem(hwndDlg, IDC_IMPORT_AND_USE), DBGetContactSettingByte(new_key_hcnt, szGPGModuleName, "GPGEncryption", 0)?0:1); SetDlgItemText(hwndDlg, ID_IMPORT, (_tcslen(tmp) > 0)?_T("Replace"):_T("Accept")); mir_free(tmp); tmp = new TCHAR [256]; _tcscpy(tmp, _T("Received key from ")); _tcscat(tmp, (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)new_key_hcnt, (LPARAM)GCDNF_TCHAR)); SetDlgItemText(hwndDlg, IDC_KEY_FROM, tmp); delete [] tmp; return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_IMPORT: ImportKey(); DestroyWindow(hwndDlg); break; case IDC_IMPORT_AND_USE: ImportKey(); DBWriteContactSettingByte(new_key_hcnt, szGPGModuleName, "GPGEncryption", 1); void setSrmmIcon(HANDLE hContact); void setClistIcon(HANDLE hContact); setSrmmIcon(new_key_hcnt); setClistIcon(new_key_hcnt); DestroyWindow(hwndDlg); break; case IDC_IGNORE_KEY: 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: hwndNewKey = NULL; break; } return FALSE; } static BOOL CALLBACK DlgProcKeyGenDialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); ComboBoxAddStringUtf(GetDlgItem(hwndDlg, IDC_KEY_TYPE), _T("RSA"), 0); ComboBoxAddStringUtf(GetDlgItem(hwndDlg, IDC_KEY_TYPE), _T("DSA"), 1); SendDlgItemMessage(hwndDlg, IDC_KEY_TYPE, CB_SETCURSEL, (WPARAM)1, 0); SetDlgItemInt(hwndDlg, IDC_KEY_EXPIRE_DATE, 0, 0); SetDlgItemInt(hwndDlg, IDC_KEY_LENGTH, 2048, 0); return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCANCEL: DestroyWindow(hwndDlg); break; case IDOK: { wstring path; { //data sanity checks TCHAR *tmp = new TCHAR [5]; GetDlgItemText(hwndDlg, IDC_KEY_TYPE, tmp, 5); if(_tcslen(tmp) < 3) { mir_free(tmp); MessageBox(0, _T("You must set encryption algorythm first"), _T("Error"), MB_OK); break; } mir_free(tmp); tmp = new TCHAR [5]; GetDlgItemText(hwndDlg, IDC_KEY_LENGTH, tmp, 5); int length = _ttoi(tmp); mir_free(tmp); if(length < 1024 || length > 4096) { MessageBox(0, _T("Key length must be of length from 1024 to 4096 bits"), _T("Error"), MB_OK); break; } tmp = new TCHAR [12]; GetDlgItemText(hwndDlg, IDC_KEY_EXPIRE_DATE, tmp, 12); if(_tcslen(tmp) != 10 && tmp[0] != '0') { MessageBox(0, _T("Invalid date"), _T("Error"), MB_OK); delete [] tmp; break; } delete [] tmp; tmp = new TCHAR [128]; GetDlgItemText(hwndDlg, IDC_KEY_REAL_NAME, tmp, 128); if(_tcslen(tmp) < 5) { MessageBox(0, _T("Name must contain at least 5 characters"), _T("Error"), MB_OK); delete [] tmp; break; } delete [] tmp; tmp = new TCHAR [128]; GetDlgItemText(hwndDlg, IDC_KEY_EMAIL, tmp, 128); if((_tcslen(tmp)) < 5 || (!_tcschr(tmp, _T('@'))) || (!_tcschr(tmp, _T('.')))) { MessageBox(0, _T("Invalid Email"), _T("Error"), MB_OK); delete [] tmp; break; } delete [] tmp; } { //generating key file TCHAR *tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T("")); char *tmp2;// = mir_t2a(tmp); path = tmp; mir_free(tmp); // mir_free(tmp2); path.append(_T("\\new_key")); wfstream f(path.c_str(), std::ios::out); if(!f.is_open()) { MessageBox(0, _T("Failed to open file"), _T("Error"), MB_OK); break; } f<<"Key-Type: "; tmp = new TCHAR [5]; GetDlgItemText(hwndDlg, IDC_KEY_TYPE, tmp, 5); tmp2 = mir_t2a(tmp); char *subkeytype = new char [6]; if(strstr(tmp2, "RSA")) strcpy(subkeytype, "RSA"); else if(strstr(tmp2, "DSA")) //this is useless check for now, but it will be required if someone add another key types support strcpy(subkeytype, "ELG-E"); delete [] tmp; f< 0) { f<<"Passphrase: "; tmp2 = mir_utf8encodeW(tmp); f< 0) { tmp2 = mir_utf8encodeW(tmp); f<<"Name-Comment: "; f<", p); tmp = mir_a2t(out.substr(p,p2-p).c_str()); ListView_SetItemText(hwndList_g, iRow, 1, tmp); mir_free(tmp); p = out.find("ssb ", p2) + 6; p = out.find(" ", p) + 1; p2 = out.find("\n", p); tmp = mir_a2t(out.substr(p,p2-p-1).c_str()); ListView_SetItemText(hwndList_g, iRow, 3, tmp); mir_free(tmp); ListView_SetColumnWidth(hwndList_g, 0, LVSCW_AUTOSIZE);// not sure about this ListView_SetColumnWidth(hwndList_g, 1, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList_g, 2, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList_g, 3, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList_g, 4, LVSCW_AUTOSIZE); i++; } } } break; default: break; } break; } case WM_NOTIFY: { switch (((LPNMHDR)lParam)->code) { default: break; } } break; case WM_CLOSE: DestroyWindow(hwndDlg); break; case WM_DESTROY: hwndKeyGen = NULL; break; } return FALSE; } int itemnum2 = 0; static BOOL CALLBACK DlgProcLoadExistingKey(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM lParam) { HWND hwndList=GetDlgItem(hwndDlg, IDC_EXISTING_KEY_LIST); hwndList_g = hwndList; LVCOLUMN col = {0}; LVITEM item = {0}; NMLISTVIEW * hdr = (NMLISTVIEW *) lParam; TCHAR id[16] = {0}; switch (msg) { case WM_INITDIALOG: { TranslateDialogDefault(hwndDlg); col.pszText = _T("Key ID"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 50; ListView_InsertColumn(hwndList, 0, &col); ZeroMemory(&col,sizeof(col)); col.pszText = _T("Email"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 30; ListView_InsertColumn(hwndList, 1, &col); ZeroMemory(&col,sizeof(col)); col.pszText = _T("Name"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 250; ListView_InsertColumn(hwndList, 2, &col); ZeroMemory(&col,sizeof(col)); col.pszText = _T("Creation date"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 30; ListView_InsertColumn(hwndList, 3, &col); ZeroMemory(&col,sizeof(col)); col.pszText = _T("Key length"); col.mask = LVCF_TEXT | LVCF_WIDTH; col.fmt = LVCFMT_LEFT; col.cx = 30; ListView_InsertColumn(hwndList, 4, &col); ListView_SetExtendedListViewStyleEx(hwndList, 0, LVS_EX_FULLROWSELECT); int i = 1, iRow = 0; { item.mask = LVIF_TEXT; item.iItem = i; item.iSubItem = 0; item.pszText = _T(""); {//parse gpg output string out; DWORD code; string::size_type p = 0, p2 = 0, stop = 0; { wstring cmd = _T("--batch --list-keys"); if(pxExecute(&cmd, "", &out, &code) == pxNotFound) { MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK); break; } } cp866_to_cp1251(&out); while(p != string::npos) { if((p = out.find("pub ", p)) == string::npos) break; p += 5; if(p < stop) break; stop = p; p2 = out.find("/", p) - 1; TCHAR *tmp = mir_a2t(out.substr(p,p2-p).c_str()); item.pszText = tmp; iRow = ListView_InsertItem(hwndList, &item); ListView_SetItemText(hwndList, iRow, 4, tmp); mir_free(tmp); p2+=2; p = out.find(" ", p2); tmp = mir_a2t(out.substr(p2,p-p2).c_str()); ListView_SetItemText(hwndList, iRow, 0, tmp); mir_free(tmp); p = out.find("uid ", p); p2 = out.find_first_not_of(" ", p+5); p = out.find("<", p2); tmp = mir_a2t(out.substr(p2,p-p2).c_str()); ListView_SetItemText(hwndList, iRow, 2, tmp); mir_free(tmp); p++; p2 = out.find(">", p); tmp = mir_a2t(out.substr(p,p2-p).c_str()); ListView_SetItemText(hwndList, iRow, 1, tmp); mir_free(tmp); p = out.find("sub ", p2) + 6; p = out.find(" ", p) + 1; p2 = out.find("\n", p); tmp = mir_a2t(out.substr(p,p2-p-1).c_str()); ListView_SetItemText(hwndList, iRow, 3, tmp); mir_free(tmp); ListView_SetColumnWidth(hwndList, 0, LVSCW_AUTOSIZE);// not sure about this ListView_SetColumnWidth(hwndList, 1, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList, 2, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList, 3, LVSCW_AUTOSIZE); ListView_SetColumnWidth(hwndList, 4, LVSCW_AUTOSIZE); i++; } } } return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { ListView_GetItemText(hwndList, itemnum2, 0, id, 16); extern HWND hPubKeyEdit; string out; DWORD code; wstring cmd = _T("--batch --export -a "); cmd += id; if(pxExecute(&cmd, "", &out, &code) == 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); } TCHAR *tmp = mir_a2t(out.c_str()); // SetDlgItemText(hPubKeyEdit, IDC_PUBLIC_KEY_EDIT, tmp); SetWindowText(hPubKeyEdit, tmp); mir_free(tmp); } DestroyWindow(hwndDlg); break; case IDCANCEL: DestroyWindow(hwndDlg); break; } break; } case WM_NOTIFY: { if(hdr && IsWindowVisible(hdr->hdr.hwndFrom) && hdr->iItem != (-1)) { if(hdr->hdr.code == LVN_ITEMCHANGED) { EnableWindow(GetDlgItem(hwndDlg, IDOK), 1); itemnum2 = hdr->iItem; } } switch (((LPNMHDR)lParam)->code) { case PSN_APPLY: { return TRUE; } } } break; case WM_CLOSE: DestroyWindow(hwndDlg); break; case WM_DESTROY: hwndSelectExistingKey = NULL; break; } return FALSE; } extern HINSTANCE hInst; void ShowFirstRunDialog() { if (hwndFirstRun == NULL) { hwndFirstRun = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FIRST_RUN), NULL, DlgProcFirstRun); } SetForegroundWindow(hwndFirstRun); } void ShowSetDirsDialog() { if (hwndSetDirs == NULL) { hwndSetDirs = CreateDialog(hInst, MAKEINTRESOURCE(IDD_BIN_PATH), NULL, DlgProcGpgBinOpts); } SetForegroundWindow(hwndSetDirs); } void ShowNewKeyDialog() { hwndNewKey = CreateDialog(hInst, MAKEINTRESOURCE(IDD_NEW_KEY), NULL, DlgProcNewKeyDialog); SetForegroundWindow(hwndNewKey); } void ShowKeyGenDialog() { if (hwndKeyGen == NULL) { hwndKeyGen = CreateDialog(hInst, MAKEINTRESOURCE(IDD_KEY_GEN), NULL, DlgProcKeyGenDialog); } SetForegroundWindow(hwndKeyGen); } void ShowSelectExistingKeyDialog() { if (hwndSelectExistingKey == NULL) { hwndSelectExistingKey = CreateDialog(hInst, MAKEINTRESOURCE(IDD_LOAD_EXISTING_KEY), NULL, DlgProcLoadExistingKey); } SetForegroundWindow(hwndSelectExistingKey); } void FirstRun() { DWORD pid = 0; if(!DBGetContactSettingByte(NULL, szGPGModuleName, "FirstRun", 1)) return; ShowSetDirsDialog(); } void InitCheck() { } void ImportKey() { extern wstring new_key; extern HANDLE new_key_hcnt; DBWriteContactSettingTString(new_key_hcnt, szGPGModuleName, "GPGPubKey", new_key.c_str()); { //gpg execute block wstring cmd; TCHAR tmp2[MAX_PATH] = {0}; TCHAR *ptmp; string output; DWORD exitcode; { ptmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T("")); _tcscpy(tmp2, ptmp); mir_free(ptmp); _tcscat(tmp2, _T("\\")); _tcscat(tmp2, _T("temporary_exported.asc")); wfstream f(tmp2, std::ios::out); ptmp = UniGetContactSettingUtf(new_key_hcnt, szGPGModuleName, "GPGPubKey", _T("")); wstring new_key = ptmp; mir_free(ptmp); f<", s2); s2++; if(output[s] == ')') { DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyComment", output.substr(s2,s-s2).c_str()); s+=3; s2 = output.find(">", s); DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyMainEmail", output.substr(s,s2-s).c_str()); } else DBWriteContactSettingString(new_key_hcnt, szGPGModuleName, "KeyMainEmail", output.substr(s2,s-s2).c_str()); } MessageBoxA(0, output.c_str(), "", MB_OK); DeleteFile(tmp2); } }