summaryrefslogtreecommitdiff
path: root/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp112
1 files changed, 108 insertions, 4 deletions
diff --git a/main.cpp b/main.cpp
index 27ed44e..898b672 100644
--- a/main.cpp
+++ b/main.cpp
@@ -218,7 +218,7 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM
DBWriteContactSettingByte(NULL, szGPGModuleName, "FirstRun", 0);
{
wstring keyinfo = _T("Current private key id: ");
- keyinfo += (_tcslen(fp) > 0)?fp:_T("not set");
+ keyinfo += (fp[0])?fp:_T("not set");
extern HWND hwndCurKey_p;
SetWindowText(hwndCurKey_p, keyinfo.c_str());
}
@@ -379,9 +379,113 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM
DBDeleteContactSetting(NULL, szGPGModuleName, "KeyType");
ListView_DeleteItem(hwndList, itemnum);
break;
- }
- break;
- }
+ case IDC_GENERATE_RANDOM:
+ {
+ wstring path;
+ { //generating key file
+ TCHAR *tmp = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T(""));
+ path = tmp;
+ mir_free(tmp);
+ 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: RSA";
+ f<<"\n";
+ f<<"Key-Length: 2048";
+ f<<"\n";
+ f<<"Subkey-Type: RSA";
+ f<<"\n";
+ f<<"Name-Real: ";
+ f<<get_random(6).c_str();
+ f<<"\n";
+ f<<"Name-Email: ";
+ f<<get_random(5).c_str();
+ f<<"@";
+ f<<get_random(5).c_str();
+ f<<".";
+ f<<get_random(3).c_str();
+ f<<"\n";
+ f.close();
+ }
+ { //gpg execution
+ DWORD code;
+ string out;
+ wstring cmd;
+ cmd += _T("--batch --yes --gen-key \"");
+ cmd += path;
+ cmd += _T("\"");
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd;
+ params.useless = "";
+ params.out = &out;
+ params.code = &code;
+ params.result = &result;
+ boost::thread gpg_thread(boost::bind(&pxEexcute_thread, &params));
+ if(!gpg_thread.timed_join(boost::posix_time::minutes(10)))
+ {
+ gpg_thread.~thread();
+ MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK);
+ break;
+ }
+ if(result == pxNotFound)
+ {
+ MessageBox(0, _T("Set path to gpg.exe first!"), _T("Warning"), MB_OK);
+ break;
+ }
+ DeleteFile(path.c_str());
+ string::size_type p1 = 0;
+ if((p1 = out.find("key ")) != string::npos)
+ path = toUTF16(out.substr(p1+4, 8));
+ else
+ path.clear();
+ }
+ if(!path.empty())
+ {
+ string out;
+ DWORD code;
+ wstring cmd = _T("--batch -a --export ");
+ cmd += path;
+ gpg_execution_params params;
+ pxResult result;
+ params.cmd = &cmd;
+ params.useless = "";
+ params.out = &out;
+ params.code = &code;
+ params.result = &result;
+ boost::thread gpg_thread(boost::bind(&pxEexcute_thread, &params));
+ if(!gpg_thread.timed_join(boost::posix_time::seconds(10)))
+ {
+ gpg_thread.~thread();
+ MessageBox(0, _T("GPG execution timed out, aborted"), _T(""), MB_OK);
+ break;
+ }
+ 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(NULL, szGPGModuleName, "GPGPubKey", out.c_str());
+ DBWriteContactSettingTString(NULL, szGPGModuleName, "KeyID", path.c_str());
+ extern HWND hwndCurKey_p;
+ SetWindowText(hwndCurKey_p, path.c_str());
+ }
+ }
+ DestroyWindow(hwndDlg);
+ //use new key
+ break;
+ }
+ break;
+ }
case WM_NOTIFY:
{