#include <assert.h>
#include <tchar.h>
+#define PUTTY_DO_GLOBALS
+
#include "putty.h"
#include "ssh.h"
#include "misc.h"
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
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);
*/
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;
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;
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;
}
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 */
sfree(blob);
}
+ error = NULL;
if (type == SSH_KEYTYPE_SSH1)
needs_pass = rsakey_encrypted(&filename, &comment);
else
} else {
int dlgret;
original_pass = 1;
- dlgret = DialogBoxParam(instance, MAKEINTRESOURCE(210),
- NULL, PassphraseProc, (LPARAM) & pps);
+ dlgret = DialogBoxParam(hinst, MAKEINTRESOURCE(210),
+ NULL, PassphraseProc, (LPARAM) &pps);
passphrase_box = NULL;
if (!dlgret) {
if (comment)
} 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)
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;
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));
* 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;
}
}
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;
}
case WM_HELP:
if (help_path) {
int id = ((LPHELPINFO)lParam)->iCtrlId;
- char *cmd = NULL;
+ char *topic = NULL;
switch (id) {
- case 100: cmd = "JI(`',`pageant.keylist')"; break;
- case 101: cmd = "JI(`',`pageant.addkey')"; break;
- case 102: cmd = "JI(`',`pageant.remkey')"; break;
+ case 100: topic = "pageant.keylist"; break;
+ case 101: topic = "pageant.addkey"; break;
+ case 102: topic = "pageant.remkey"; break;
}
- if (cmd) {
- WinHelp(main_hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
+ if (topic) {
+ char *cmd = dupprintf("JI(`',`%s')", topic);
+ WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
+ sfree(cmd);
requested_help = TRUE;
} else {
MessageBeep(0);
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);
GetCursorPos(&cursorpos);
PostMessage(hwnd, WM_SYSTRAY2, cursorpos.x, cursorpos.y);
} else if (lParam == WM_LBUTTONDBLCLK) {
- /* Equivalent to IDM_VIEWKEYS. */
- PostMessage(hwnd, WM_COMMAND, IDM_VIEWKEYS, 0);
+ /* Run the default menu item. */
+ UINT menuitem = GetMenuDefaultItem(systray_menu, FALSE, 0);
+ if (menuitem != -1)
+ PostMessage(hwnd, WM_COMMAND, menuitem, 0);
}
break;
case WM_SYSTRAY2:
break;
case IDM_VIEWKEYS:
if (!keylist) {
- keylist = CreateDialog(instance, MAKEINTRESOURCE(211),
+ keylist = CreateDialog(hinst, MAKEINTRESOURCE(211),
NULL, KeyListProc);
ShowWindow(keylist, SW_SHOWNORMAL);
}
break;
case IDM_ABOUT:
if (!aboutbox) {
- aboutbox = CreateDialog(instance, MAKEINTRESOURCE(213),
+ aboutbox = CreateDialog(hinst, MAKEINTRESOURCE(213),
NULL, AboutProc);
ShowWindow(aboutbox, SW_SHOWNORMAL);
/*
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;
}
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);
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).
} else
advapi = NULL;
- instance = inst;
-
/*
* See if we can find our Help file.
*/
if (p && p >= r) r = p+1;
q = strrchr(b, ':');
if (q && q >= r) r = q+1;
- strcpy(r, "putty.hlp");
+ strcpy(r, PUTTY_HELP_FILE);
if ( (fp = fopen(b, "r")) != NULL) {
help_path = dupstr(b);
fclose(fp);
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();
AppendMenu(systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit");
initial_menuitems_count = GetMenuItemCount(session_menu);
- ShowWindow(main_hwnd, SW_HIDE);
+ /* Set the default menu item. */
+ SetMenuDefaultItem(systray_menu, IDM_VIEWKEYS, FALSE);
+
+ ShowWindow(hwnd, SW_HIDE);
/*
* Initialise storage for RSA keys.
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
- tnid.hWnd = main_hwnd;
+ tnid.hWnd = hwnd;
tnid.uID = 1;
Shell_NotifyIcon(NIM_DELETE, &tnid);
DestroyMenu(systray_menu);
}
+ if (keypath) filereq_free(keypath);
+
if (advapi)
FreeLibrary(advapi);
return msg.wParam;