X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/d3a1a808f65812c591ef0de3e61a94b13aa73160..875e0b16f64f7b97171d58fe34ebcd57314eb739:/pageant.c?ds=inline diff --git a/pageant.c b/pageant.c index d12e02b4..1b282ab8 100644 --- a/pageant.c +++ b/pageant.c @@ -12,6 +12,7 @@ #include #include +#include "putty.h" #include "ssh.h" #include "misc.h" #include "tree234.h" @@ -59,6 +60,23 @@ static char *putty_path; #define PUTTY_DEFAULT "Default%20Settings" static int initial_menuitems_count; +/* + * Print a modal (Really Bad) message box and perform a fatal exit. + */ +void modalfatalbox(char *fmt, ...) +{ + va_list ap; + char *buf; + + va_start(ap, fmt); + buf = dupvprintf(fmt, ap); + va_end(ap); + MessageBox(main_hwnd, buf, "Pageant Fatal Error", + MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); + sfree(buf); + exit(1); +} + /* Un-munge session names out of the registry. */ static void unmungestr(char *in, char *out, int outlen) { @@ -110,24 +128,6 @@ static void *get_keylist1(void); static void *get_keylist2(void); /* - * We need this to link with the RSA code, because rsaencrypt() - * pads its data with random bytes. Since we only use rsadecrypt() - * and the signing functions, which are deterministic, this should - * never be called. - * - * If it _is_ called, there is a _serious_ problem, because it - * won't generate true random numbers. So we must scream, panic, - * and exit immediately if that should happen. - */ -int random_byte(void) -{ - MessageBox(main_hwnd, "Internal Error", APPNAME, MB_OK | MB_ICONERROR); - exit(0); - /* this line can't be reached but it placates MSVC's warnings :-) */ - return 0; -} - -/* * Blob structure for passing to the asymmetric SSH2 key compare * function, prototyped here. */ @@ -137,14 +137,6 @@ struct blob { }; static int cmpkeys_ssh2_asymm(void *av, void *bv); -/* - * This function is needed to link with the DES code. We need not - * have it do anything at all. - */ -void logevent(char *msg) -{ -} - #define GET_32BIT(cp) \ (((unsigned long)(unsigned char)(cp)[0] << 24) | \ ((unsigned long)(unsigned char)(cp)[1] << 16) | \ @@ -221,7 +213,7 @@ static int CALLBACK AboutProc(HWND hwnd, UINT msg, return 0; case 101: EnableWindow(hwnd, 0); - DialogBox(instance, MAKEINTRESOURCE(214), NULL, LicenceProc); + DialogBox(instance, MAKEINTRESOURCE(214), hwnd, LicenceProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); return 0; @@ -381,7 +373,7 @@ static void keylist_update(void) /* * This function loads a key from a file and adds it. */ -static void add_keyfile(char *filename) +static void add_keyfile(Filename filename) { char passphrase[PASSPHRASE_MAXLEN]; struct RSAKey *rkey = NULL; @@ -394,7 +386,7 @@ static void add_keyfile(char *filename) int type; int original_pass; - type = key_type(filename); + type = key_type(&filename); if (type != SSH_KEYTYPE_SSH1 && type != SSH_KEYTYPE_SSH2) { char msg[256]; sprintf(msg, "Couldn't load this key (%s)", key_type_to_str(type)); @@ -412,7 +404,7 @@ static void add_keyfile(char *filename) int i, nkeys, bloblen; if (type == SSH_KEYTYPE_SSH1) { - if (!rsakey_pubblob(filename, &blob, &bloblen)) { + if (!rsakey_pubblob(&filename, &blob, &bloblen)) { MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); return; @@ -420,7 +412,7 @@ static void add_keyfile(char *filename) keylist = get_keylist1(); } else { unsigned char *blob2; - blob = ssh2_userkey_loadpub(filename, NULL, &bloblen); + blob = ssh2_userkey_loadpub(&filename, NULL, &bloblen); if (!blob) { MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); @@ -462,9 +454,9 @@ static void add_keyfile(char *filename) } if (type == SSH_KEYTYPE_SSH1) - needs_pass = rsakey_encrypted(filename, &comment); + needs_pass = rsakey_encrypted(&filename, &comment); else - needs_pass = ssh2_userkey_encrypted(filename, &comment); + needs_pass = ssh2_userkey_encrypted(&filename, &comment); attempts = 0; if (type == SSH_KEYTYPE_SSH1) rkey = smalloc(sizeof(*rkey)); @@ -494,9 +486,9 @@ static void add_keyfile(char *filename) } else *passphrase = '\0'; if (type == SSH_KEYTYPE_SSH1) - ret = loadrsakey(filename, rkey, passphrase); + ret = loadrsakey(&filename, rkey, passphrase); else { - skey = ssh2_load_userkey(filename, passphrase); + skey = ssh2_load_userkey(&filename, passphrase); if (skey == SSH2_WRONG_PASSPHRASE) ret = -1; else if (!skey) @@ -607,7 +599,7 @@ static void add_keyfile(char *filename) agent_query(request, reqlen, &vresponse, &resplen); response = vresponse; if (resplen < 5 || response[4] != SSH_AGENT_SUCCESS) - MessageBox(NULL, "The already running Pageant" + MessageBox(NULL, "The already running Pageant " "refused to add the key.", APPNAME, MB_OK | MB_ICONERROR); @@ -1241,7 +1233,8 @@ static void prompt_add_keyfile(void) of.lStructSize = sizeof(of); #endif of.hwndOwner = main_hwnd; - of.lpstrFilter = "PuTTY Private Key Files\0*.PPK\0AllFiles\0*\0\0\0"; + of.lpstrFilter = "PuTTY Private Key Files (*.ppk)\0*.ppk\0" + "All Files (*.*)\0*\0\0\0"; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filelist; @@ -1254,7 +1247,7 @@ static void prompt_add_keyfile(void) if (GetOpenFileName(&of)) { if(strlen(filelist) > of.nFileOffset) /* Only one filename returned? */ - add_keyfile(filelist); + add_keyfile(filename_from_str(filelist)); else { /* we are returned a bunch of strings, end to * end. first string is the directory, the @@ -1282,7 +1275,7 @@ static void prompt_add_keyfile(void) memcpy(filename + dirlen, filewalker, n); filewalker += n; - add_keyfile(filename); + add_keyfile(filename_from_str(filename)); } } @@ -1596,14 +1589,17 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, keylist = CreateDialog(instance, MAKEINTRESOURCE(211), NULL, KeyListProc); ShowWindow(keylist, SW_SHOWNORMAL); - /* - * Sometimes the window comes up minimised / hidden - * for no obvious reason. Prevent this. - */ - SetForegroundWindow(keylist); - SetWindowPos(keylist, HWND_TOP, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); } + /* + * Sometimes the window comes up minimised / hidden for + * no obvious reason. Prevent this. This also brings it + * to the front if it's already present (the user + * selected View Keys because they wanted to _see_ the + * thing). + */ + SetForegroundWindow(keylist); + SetWindowPos(keylist, HWND_TOP, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); break; case IDM_ADDKEY: if (passphrase_box) { @@ -1770,10 +1766,11 @@ void spawn_cmd(char *cmdline, char * args, int show) { if (ShellExecute(NULL, _T("open"), cmdline, args, NULL, show) <= (HINSTANCE) 32) { - TCHAR sMsg[140]; - sprintf(sMsg, _T("Failed to run \"%.100s\", Error: %d"), cmdline, - (int)GetLastError()); - MessageBox(NULL, sMsg, APPNAME, MB_OK | MB_ICONEXCLAMATION); + char *msg; + msg = dupprintf("Failed to run \"%.100s\", Error: %d", cmdline, + (int)GetLastError()); + MessageBox(NULL, msg, APPNAME, MB_OK | MB_ICONEXCLAMATION); + sfree(msg); } } @@ -1933,6 +1930,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) } /* + * Initialise the random number generator. + */ + random_init(); + + /* * Initialise storage for short-term passphrase cache. */ passphrases = newtree234(NULL); @@ -1954,7 +1956,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) command = ""; break; } else { - add_keyfile(argv[i]); + add_keyfile(filename_from_str(argv[i])); added_keys = TRUE; } } @@ -1997,8 +1999,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) * Main message loop. */ while (GetMessage(&msg, NULL, 0, 0) == 1) { - TranslateMessage(&msg); - DispatchMessage(&msg); + if (!(IsWindow(keylist) && IsDialogMessage(keylist, &msg)) && + !(IsWindow(aboutbox) && IsDialogMessage(aboutbox, &msg))) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } } /* Clean up the system tray icon */