X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=pageant.c;h=888dd430b84e20ec887fb13a9e5681490ab1dcd7;hb=9b15a8010102fc83dcd7eef78014a65f11619d63;hp=e368a682be9a5243948aaa6b0513fd7f7d781c3c;hpb=b8967e5231dd59c7cfc6995811a5a0d9eee93df7;p=PuTTY.git diff --git a/pageant.c b/pageant.c index e368a682..888dd430 100644 --- a/pageant.c +++ b/pageant.c @@ -7,6 +7,8 @@ #include #endif #include +#include +#include #include "ssh.h" #include "tree234.h" @@ -26,7 +28,8 @@ #define IDM_CLOSE 0x0010 #define IDM_VIEWKEYS 0x0020 -#define IDM_ABOUT 0x0030 +#define IDM_ADDKEY 0x0030 +#define IDM_ABOUT 0x0040 #define APPNAME "Pageant" @@ -161,6 +164,9 @@ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg, switch (msg) { case WM_INITDIALOG: + SetForegroundWindow(hwnd); + SetWindowPos (hwnd, HWND_TOP, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); p = (struct PassphraseProcStruct *)lParam; passphrase = p->passphrase; if (p->comment) @@ -232,7 +238,7 @@ static void add_keyfile(char *filename) { needs_pass = rsakey_encrypted(filename, &comment); attempts = 0; - key = malloc(sizeof(*key)); + key = smalloc(sizeof(*key)); pps.passphrase = passphrase; pps.comment = comment; do { @@ -242,24 +248,24 @@ static void add_keyfile(char *filename) { NULL, PassphraseProc, (LPARAM)&pps); if (!dlgret) { - if (comment) free(comment); - free(key); + if (comment) sfree(comment); + sfree(key); return; /* operation cancelled */ } } else *passphrase = '\0'; - ret = loadrsakey(filename, key, passphrase); + ret = loadrsakey(filename, key, NULL, passphrase); attempts++; } while (ret == -1); - if (comment) free(comment); + if (comment) sfree(comment); if (ret == 0) { MessageBox(NULL, "Couldn't load private key.", APPNAME, MB_OK | MB_ICONERROR); - free(key); + sfree(key); return; } if (add234(rsakeys, key) != key) - free(key); /* already present, don't waste RAM */ + sfree(key); /* already present, don't waste RAM */ } /* @@ -376,14 +382,14 @@ static void answer_msg(void *msg) { { struct RSAKey *key; char *comment; - key = malloc(sizeof(struct RSAKey)); + key = smalloc(sizeof(struct RSAKey)); memset(key, 0, sizeof(key)); p += makekey(p, key, NULL, 1); p += makeprivate(p, key); p += ssh1_read_bignum(p, NULL); /* p^-1 mod q */ p += ssh1_read_bignum(p, NULL); /* p */ p += ssh1_read_bignum(p, NULL); /* q */ - comment = malloc(GET_32BIT(p)); + comment = smalloc(GET_32BIT(p)); if (comment) { memcpy(comment, p+4, GET_32BIT(p)); key->comment = comment; @@ -395,7 +401,7 @@ static void answer_msg(void *msg) { ret[4] = SSH_AGENT_SUCCESS; } else { freersakey(key); - free(key); + sfree(key); } } break; @@ -470,6 +476,34 @@ static void error(char *s) { MessageBox(hwnd, s, APPNAME, MB_OK | MB_ICONERROR); } +/* + * Prompt for a key file to add, and add it. + */ +static void prompt_add_keyfile(void) { + OPENFILENAME of; + char filename[FILENAME_MAX]; + memset(&of, 0, sizeof(of)); +#ifdef OPENFILENAME_SIZE_VERSION_400 + of.lStructSize = OPENFILENAME_SIZE_VERSION_400; +#else + of.lStructSize = sizeof(of); +#endif + of.hwndOwner = hwnd; + of.lpstrFilter = "All Files\0*\0\0\0"; + of.lpstrCustomFilter = NULL; + of.nFilterIndex = 1; + of.lpstrFile = filename; *filename = '\0'; + of.nMaxFile = sizeof(filename); + of.lpstrFileTitle = NULL; + of.lpstrInitialDir = NULL; + of.lpstrTitle = "Select Private Key File"; + of.Flags = 0; + if (GetOpenFileName(&of)) { + add_keyfile(filename); + keylist_update(); + } +} + /* * Dialog-box function for the key list box. */ @@ -477,8 +511,6 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { enum234 e; struct RSAKey *key; - OPENFILENAME of; - char filename[FILENAME_MAX]; switch (msg) { case WM_INITDIALOG: @@ -500,26 +532,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg, case 101: /* add key */ if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == BN_DOUBLECLICKED) { - memset(&of, 0, sizeof(of)); -#ifdef OPENFILENAME_SIZE_VERSION_400 - of.lStructSize = OPENFILENAME_SIZE_VERSION_400; -#else - of.lStructSize = sizeof(of); -#endif - of.hwndOwner = hwnd; - of.lpstrFilter = "All Files\0*\0\0\0"; - of.lpstrCustomFilter = NULL; - of.nFilterIndex = 1; - of.lpstrFile = filename; *filename = '\0'; - of.nMaxFile = sizeof(filename); - of.lpstrFileTitle = NULL; - of.lpstrInitialDir = NULL; - of.lpstrTitle = "Select Private Key File"; - of.Flags = 0; - if (GetOpenFileName(&of)) { - add_keyfile(filename); - keylist_update(); - } + prompt_add_keyfile(); } return 0; case 102: /* remove key */ @@ -595,6 +608,9 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); } break; + case IDM_ADDKEY: + prompt_add_keyfile(); + break; case IDM_ABOUT: if (!aboutbox) { aboutbox = CreateDialog (instance, MAKEINTRESOURCE(213), @@ -802,8 +818,9 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { DestroyIcon(hicon); systray_menu = CreatePopupMenu(); - /* accelerators used: vxa */ + /* accelerators used: vkxa */ AppendMenu (systray_menu, MF_ENABLED, IDM_VIEWKEYS, "&View Keys"); + AppendMenu (systray_menu, MF_ENABLED, IDM_ADDKEY, "Add &Key"); AppendMenu (systray_menu, MF_ENABLED, IDM_ABOUT, "&About"); AppendMenu (systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit"); }