Add ISO8859-2 / CP852 translation courtesy of Jaromir Filsak
[u/mdw/putty] / pageant.c
index c3a2a8a..e368a68 100644 (file)
--- a/pageant.c
+++ b/pageant.c
@@ -3,7 +3,9 @@
  */
 
 #include <windows.h>
+#ifndef NO_SECURITY
 #include <aclapi.h>
+#endif
 #include <stdio.h>
 #include "ssh.h"
 #include "tree234.h"
@@ -24,6 +26,7 @@
 
 #define IDM_CLOSE    0x0010
 #define IDM_VIEWKEYS 0x0020
+#define IDM_ABOUT    0x0030
 
 #define APPNAME "Pageant"
 
 #define SSH_AGENTC_ADD_RSA_IDENTITY          7
 #define SSH_AGENTC_REMOVE_RSA_IDENTITY       8
 
-HINSTANCE instance;
-HWND hwnd;
-HWND keylist;
-HMENU systray_menu;
+extern char ver[];
+
+static HINSTANCE instance;
+static HWND hwnd;
+static HWND keylist;
+static HWND aboutbox;
+static HMENU systray_menu;
 
-tree234 *rsakeys;
+static tree234 *rsakeys;
 
-int has_security;
+static int has_security;
+#ifndef NO_SECURITY
 typedef DWORD (WINAPI *gsi_fn_t)
     (HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION,
                                  PSID *, PSID *, PACL *, PACL *,
                                  PSECURITY_DESCRIPTOR *);
-gsi_fn_t getsecurityinfo;
+static gsi_fn_t getsecurityinfo;
+#endif
 
 /*
  * We need this to link with the RSA code, because rsaencrypt()
@@ -91,6 +99,59 @@ struct PassphraseProcStruct {
 };
 
 /*
+ * Dialog-box function for the Licence box.
+ */
+static int CALLBACK LicenceProc (HWND hwnd, UINT msg,
+                                WPARAM wParam, LPARAM lParam) {
+    switch (msg) {
+      case WM_INITDIALOG:
+       return 1;
+      case WM_COMMAND:
+       switch (LOWORD(wParam)) {
+         case IDOK:
+            EndDialog(hwnd, 1);
+           return 0;
+       }
+       return 0;
+      case WM_CLOSE:
+       EndDialog(hwnd, 1);
+       return 0;
+    }
+    return 0;
+}
+
+/*
+ * Dialog-box function for the About box.
+ */
+static int CALLBACK AboutProc (HWND hwnd, UINT msg,
+                              WPARAM wParam, LPARAM lParam) {
+    switch (msg) {
+      case WM_INITDIALOG:
+        SetDlgItemText (hwnd, 100, ver);
+       return 1;
+      case WM_COMMAND:
+       switch (LOWORD(wParam)) {
+         case IDOK:
+           aboutbox = NULL;
+           DestroyWindow (hwnd);
+           return 0;
+         case 101:
+           EnableWindow(hwnd, 0);
+           DialogBox (instance, MAKEINTRESOURCE(214), NULL, LicenceProc);
+           EnableWindow(hwnd, 1);
+            SetActiveWindow(hwnd);
+           return 0;
+       }
+       return 0;
+      case WM_CLOSE:
+       aboutbox = NULL;
+       DestroyWindow (hwnd);
+       return 0;
+    }
+    return 0;
+}
+
+/*
  * Dialog-box function for the passphrase box.
  */
 static int CALLBACK PassphraseProc(HWND hwnd, UINT msg,
@@ -135,7 +196,7 @@ static int CALLBACK PassphraseProc(HWND hwnd, UINT msg,
 /*
  * Update the visible key list.
  */
-void keylist_update(void) {
+static void keylist_update(void) {
     struct RSAKey *key;
     enum234 e;
 
@@ -160,7 +221,7 @@ void keylist_update(void) {
 /*
  * This function loads a key from a file and adds it.
  */
-void add_keyfile(char *filename) {
+static void add_keyfile(char *filename) {
     char passphrase[PASSPHRASE_MAXLEN];
     struct RSAKey *key;
     int needs_pass;
@@ -192,7 +253,7 @@ void add_keyfile(char *filename) {
     } while (ret == -1);
     if (comment) free(comment);
     if (ret == 0) {
-        MessageBox(NULL, "Couldn't load public key.", APPNAME,
+        MessageBox(NULL, "Couldn't load private key.", APPNAME,
                    MB_OK | MB_ICONERROR);
         free(key);
         return;
@@ -204,7 +265,7 @@ void add_keyfile(char *filename) {
 /*
  * This is the main agent function that answers messages.
  */
-void answer_msg(void *msg) {
+static void answer_msg(void *msg) {
     unsigned char *p = msg;
     unsigned char *ret = msg;
     int type;
@@ -375,7 +436,7 @@ void answer_msg(void *msg) {
 /*
  * Key comparison function for the 2-3-4 tree of RSA keys.
  */
-int cmpkeys(void *av, void *bv) {
+static int cmpkeys(void *av, void *bv) {
     struct RSAKey *a = (struct RSAKey *)av;
     struct RSAKey *b = (struct RSAKey *)bv;
     Bignum am, bm;
@@ -453,7 +514,7 @@ static int CALLBACK KeyListProc(HWND hwnd, UINT msg,
                 of.nMaxFile = sizeof(filename);
                 of.lpstrFileTitle = NULL;
                 of.lpstrInitialDir = NULL;
-                of.lpstrTitle = "Select Public Key File";
+                of.lpstrTitle = "Select Private Key File";
                 of.Flags = 0;
                 if (GetOpenFileName(&of)) {
                     add_keyfile(filename);
@@ -465,7 +526,7 @@ 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);
-               if (n == LB_ERR || n == 0) {
+               if (n == LB_ERR) {
                    MessageBeep(0);
                    break;
                }
@@ -534,6 +595,20 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
                               SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
             }
             break;
+          case IDM_ABOUT:
+            if (!aboutbox) {
+                aboutbox = CreateDialog (instance, MAKEINTRESOURCE(213),
+                                         NULL, AboutProc);
+                ShowWindow (aboutbox, SW_SHOWNORMAL);
+                /* 
+                 * Sometimes the window comes up minimised / hidden
+                 * for no obvious reason. Prevent this.
+                 */
+                SetForegroundWindow(aboutbox);
+                SetWindowPos (aboutbox, HWND_TOP, 0, 0, 0, 0,
+                              SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
+            }
+            break;
         }
         break;
       case WM_DESTROY:
@@ -564,6 +639,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
 #endif
             if (filemap != NULL && filemap != INVALID_HANDLE_VALUE) {
                 int rc;
+#ifndef NO_SECURITY
                 if (has_security) {
                     if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE,
                                             GetCurrentProcessId())) == NULL) {
@@ -607,6 +683,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
                     debug(("security APIs not present\r\n"));
 #endif
                 }
+#endif
                 p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0);
 #ifdef DEBUG_IPC
                 debug(("p is %p\r\n", p));
@@ -642,6 +719,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
         has_security = FALSE;
 
     if (has_security) {
+#ifndef NO_SECURITY
         /*
          * Attempt to ge the security API we need.
          */
@@ -654,6 +732,13 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
                        "Pageant Fatal Error", MB_ICONERROR | MB_OK);
             return 1;
         }
+#else
+       MessageBox(NULL,
+                  "This program has been compiled for Win9X and will\n"
+                  "not run on NT, in case it causes a security breach.",
+                  "Pageant Fatal Error", MB_ICONERROR | MB_OK);
+       return 1;
+#endif
     } else
         advapi = NULL;
 
@@ -717,7 +802,9 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
             DestroyIcon(hicon); 
 
         systray_menu = CreatePopupMenu();
+        /* accelerators used: vxa */
         AppendMenu (systray_menu, MF_ENABLED, IDM_VIEWKEYS, "&View Keys");
+        AppendMenu (systray_menu, MF_ENABLED, IDM_ABOUT, "&About");
         AppendMenu (systray_menu, MF_ENABLED, IDM_CLOSE, "E&xit");
     }