summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss123next@list.ru>2010-08-15 17:31:53 +0300
committerGluzskiy Alexandr <sss123next@list.ru>2010-08-15 17:31:53 +0300
commitead24472fda0b5d69497e792a6b4dede30ab319b (patch)
treee1b9711b9127bef004ea1e018dcb726512883882
parent665f0c15010670233f3d85b9b0b0e6da6f35e878 (diff)
key generation from module
-rw-r--r--main.cpp278
-rw-r--r--new_gpg.rc46
-rw-r--r--resource.h15
-rw-r--r--utilities.cpp17
-rw-r--r--utilities.h1
5 files changed, 342 insertions, 15 deletions
diff --git a/main.cpp b/main.cpp
index 6a58405..9921b65 100644
--- a/main.cpp
+++ b/main.cpp
@@ -30,13 +30,16 @@ void test()
}
-HWND hwndFirstRun = NULL, hwndSetDirs = NULL, hwndNewKey = NULL;
+HWND hwndFirstRun = NULL, hwndSetDirs = NULL, hwndNewKey = NULL, hwndKeyGen = 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;
@@ -77,12 +80,12 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM
ListView_InsertColumn(hwndList, 4, &col);
ListView_SetExtendedListViewStyleEx(hwndList, 0, LVS_EX_FULLROWSELECT);
int i = 1, iRow = 0;
- { //parse gpg output
+ {
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;
@@ -149,6 +152,10 @@ static BOOL CALLBACK DlgProcFirstRun(HWND hwndDlg,UINT msg,WPARAM wParam,LPARAM
{
switch (LOWORD(wParam))
{
+ case IDC_GENERATE_KEY:
+ void ShowKeyGenDialog();
+ ShowKeyGenDialog();
+ break;
case ID_OK:
ListView_GetItemText(hwndList, itemnum, 0, fp, 16);
{
@@ -275,7 +282,7 @@ static BOOL CALLBACK DlgProcGpgBinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LP
DestroyWindow(hwndDlg);
break;
case WM_DESTROY:
- hwndFirstRun = NULL;
+ hwndSetDirs = NULL;
break;
}
@@ -333,7 +340,258 @@ static BOOL CALLBACK DlgProcNewKeyDialog(HWND hwndDlg, UINT msg, WPARAM wParam,
DestroyWindow(hwndDlg);
break;
case WM_DESTROY:
- hwndFirstRun = NULL;
+ 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"), 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, szModuleName, "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<<tmp2;
+ mir_free(tmp2);
+ f<<"\n";
+ f<<"Key-Length: ";
+ tmp = new TCHAR [5];
+ GetDlgItemText(hwndDlg, IDC_KEY_LENGTH, tmp, 5);
+ int length = _ttoi(tmp);
+ delete [] tmp;
+ f<<length;
+ f<<"\n";
+ f<<"Subkey-Type: ";
+ f<<subkeytype;
+ delete [] subkeytype;
+ f<<"\n";
+ tmp = new TCHAR [64]; //i hope this is enough for password
+ GetDlgItemText(hwndDlg, IDC_KEY_PASSWD, tmp, 64);
+ if(_tcslen(tmp) > 0)
+ {
+ f<<"Passphrase: ";
+ tmp2 = mir_utf8encodeW(tmp);
+ f<<tmp2;
+ f<<"\n";
+ mir_free(tmp2);
+ }
+ delete [] tmp;
+ f<<"Name-Real: ";
+ tmp = new TCHAR [128];
+ GetDlgItemText(hwndDlg, IDC_KEY_REAL_NAME, tmp, 128);
+ tmp2 = mir_utf8encodeW(tmp);
+ f<<tmp2;
+ mir_free(tmp2);
+ delete [] tmp;
+ f<<"\n";
+ tmp = new TCHAR [512];
+ GetDlgItemText(hwndDlg, IDC_KEY_COMMENT, tmp, 512);
+ if(_tcslen(tmp) > 0)
+ {
+ tmp2 = mir_utf8encodeW(tmp);
+ f<<"Name-Comment: ";
+ f<<tmp2;
+ f<<"\n";
+ }
+ mir_free(tmp2);
+ delete [] tmp;
+ f<<"Name-Email: ";
+ tmp = new TCHAR [128];
+ GetDlgItemText(hwndDlg, IDC_KEY_EMAIL, tmp, 128);
+ tmp2 = mir_utf8encodeW(tmp);
+ f<<tmp2;
+ mir_free(tmp2);
+ delete [] tmp;
+ f<<"\n";
+ f<<"Expire-Date: ";
+ tmp = new TCHAR [12];
+ GetDlgItemText(hwndDlg, IDC_KEY_EXPIRE_DATE, tmp, 12);
+ tmp2 = mir_utf8encodeW(tmp);
+ f<<tmp2;
+ mir_free(tmp2);
+ delete [] tmp;
+ f<<"\n";
+ f.close();
+ }
+ { //gpg execution
+ DWORD code;
+ string out;
+ wstring cmd;
+ cmd += _T("--batch --yes --gen-key \"");
+ cmd += path;
+ cmd += _T("\"");
+ pxExecute(&cmd, "", &out, &code);
+ }
+ DeleteFile(path.c_str());
+ DestroyWindow(hwndDlg);
+ {//parse gpg output
+ LVITEM item = {0};
+ int i = 1, iRow = 0;
+ item.mask = LVIF_TEXT;
+ item.iItem = i;
+ item.iSubItem = 0;
+ item.pszText = _T("");
+ string out;
+ DWORD code;
+ string::size_type p = 0, p2 = 0, stop = 0;
+ {
+ wstring cmd = _T("--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);
+ ListView_DeleteAllItems(hwndList_g);
+ 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_g, &item);
+ ListView_SetItemText(hwndList_g, 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_g, 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_g, iRow, 2, tmp);
+ mir_free(tmp);
+ p++;
+ p2 = out.find(">", 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);
+ i++;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ break;
+ }
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->code)
+ {
+ }
+ }
+ break;
+ case WM_CLOSE:
+ DestroyWindow(hwndDlg);
+ break;
+ case WM_DESTROY:
+ hwndKeyGen = NULL;
break;
}
@@ -369,6 +627,16 @@ void ShowNewKeyDialog()
SetForegroundWindow(hwndNewKey);
}
+void ShowKeyGenDialog()
+{
+ if (hwndKeyGen == NULL)
+ {
+ hwndKeyGen = CreateDialog(hInst, MAKEINTRESOURCE(IDD_KEY_GEN), NULL, DlgProcKeyGenDialog);
+ }
+ SetForegroundWindow(hwndKeyGen);
+}
+
+
void FirstRun()
diff --git a/new_gpg.rc b/new_gpg.rc
index e53bfcb..e64a3dc 100644
--- a/new_gpg.rc
+++ b/new_gpg.rc
@@ -60,19 +60,20 @@ BEGIN
DEFPUSHBUTTON "ОК",ID_OK,7,63,50,14
PUSHBUTTON "Load from file",ID_LOAD_FROM_FILE,208,63,54,14
EDITTEXT IDC_PUBLIC_KEY_EDIT,7,7,255,51,ES_MULTILINE | WS_VSCROLL,WS_EX_STATICEDGE
+ PUSHBUTTON "Select existing",IDC_SELECT_EXISTING,109,63,50,14
END
-IDD_FIRST_RUN DIALOGEX 0, 0, 439, 196
+IDD_FIRST_RUN DIALOGEX 0, 0, 291, 196
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "new GPG Plugin First Run"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "ОК",ID_OK,15,175,50,14,WS_DISABLED
- CONTROL "",IDC_KEY_LIST,"SysListView32",LVS_REPORT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,15,23,255,50
- PUSHBUTTON "Generate key",IDC_GENERATE_KEY,15,76,54,14
+ CONTROL "",IDC_KEY_LIST,"SysListView32",LVS_REPORT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,23,277,105
+ PUSHBUTTON "Generate key",IDC_GENERATE_KEY,13,141,54,14
LTEXT "Select key for use",IDC_STATIC,16,12,186,8
- EDITTEXT IDC_KEY_PASSWORD,194,78,77,14,ES_PASSWORD | ES_AUTOHSCROLL
- RTEXT "Key password:",IDC_STATIC,107,80,81,8
+ EDITTEXT IDC_KEY_PASSWORD,205,141,77,14,ES_PASSWORD | ES_AUTOHSCROLL
+ RTEXT "Key password:",IDC_STATIC,86,142,117,8
END
IDD_BIN_PATH DIALOGEX 0, 0, 354, 89
@@ -100,6 +101,31 @@ BEGIN
CTEXT "Статический",IDC_MESSAGE,19,25,392,8
END
+IDD_KEY_GEN DIALOGEX 0, 0, 209, 166
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Key Generation dialog"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "ОК",IDOK,7,145,50,14
+ PUSHBUTTON "Отмена",IDCANCEL,152,145,50,14
+ COMBOBOX IDC_KEY_TYPE,65,14,48,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Key type:",IDC_STATIC,8,16,32,8
+ LTEXT "Key length:",IDC_STATIC,7,32,38,8
+ LTEXT "Key password:",IDC_STATIC,7,49,53,8
+ EDITTEXT IDC_KEY_PASSWD,65,46,55,14,ES_AUTOHSCROLL
+ LTEXT "Real name:",IDC_STATIC,7,63,54,8
+ LTEXT "Email:",IDC_STATIC,7,79,47,8
+ LTEXT "Comment:",IDC_STATIC,7,92,53,8
+ LTEXT "Expire date:",IDC_STATIC,7,109,40,8
+ EDITTEXT IDC_KEY_EMAIL,65,76,55,14,ES_AUTOHSCROLL
+ EDITTEXT IDC_KEY_REAL_NAME,65,61,55,14,ES_AUTOHSCROLL
+ EDITTEXT IDC_KEY_COMMENT,65,91,55,14,ES_AUTOHSCROLL
+ EDITTEXT IDC_KEY_EXPIRE_DATE,65,106,55,14,ES_AUTOHSCROLL
+ LTEXT "ex.: 2010-08-15 or 0",IDC_STATIC,127,108,68,8
+ EDITTEXT IDC_KEY_LENGTH,65,30,40,14,ES_AUTOHSCROLL | ES_NUMBER
+ LTEXT "From 1024 to 4096",IDC_STATIC,113,33,62,8
+END
+
/////////////////////////////////////////////////////////////////////////////
//
@@ -120,7 +146,7 @@ BEGIN
IDD_FIRST_RUN, DIALOG
BEGIN
LEFTMARGIN, 7
- RIGHTMARGIN, 432
+ RIGHTMARGIN, 284
TOPMARGIN, 7
BOTTOMMARGIN, 189
END
@@ -141,6 +167,14 @@ BEGIN
TOPMARGIN, 6
BOTTOMMARGIN, 61
END
+
+ IDD_KEY_GEN, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 202
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 159
+ END
END
#endif // APSTUDIO_INVOKED
diff --git a/resource.h b/resource.h
index 18a551b..4e6dd17 100644
--- a/resource.h
+++ b/resource.h
@@ -8,8 +8,8 @@
#define IDD_OPT_GPG_BIN 105
#define IDD_BIN_PATH 106
#define IDD_OPT_GPG_MESSAGES 107
-#define IDD_DIALOG1 108
#define IDD_NEW_KEY 108
+#define IDD_KEY_GEN 109
#define IDC_SET_BIN_PATH 1016
#define IDC_SET_HOME_DIR 1017
#define IDC_BIN_PATH 1018
@@ -23,13 +23,18 @@
#define IDC_PUBLIC_KEY_EDIT 1025
#define IDC_KEY_PASSWORD 1025
#define IDC_IN_OPEN_TAG 1025
+#define IDC_KEY_PASSWD 1025
#define IDC_BUTTON1 1026
#define IDC_SAVE_KEY_BUTTON 1026
#define IDC_GENERATE_KEY 1026
#define IDC_IGNORE_KEY 1026
+#define IDC_SELECT_EXISTING 1026
+#define IDC_KEY_EMAIL 1026
#define IDC_DELETE_KEY_BUTTON 1027
#define IDC_IN_CLOSE_TAG 1027
+#define IDC_KEY_REAL_NAME 1027
#define IDC_KEY_LIST 1028
+#define IDC_KEY_COMMENT 1028
#define IDC_OUT_OPEN_TAG 1029
#define IDC_APPEND_TAGS 1030
#define IDC_OUT_CLOSE_TAG 1031
@@ -37,14 +42,18 @@
#define IDC_MESSAGE 1034
#define ID_IMPORT 1035
#define IDC_IMPORT_AND_USE 1036
+#define IDC_KEY_TYPE 1039
+#define IDC_KEY_LENGTH 1040
+#define IDC_KEY_EXPIRE_DATE 1043
+#define IDC_EDIT2 1044
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 109
+#define _APS_NEXT_RESOURCE_VALUE 110
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1037
+#define _APS_NEXT_CONTROL_VALUE 1045
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/utilities.cpp b/utilities.cpp
index 4466a18..85cb4ec 100644
--- a/utilities.cpp
+++ b/utilities.cpp
@@ -279,4 +279,19 @@ void HistoryLog(HANDLE hContact, char *data, int event_type, int flags)
Event.cbBlob = strlen(data)+1;
Event.pBlob = (PBYTE)_strdup(data);
CallService(MS_DB_EVENT_ADD, (WPARAM)(HANDLE)hContact,(LPARAM)&Event);
-} \ No newline at end of file
+}
+
+static int ControlAddStringUtf(HWND ctrl, DWORD msg, const TCHAR *szString)
+{
+ int item = -1;
+ item = SendMessage(ctrl, msg, 0, (LPARAM)szString);
+ return item;
+}
+
+int ComboBoxAddStringUtf(HWND hCombo, const TCHAR *szString, DWORD data)
+{
+ int item = ControlAddStringUtf(hCombo, CB_ADDSTRING, szString);
+ SendMessage(hCombo, CB_SETITEMDATA, item, data);
+
+ return item;
+}
diff --git a/utilities.h b/utilities.h
index 5e458fc..fc3304d 100644
--- a/utilities.h
+++ b/utilities.h
@@ -27,5 +27,6 @@ void storeOutput(HANDLE ahandle, string *output);
void cp866_to_cp1251(string *str);
void HistoryLog(HANDLE hContact, char *data, int event_type, int flags);
+int ComboBoxAddStringUtf(HWND hCombo, const TCHAR *szString, DWORD data);
#endif