Revamp interface to verify_ssh_host_key() and askalg(). Each of them
[u/mdw/putty] / windows / windlg.c
index ba67ef5..742a761 100644 (file)
@@ -300,7 +300,7 @@ static void create_controls(HWND hwnd, char *path)
         * Otherwise, we're creating the controls for a particular
         * panel.
         */
-       ctlposinit(&cp, hwnd, 80, 3, 13);
+       ctlposinit(&cp, hwnd, 100, 3, 13);
        wc = &ctrls_panel;
        base_id = IDCX_PANELBASE;
     }
@@ -361,7 +361,7 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,
            HWND tvstatic;
 
            r.left = 3;
-           r.right = r.left + 75;
+           r.right = r.left + 95;
            r.top = 3;
            r.bottom = r.top + 10;
            MapDialogRect(hwnd, &r);
@@ -375,7 +375,7 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,
            SendMessage(tvstatic, WM_SETFONT, font, MAKELPARAM(TRUE, 0));
 
            r.left = 3;
-           r.right = r.left + 75;
+           r.right = r.left + 95;
            r.top = 13;
            r.bottom = r.top + 219;
            MapDialogRect(hwnd, &r);
@@ -661,7 +661,7 @@ int do_reconfig(HWND hwnd, int protcfginfo)
 void logevent(void *frontend, const char *string)
 {
     char timebuf[40];
-    time_t t;
+    struct tm tm;
 
     log_eventlog(logctx, string);
 
@@ -670,9 +670,8 @@ void logevent(void *frontend, const char *string)
        events = sresize(events, negsize, char *);
     }
 
-    time(&t);
-    strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t",
-            localtime(&t));
+    tm=ltime();
+    strftime(timebuf, sizeof(timebuf), "%Y-%m-%d %H:%M:%S\t", &tm);
 
     events[nevents] = snewn(strlen(timebuf) + strlen(string) + 1, char);
     strcpy(events[nevents], timebuf);
@@ -702,8 +701,31 @@ void showabout(HWND hwnd)
     DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc);
 }
 
-void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
-                        char *keystr, char *fingerprint)
+/* Helper function for verify_ssh_host_key(). */
+static VOID CALLBACK verify_ssh_host_key_help(LPHELPINFO lpHelpInfo)
+{
+    if (help_path) {
+       char *context = NULL;
+#define CHECK_CTX(name) \
+       do { \
+           if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \
+               context = WINHELP_CTX_ ## name; \
+       } while (0)
+       CHECK_CTX(errors_hostkey_absent);
+       CHECK_CTX(errors_hostkey_changed);
+#undef CHECK_CTX
+       if (context) {
+           char *cmd = dupprintf("JI(`',`%s')", context);
+           WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd);
+           sfree(cmd);
+           requested_help = TRUE;
+       }
+    }
+}
+
+int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
+                        char *keystr, char *fingerprint,
+                        void (*callback)(void *ctx, int result), void *ctx)
 {
     int ret;
 
@@ -739,40 +761,61 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
 
     static const char mbtitle[] = "%s Security Alert";
 
+    UINT help_button = 0;
+    MSGBOXPARAMS mbox;
+
+    /*
+     * We use MessageBoxIndirect() because it allows us to specify a
+     * callback function for the Help button.
+     */
+    mbox.cbSize = sizeof(mbox);
+    mbox.hwndOwner = hwnd;
+    mbox.lpfnMsgBoxCallback = &verify_ssh_host_key_help;
+    mbox.dwLanguageId = LANG_NEUTRAL;
+
+    /* Do we have a help file? */
+    if (help_path)
+       help_button = MB_HELP;
+
     /*
      * Verify the key against the registry.
      */
     ret = verify_host_key(host, port, keytype, keystr);
 
     if (ret == 0)                     /* success - key matched OK */
-       return;
+       return 1;
     if (ret == 2) {                   /* key was different */
        int mbret;
-       char *message, *title;
-       message = dupprintf(wrongmsg, appname, keytype, fingerprint, appname);
-       title = dupprintf(mbtitle, appname);
-       mbret = MessageBox(NULL, message, title,
-                          MB_ICONWARNING | MB_YESNOCANCEL);
-       sfree(message);
-       sfree(title);
+       mbox.lpszText = dupprintf(wrongmsg, appname, keytype, fingerprint,
+                                 appname);
+       mbox.lpszCaption = dupprintf(mbtitle, appname);
+       mbox.dwContextHelpId = HELPCTXID(errors_hostkey_changed);
+       mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 |
+           help_button;
+       mbret = MessageBoxIndirect(&mbox);
+       sfree((void *)mbox.lpszText);
+       sfree((void *)mbox.lpszCaption);
        if (mbret == IDYES)
            store_host_key(host, port, keytype, keystr);
        if (mbret == IDCANCEL)
-           cleanup_exit(0);
+           return 0;
+        return 1;
     }
     if (ret == 1) {                   /* key was absent */
        int mbret;
-       char *message, *title;
-       message = dupprintf(absentmsg, keytype, fingerprint, appname);
-       title = dupprintf(mbtitle, appname);
-       mbret = MessageBox(NULL, message, title,
-                          MB_ICONWARNING | MB_YESNOCANCEL);
-       sfree(message);
-       sfree(title);
+       mbox.lpszText = dupprintf(absentmsg, keytype, fingerprint, appname);
+       mbox.lpszCaption = dupprintf(mbtitle, appname);
+       mbox.dwContextHelpId = HELPCTXID(errors_hostkey_absent);
+       mbox.dwStyle = MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON3 |
+           help_button;
+       mbret = MessageBoxIndirect(&mbox);
+       sfree((void *)mbox.lpszText);
+       sfree((void *)mbox.lpszCaption);
        if (mbret == IDYES)
            store_host_key(host, port, keytype, keystr);
        if (mbret == IDCANCEL)
-           cleanup_exit(0);
+           return 0;
+        return 1;
     }
 }
 
@@ -780,7 +823,8 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
  * Ask whether the selected algorithm is acceptable (since it was
  * below the configured 'warn' threshold).
  */
-void askalg(void *frontend, const char *algtype, const char *algname)
+int askalg(void *frontend, const char *algtype, const char *algname,
+          void (*callback)(void *ctx, int result), void *ctx)
 {
     static const char mbtitle[] = "%s Security Alert";
     static const char msg[] =
@@ -794,13 +838,13 @@ void askalg(void *frontend, const char *algtype, const char *algname)
     message = dupprintf(msg, algtype, algname);
     title = dupprintf(mbtitle, appname);
     mbret = MessageBox(NULL, message, title,
-                      MB_ICONWARNING | MB_YESNO);
+                      MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2);
     sfree(message);
     sfree(title);
     if (mbret == IDYES)
-       return;
+       return 1;
     else
-       cleanup_exit(0);
+       return 0;
 }
 
 /*
@@ -824,7 +868,7 @@ int askappend(void *frontend, Filename filename)
     mbtitle = dupprintf("%s Log to File", appname);
 
     mbret = MessageBox(NULL, message, mbtitle,
-                      MB_ICONQUESTION | MB_YESNOCANCEL);
+                      MB_ICONQUESTION | MB_YESNOCANCEL | MB_DEFBUTTON3);
 
     sfree(message);
     sfree(mbtitle);