X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/055817455466c8eb60392f30bb7c689763962e17..5321c0c69fbb8966982687d208ffc5f0c17ba191:/windows/windlg.c diff --git a/windows/windlg.c b/windows/windlg.c index 9edf110b..89038714 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -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,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) { @@ -739,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. */ @@ -748,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); - 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) @@ -762,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); - 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) @@ -794,7 +834,7 @@ 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) @@ -824,7 +864,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);