\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
\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
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)
{
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.
*/
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)
}
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)
/*
- * 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
#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