X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/ca896ed1a85f7a61c68558cfa1929030288bd71c..77603464f5b4231df69eb20ca278062bd7aae9fb:/windows/windlg.c diff --git a/windows/windlg.c b/windows/windlg.c index 8dd9d290..3a046898 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -701,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; @@ -738,40 +761,65 @@ 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.hInstance = hinst; + 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 | MB_DEFBUTTON3); - sfree(message); - sfree(title); - if (mbret == IDYES) + 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); + assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); + 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 1; + } else if (mbret == IDNO) + return 1; + return 0; } 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); + assert(mbret==IDYES || mbret==IDNO || mbret==IDCANCEL); + sfree((void *)mbox.lpszText); + sfree((void *)mbox.lpszCaption); if (mbret == IDYES) store_host_key(host, port, keytype, keystr); - if (mbret == IDCANCEL) - cleanup_exit(0); + if (mbret == IDNO) + return 1; + return 0; } } @@ -779,7 +827,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[] = @@ -793,20 +842,21 @@ 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; } /* * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ -int askappend(void *frontend, Filename filename) +int askappend(void *frontend, Filename filename, + void (*callback)(void *ctx, int result), void *ctx) { static const char msgtemplate[] = "The session log file \"%.*s\" already exists.\n" @@ -823,7 +873,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);