Wez Furlong's patch to add xterm mouse reporting and proper mouse
[u/mdw/putty] / pageant.c
index acbc4ae..50ac337 100644 (file)
--- a/pageant.c
+++ b/pageant.c
@@ -56,6 +56,12 @@ static gsi_fn_t getsecurityinfo;
 #endif
 
 /*
+ * Exports from pageantc.c
+ */
+void agent_query(void *in, int inlen, void **out, int *outlen);
+int agent_exists(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
@@ -164,7 +170,7 @@ static int CALLBACK AboutProc (HWND hwnd, UINT msg,
  */
 static int CALLBACK PassphraseProc(HWND hwnd, UINT msg,
                                    WPARAM wParam, LPARAM lParam) {
-    static char *passphrase;
+    static char *passphrase = NULL;
     struct PassphraseProcStruct *p;
 
     switch (msg) {
@@ -191,6 +197,7 @@ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg,
         if (p->comment)
             SetDlgItemText(hwnd, 101, p->comment);
         *passphrase = 0;
+        SetDlgItemText (hwnd, 102, passphrase);
         return 0;
       case WM_COMMAND:
        switch (LOWORD(wParam)) {
@@ -204,7 +211,7 @@ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg,
            EndDialog (hwnd, 0);
            return 0;
           case 102:                    /* edit box */
-           if (HIWORD(wParam) == EN_CHANGE) {
+           if ((HIWORD(wParam) == EN_CHANGE) && passphrase) {
                 GetDlgItemText (hwnd, 102, passphrase, PASSPHRASE_MAXLEN-1);
                 passphrase[PASSPHRASE_MAXLEN-1] = '\0';
             }
@@ -224,11 +231,11 @@ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg,
 static void keylist_update(void) {
     struct RSAKey *rkey;
     struct ssh2_userkey *skey;
-    enum234 e;
+    int i;
 
     if (keylist) {
         SendDlgItemMessage(keylist, 100, LB_RESETCONTENT, 0, 0);
-        for (rkey = first234(rsakeys, &e); rkey; rkey = next234(&e)) {
+        for (i = 0; NULL != (rkey = index234(rsakeys, i)); i++) {
             char listentry[512], *p;
             /*
              * Replace two spaces in the fingerprint with tabs, for
@@ -242,7 +249,7 @@ static void keylist_update(void) {
             SendDlgItemMessage (keylist, 100, LB_ADDSTRING,
                                 0, (LPARAM)listentry);
         }
-        for (skey = first234(ssh2keys, &e); skey; skey = next234(&e)) {
+        for (i = 0; NULL != (skey = index234(ssh2keys, i)); i++) {
             char listentry[512], *p;
            int len;
             /*
@@ -438,15 +445,15 @@ static void answer_msg(void *msg) {
          * Reply with SSH1_AGENT_RSA_IDENTITIES_ANSWER.
          */
         {
-            enum234 e;
             struct RSAKey *key;
             int len, nkeys;
+           int i;
 
             /*
              * Count up the number and length of keys we hold.
              */
             len = nkeys = 0;
-            for (key = first234(rsakeys, &e); key; key = next234(&e)) {
+            for (i = 0; NULL != (key = index234(rsakeys, i)); i++) {
                 nkeys++;
                 len += 4;              /* length field */
                 len += ssh1_bignum_length(key->exponent);
@@ -465,7 +472,7 @@ static void answer_msg(void *msg) {
             ret[4] = SSH1_AGENT_RSA_IDENTITIES_ANSWER;
             PUT_32BIT(ret+5, nkeys);
             p = ret + 5 + 4;
-            for (key = first234(rsakeys, &e); key; key = next234(&e)) {
+            for (i = 0; NULL != (key = index234(rsakeys, i)); i++) {
                 PUT_32BIT(p, bignum_bitcount(key->modulus));
                 p += 4;
                 p += ssh1_write_bignum(p, key->exponent);
@@ -481,17 +488,17 @@ static void answer_msg(void *msg) {
          * Reply with SSH2_AGENT_IDENTITIES_ANSWER.
          */
         {
-            enum234 e;
             struct ssh2_userkey *key;
             int len, nkeys;
            unsigned char *blob;
            int bloblen;
+           int i;
 
             /*
              * Count up the number and length of keys we hold.
              */
             len = nkeys = 0;
-            for (key = first234(ssh2keys, &e); key; key = next234(&e)) {
+            for (i = 0; NULL != (key = index234(ssh2keys, i)); i++) {
                 nkeys++;
                 len += 4;              /* length field */
                blob = key->alg->public_blob(key->data, &bloblen);
@@ -511,7 +518,7 @@ static void answer_msg(void *msg) {
             ret[4] = SSH2_AGENT_IDENTITIES_ANSWER;
             PUT_32BIT(ret+5, nkeys);
             p = ret + 5 + 4;
-            for (key = first234(ssh2keys, &e); key; key = next234(&e)) {
+            for (i = 0; NULL != (key = index234(ssh2keys, i)); i++) {
                blob = key->alg->public_blob(key->data, &bloblen);
                 PUT_32BIT(p, bloblen);
                 p += 4;
@@ -743,9 +750,8 @@ static void answer_msg(void *msg) {
          */
         {
            struct RSAKey *rkey;
-           enum234 e;
 
-            while ( (rkey = first234(rsakeys, &e)) != NULL ) {
+            while ( (rkey = index234(rsakeys, 0)) != NULL ) {
                 del234(rsakeys, rkey);
                freersakey(rkey);
                sfree(rkey);
@@ -762,9 +768,8 @@ static void answer_msg(void *msg) {
          */
         {
             struct ssh2_userkey *skey;
-           enum234 e;
 
-            while ( (skey = first234(ssh2keys, &e)) != NULL ) {
+            while ( (skey = index234(ssh2keys, 0)) != NULL ) {
                 del234(ssh2keys, skey);
                skey->alg->freekey(skey->data);
                sfree(skey);
@@ -925,7 +930,6 @@ static void prompt_add_keyfile(void) {
  */
 static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
                                 WPARAM wParam, LPARAM lParam) {
-    enum234 e;
     struct RSAKey *rkey;
     struct ssh2_userkey *skey;
 
@@ -970,11 +974,12 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
            if (HIWORD(wParam) == BN_CLICKED ||
                HIWORD(wParam) == BN_DOUBLECLICKED) {
                int n = SendDlgItemMessage (hwnd, 100, LB_GETCURSEL, 0, 0);
+               int i;
                if (n == LB_ERR) {
                    MessageBeep(0);
                    break;
                }
-                for (rkey = first234(rsakeys, &e); rkey; rkey = next234(&e))
+                for (i = 0; NULL != (rkey = index234(rsakeys, i)); i++)
                     if (n-- == 0)
                         break;
                if (rkey) {
@@ -982,7 +987,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
                    freersakey(rkey);
                    sfree(rkey);
                } else {
-                   for (skey = first234(ssh2keys, &e); skey; skey = next234(&e))
+                   for (i = 0; NULL != (skey = index234(ssh2keys, i)); i++)
                        if (n-- == 0)
                            break;
                    if (skey) {
@@ -1090,11 +1095,11 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
             if (mapname[cds->cbData - 1] != '\0')
                 return 0;              /* failure to be ASCIZ! */
 #ifdef DEBUG_IPC
-            debug(("mapname is :%s:\r\n", mapname));
+            debug(("mapname is :%s:\n", mapname));
 #endif
             filemap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, mapname);
 #ifdef DEBUG_IPC
-            debug(("filemap is %p\r\n", filemap));
+            debug(("filemap is %p\n", filemap));
 #endif
             if (filemap != NULL && filemap != INVALID_HANDLE_VALUE) {
                 int rc;
@@ -1103,7 +1108,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
                     if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE,
                                             GetCurrentProcessId())) == NULL) {
 #ifdef DEBUG_IPC
-                        debug(("couldn't get handle for process\r\n"));
+                        debug(("couldn't get handle for process\n"));
 #endif
                         return 0;
                     }
@@ -1112,7 +1117,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
                                         &procowner, NULL, NULL, NULL,
                                         &psd2) != ERROR_SUCCESS) {
 #ifdef DEBUG_IPC
-                        debug(("couldn't get owner info for process\r\n"));
+                        debug(("couldn't get owner info for process\n"));
 #endif
                         CloseHandle(proc);
                         return 0;          /* unable to get security info */
@@ -1123,30 +1128,30 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
                                               &mapowner, NULL, NULL, NULL,
                                               &psd1) != ERROR_SUCCESS)) {
 #ifdef DEBUG_IPC
-                        debug(("couldn't get owner info for filemap: %d\r\n", rc));
+                        debug(("couldn't get owner info for filemap: %d\n", rc));
 #endif
                         return 0;
                     }
 #ifdef DEBUG_IPC
-                    debug(("got security stuff\r\n"));
+                    debug(("got security stuff\n"));
 #endif
                     if (!EqualSid(mapowner, procowner))
                         return 0;          /* security ID mismatch! */
 #ifdef DEBUG_IPC
-                    debug(("security stuff matched\r\n"));
+                    debug(("security stuff matched\n"));
 #endif
                     LocalFree(psd1);
                     LocalFree(psd2);
                 } else {
 #ifdef DEBUG_IPC
-                    debug(("security APIs not present\r\n"));
+                    debug(("security APIs not present\n"));
 #endif
                 }
 #endif
                 p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0);
 #ifdef DEBUG_IPC
-                debug(("p is %p\r\n", p));
-                {int i; for(i=0;i<5;i++)debug(("p[%d]=%02x\r\n", i, ((unsigned char *)p)[i]));}
+                debug(("p is %p\n", p));
+                {int i; for(i=0;i<5;i++)debug(("p[%d]=%02x\n", i, ((unsigned char *)p)[i]));}
 #endif
                 answer_msg(p);
                 ret = 1;
@@ -1222,7 +1227,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
      * Find out if Pageant is already running.
      */
     already_running = FALSE;
-    if (FindWindow("Pageant", "Pageant"))
+    if (agent_exists())
        already_running = TRUE;
     else {