X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/a9dc49af0a2d35e897d1e4db25c4465667f5f6e3..8154b6022bd42b4aba03fc9adcbabd4f588b6575:/windows/winpgnt.c?ds=sidebyside diff --git a/windows/winpgnt.c b/windows/winpgnt.c index 9f43bbf7..e128949c 100644 --- a/windows/winpgnt.c +++ b/windows/winpgnt.c @@ -8,6 +8,8 @@ #include #include +#define PUTTY_DO_GLOBALS + #include "putty.h" #include "ssh.h" #include "misc.h" @@ -48,17 +50,16 @@ extern char ver[]; -static HINSTANCE instance; -static HWND main_hwnd; static HWND keylist; static HWND aboutbox; static HMENU systray_menu, session_menu; static int already_running; -static int requested_help; -char *help_path; static char *putty_path; +/* CWD for "add key" file requester. */ +static filereq *keypath = NULL; + #define IDM_PUTTY 0x0060 #define IDM_SESSIONS_BASE 0x1000 #define IDM_SESSIONS_MAX 0x2000 @@ -77,7 +78,7 @@ void modalfatalbox(char *fmt, ...) va_start(ap, fmt); buf = dupvprintf(fmt, ap); va_end(ap); - MessageBox(main_hwnd, buf, "Pageant Fatal Error", + MessageBox(hwnd, buf, "Pageant Fatal Error", MB_SYSTEMMODAL | MB_ICONERROR | MB_OK); sfree(buf); exit(1); @@ -139,7 +140,7 @@ static void *get_keylist2(int *length); */ int random_byte(void) { - MessageBox(main_hwnd, "Internal Error", APPNAME, MB_OK | MB_ICONERROR); + MessageBox(hwnd, "Internal Error", APPNAME, MB_OK | MB_ICONERROR); exit(0); /* this line can't be reached but it placates MSVC's warnings :-) */ return 0; @@ -233,7 +234,7 @@ static int CALLBACK AboutProc(HWND hwnd, UINT msg, return 0; case 101: EnableWindow(hwnd, 0); - DialogBox(instance, MAKEINTRESOURCE(214), hwnd, LicenceProc); + DialogBox(hinst, MAKEINTRESOURCE(214), hwnd, LicenceProc); EnableWindow(hwnd, 1); SetActiveWindow(hwnd); return 0; @@ -402,15 +403,18 @@ static void add_keyfile(Filename filename) int ret; int attempts; char *comment; + const char *error = NULL; struct PassphraseProcStruct pps; int type; int original_pass; 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)); - MessageBox(NULL, msg, APPNAME, MB_OK | MB_ICONERROR); + char *msg = dupprintf("Couldn't load this key (%s)", + key_type_to_str(type)); + message_box(msg, APPNAME, MB_OK | MB_ICONERROR, + HELPCTXID(errors_cantloadkey)); + sfree(msg); return; } @@ -424,18 +428,22 @@ static void add_keyfile(Filename filename) int i, nkeys, bloblen, keylistlen; if (type == SSH_KEYTYPE_SSH1) { - if (!rsakey_pubblob(&filename, &blob, &bloblen, NULL)) { - MessageBox(NULL, "Couldn't load private key.", APPNAME, - MB_OK | MB_ICONERROR); + if (!rsakey_pubblob(&filename, &blob, &bloblen, &error)) { + char *msg = dupprintf("Couldn't load private key (%s)", error); + message_box(msg, APPNAME, MB_OK | MB_ICONERROR, + HELPCTXID(errors_cantloadkey)); + sfree(msg); return; } keylist = get_keylist1(&keylistlen); } else { unsigned char *blob2; - blob = ssh2_userkey_loadpub(&filename, NULL, &bloblen, NULL); + blob = ssh2_userkey_loadpub(&filename, NULL, &bloblen, &error); if (!blob) { - MessageBox(NULL, "Couldn't load private key.", APPNAME, - MB_OK | MB_ICONERROR); + char *msg = dupprintf("Couldn't load private key (%s)", error); + message_box(msg, APPNAME, MB_OK | MB_ICONERROR, + HELPCTXID(errors_cantloadkey)); + sfree(msg); return; } /* For our purposes we want the blob prefixed with its length */ @@ -515,6 +523,7 @@ static void add_keyfile(Filename filename) sfree(blob); } + error = NULL; if (type == SSH_KEYTYPE_SSH1) needs_pass = rsakey_encrypted(&filename, &comment); else @@ -534,7 +543,7 @@ static void add_keyfile(Filename filename) } else { int dlgret; original_pass = 1; - dlgret = DialogBoxParam(instance, MAKEINTRESOURCE(210), + dlgret = DialogBoxParam(hinst, MAKEINTRESOURCE(210), NULL, PassphraseProc, (LPARAM) & pps); passphrase_box = NULL; if (!dlgret) { @@ -548,9 +557,9 @@ static void add_keyfile(Filename filename) } else *passphrase = '\0'; if (type == SSH_KEYTYPE_SSH1) - ret = loadrsakey(&filename, rkey, passphrase, NULL); + ret = loadrsakey(&filename, rkey, passphrase, &error); else { - skey = ssh2_load_userkey(&filename, passphrase, NULL); + skey = ssh2_load_userkey(&filename, passphrase, &error); if (skey == SSH2_WRONG_PASSPHRASE) ret = -1; else if (!skey) @@ -570,8 +579,10 @@ static void add_keyfile(Filename filename) if (comment) sfree(comment); if (ret == 0) { - MessageBox(NULL, "Couldn't load private key.", APPNAME, - MB_OK | MB_ICONERROR); + char *msg = dupprintf("Couldn't load private key (%s)", error); + message_box(msg, APPNAME, MB_OK | MB_ICONERROR, + HELPCTXID(errors_cantloadkey)); + sfree(msg); if (type == SSH_KEYTYPE_SSH1) sfree(rkey); return; @@ -1405,30 +1416,21 @@ static int cmpkeys_ssh2_asymm(void *av, void *bv) static void prompt_add_keyfile(void) { OPENFILENAME of; - char filename[FILENAME_MAX]; char *filelist = snewn(8192, char); - char *filewalker; - int n, dirlen; + if (!keypath) keypath = filereq_new(); memset(&of, 0, sizeof(of)); -#ifdef OPENFILENAME_SIZE_VERSION_400 - of.lStructSize = OPENFILENAME_SIZE_VERSION_400; -#else - of.lStructSize = sizeof(of); -#endif - of.hwndOwner = main_hwnd; - of.lpstrFilter = "PuTTY Private Key Files (*.ppk)\0*.ppk\0" - "All Files (*.*)\0*\0\0\0"; + of.hwndOwner = hwnd; + of.lpstrFilter = FILTER_KEY_FILES; of.lpstrCustomFilter = NULL; of.nFilterIndex = 1; of.lpstrFile = filelist; *filelist = '\0'; - of.nMaxFile = FILENAME_MAX; + of.nMaxFile = 8192; of.lpstrFileTitle = NULL; - of.lpstrInitialDir = NULL; of.lpstrTitle = "Select Private Key File"; of.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER; - if (GetOpenFileName(&of)) { + if (request_file(keypath, &of, TRUE, FALSE)) { if(strlen(filelist) > of.nFileOffset) /* Only one filename returned? */ add_keyfile(filename_from_str(filelist)); @@ -1438,28 +1440,13 @@ static void prompt_add_keyfile(void) * rest the filenames. terminated with an * empty string. */ - filewalker = filelist; - dirlen = strlen(filewalker); - if(dirlen > FILENAME_MAX - 8) return; - memcpy(filename, filewalker, dirlen); - - filewalker += dirlen + 1; - filename[dirlen++] = '\\'; - - /* then go over names one by one */ - for(;;) { - n = strlen(filewalker) + 1; - /* end of the list */ - if(n == 1) - break; - /* too big, shouldn't happen */ - if(n + dirlen > FILENAME_MAX) - break; - - memcpy(filename + dirlen, filewalker, n); - filewalker += n; - + char *dir = filelist; + char *filewalker = filelist + strlen(dir) + 1; + while (*filewalker != '\0') { + char *filename = dupcat(dir, "\\", filewalker, NULL); add_keyfile(filename_from_str(filename)); + sfree(filename); + filewalker += strlen(filewalker) + 1; } } @@ -1597,7 +1584,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { if (help_path) { - WinHelp(main_hwnd, help_path, HELP_COMMAND, + WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)"JI(`',`pageant.general')"); requested_help = TRUE; } @@ -1616,7 +1603,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, } if (topic) { char *cmd = dupprintf("JI(`',`%s')", topic); - WinHelp(main_hwnd, help_path, HELP_COMMAND, (DWORD)cmd); + WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); sfree(cmd); requested_help = TRUE; } else { @@ -1649,7 +1636,7 @@ static BOOL AddTrayIcon(HWND hwnd) tnid.uID = 1; /* unique within this systray use */ tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnid.uCallbackMessage = WM_SYSTRAY; - tnid.hIcon = hicon = LoadIcon(instance, MAKEINTRESOURCE(201)); + tnid.hIcon = hicon = LoadIcon(hinst, MAKEINTRESOURCE(201)); strcpy(tnid.szTip, "Pageant (PuTTY authentication agent)"); res = Shell_NotifyIcon(NIM_ADD, &tnid); @@ -1774,7 +1761,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, break; case IDM_VIEWKEYS: if (!keylist) { - keylist = CreateDialog(instance, MAKEINTRESOURCE(211), + keylist = CreateDialog(hinst, MAKEINTRESOURCE(211), NULL, KeyListProc); ShowWindow(keylist, SW_SHOWNORMAL); } @@ -1799,7 +1786,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, break; case IDM_ABOUT: if (!aboutbox) { - aboutbox = CreateDialog(instance, MAKEINTRESOURCE(213), + aboutbox = CreateDialog(hinst, MAKEINTRESOURCE(213), NULL, AboutProc); ShowWindow(aboutbox, SW_SHOWNORMAL); /* @@ -1813,7 +1800,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, break; case IDM_HELP: if (help_path) { - WinHelp(main_hwnd, help_path, HELP_COMMAND, + WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)"JI(`',`pageant.general')"); requested_help = TRUE; } @@ -1844,7 +1831,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, break; case WM_DESTROY: if (requested_help) { - WinHelp(main_hwnd, help_path, HELP_QUIT, 0); + WinHelp(hwnd, help_path, HELP_QUIT, 0); requested_help = FALSE; } PostQuitMessage(0); @@ -1986,6 +1973,9 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) int argc, i; char **argv, **argstart; + hinst = inst; + hwnd = NULL; + /* * Determine whether we're an NT system (should have security * APIs) or a non-NT system (don't do security). @@ -2024,8 +2014,6 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) } else advapi = NULL; - instance = inst; - /* * See if we can find our Help file. */ @@ -2090,15 +2078,15 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) RegisterClass(&wndclass); } - main_hwnd = keylist = NULL; + keylist = NULL; - main_hwnd = CreateWindow(APPNAME, APPNAME, - WS_OVERLAPPEDWINDOW | WS_VSCROLL, - CW_USEDEFAULT, CW_USEDEFAULT, - 100, 100, NULL, NULL, inst, NULL); + hwnd = CreateWindow(APPNAME, APPNAME, + WS_OVERLAPPEDWINDOW | WS_VSCROLL, + CW_USEDEFAULT, CW_USEDEFAULT, + 100, 100, NULL, NULL, inst, NULL); /* Set up a system tray icon */ - AddTrayIcon(main_hwnd); + AddTrayIcon(hwnd); /* Accelerators used: nsvkxa */ systray_menu = CreatePopupMenu(); @@ -2123,7 +2111,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) /* Set the default menu item. */ SetMenuDefaultItem(systray_menu, IDM_VIEWKEYS, FALSE); - ShowWindow(main_hwnd, SW_HIDE); + ShowWindow(hwnd, SW_HIDE); /* * Initialise storage for RSA keys. @@ -2210,7 +2198,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); - tnid.hWnd = main_hwnd; + tnid.hWnd = hwnd; tnid.uID = 1; Shell_NotifyIcon(NIM_DELETE, &tnid); @@ -2218,6 +2206,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) DestroyMenu(systray_menu); } + if (keypath) filereq_free(keypath); + if (advapi) FreeLibrary(advapi); return msg.wParam;