From 5321c0c69fbb8966982687d208ffc5f0c17ba191 Mon Sep 17 00:00:00 2001 From: jacob Date: Tue, 15 Feb 2005 22:23:47 +0000 Subject: [PATCH] The Windows host key dialogs now have a `Help' button that should give appropriate context help, iff the help file is present. (Shame it's prey to `winhelp-crash'.) (I've perpetrated a widening of visibility of `hwnd'; the alternative, putting it into a frontend handle, seemed too likely to cause maintenance trouble if we don't also _use_ that frontend handle everywhere we now use the global `hwnd'.) git-svn-id: svn://svn.tartarus.org/sgt/putty@5309 cda61777-01e9-0310-a592-d414129be87e --- doc/errors.but | 4 ++++ windows/windlg.c | 69 +++++++++++++++++++++++++++++++++++++++++++----------- windows/window.c | 2 -- windows/winhelp.h | 16 +++++++++++-- windows/winstuff.h | 3 ++- 5 files changed, 75 insertions(+), 19 deletions(-) diff --git a/doc/errors.but b/doc/errors.but index 722f24b7..771c7ec1 100644 --- a/doc/errors.but +++ b/doc/errors.but @@ -15,6 +15,8 @@ bug (see \k{feedback}) and we will add documentation for it. \H{errors-hostkey-absent} \q{The server's host key is not cached in the registry} +\cfg{winhelp-topic}{errors.hostkey.absent} + This error message occurs when PuTTY connects to a new SSH server. Every server identifies itself by means of a host key; once PuTTY knows the host key for a server, it will be able to detect if a @@ -36,6 +38,8 @@ See \k{gs-hostkey} for more information on host keys. \H{errors-hostkey-wrong} \q{WARNING - POTENTIAL SECURITY BREACH!} +\cfg{winhelp-topic}{errors.hostkey.changed} + This message, followed by \q{The server's host key does not match the one PuTTY has cached in the registry}, means that PuTTY has connected to the SSH server before, knows what its host key diff --git a/windows/windlg.c b/windows/windlg.c index 04470cd6..89038714 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -701,6 +701,28 @@ void showabout(HWND hwnd) DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); } +/* 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; + } + } +} + void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint) { @@ -738,6 +760,22 @@ 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. */ @@ -747,13 +785,15 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, return; 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 | MB_DEFBUTTON3); - 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) @@ -761,13 +801,14 @@ void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, } 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 | MB_DEFBUTTON3); - 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) diff --git a/windows/window.c b/windows/window.c index 80467745..98b35105 100644 --- a/windows/window.c +++ b/windows/window.c @@ -166,8 +166,6 @@ static HPALETTE pal; static LPLOGPALETTE logpal; static RGBTRIPLE defpal[NALLCOLOURS]; -static HWND hwnd; - static HBITMAP caretbm; static int dbltime, lasttime, lastact; diff --git a/windows/winhelp.h b/windows/winhelp.h index 30b110bf..e2876da6 100644 --- a/windows/winhelp.h +++ b/windows/winhelp.h @@ -1,8 +1,10 @@ /* - * winhelp.h - define Windows Help context names for the controls - * in the PuTTY config box. + * winhelp.h - define Windows Help context names. These match up with + * the \cfg{winhelp-topic} directives in the Halibut source. */ +/* These are used in the cross-platform configuration dialog code. */ + #define HELPCTX(x) P(WINHELP_CTX_ ## x) #define WINHELP_CTX_no_help NULL @@ -122,3 +124,13 @@ #define WINHELP_CTX_ssh_bugs_rsapad2 "ssh.bugs.rsapad2" #define WINHELP_CTX_ssh_bugs_pksessid2 "ssh.bugs.pksessid2" #define WINHELP_CTX_ssh_bugs_rekey2 "ssh.bugs.rekey2" + +/* These are used in Windows-specific bits of the frontend. + * We (ab)use "help context identifiers" (dwContextId) to identify them. */ + +#define HELPCTXID(x) WINHELP_CTXID_ ## x + +#define WINHELP_CTX_errors_hostkey_absent "errors.hostkey.absent" +#define WINHELP_CTXID_errors_hostkey_absent 1 +#define WINHELP_CTX_errors_hostkey_changed "errors.hostkey.changed" +#define WINHELP_CTXID_errors_hostkey_changed 2 diff --git a/windows/winstuff.h b/windows/winstuff.h index 97e9bdc1..fbc9e5f6 100644 --- a/windows/winstuff.h +++ b/windows/winstuff.h @@ -66,9 +66,10 @@ typedef struct terminal_tag Terminal; typedef HDC Context; /* - * Window handles for the dialog boxes that can be running during a + * Window handles for the windows that can be running during a * PuTTY session. */ +GLOBAL HWND hwnd; /* the main terminal window */ GLOBAL HWND logbox; /* -- 2.11.0