]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - windows/winpgnt.c
Fix for `pageant-dirhandle': a new wrapper functions `request_file()' maintains
[PuTTY.git] / windows / winpgnt.c
index 9f43bbf7079c3122dd3df96a17ce2e43f6e3b553..0786f7a6df12de047805d92b683f4ca8ca89c673 100644 (file)
@@ -59,6 +59,9 @@ 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
@@ -402,6 +405,7 @@ static void add_keyfile(Filename filename)
     int ret;
     int attempts;
     char *comment;
+    const char *error = NULL;
     struct PassphraseProcStruct pps;
     int type;
     int original_pass;
@@ -424,18 +428,20 @@ 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);
+               MessageBox(NULL, msg, APPNAME, MB_OK | MB_ICONERROR);
+               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);
+               MessageBox(NULL, msg, APPNAME, MB_OK | MB_ICONERROR);
+               sfree(msg);
                return;
            }
            /* For our purposes we want the blob prefixed with its length */
@@ -515,6 +521,7 @@ static void add_keyfile(Filename filename)
        sfree(blob);
     }
 
+    error = NULL;
     if (type == SSH_KEYTYPE_SSH1)
        needs_pass = rsakey_encrypted(&filename, &comment);
     else
@@ -548,9 +555,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 +577,9 @@ 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);
+       MessageBox(NULL, msg, APPNAME, MB_OK | MB_ICONERROR);
+       sfree(msg);
        if (type == SSH_KEYTYPE_SSH1)
            sfree(rkey);
        return;
@@ -1405,30 +1413,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.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 +1437,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;
            }
        }
 
@@ -2218,6 +2202,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;