X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/6da411554bfe4c2a8ddfbb0616b0030ea5e813f5..96ccde8b48fbf8763f44dd5f24014dc0565bbae9:/windows/windlg.c diff --git a/windows/windlg.c b/windows/windlg.c index 272196df..c88e72d7 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -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); @@ -598,7 +598,7 @@ int do_config(void) int ret; ctrlbox = ctrl_new_box(); - setup_config_box(ctrlbox, &sesslist, FALSE, 0); + setup_config_box(ctrlbox, &sesslist, FALSE, 0, 0); win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), FALSE); dp_init(&dp); winctrl_init(&ctrls_base); @@ -624,7 +624,7 @@ int do_config(void) return ret; } -int do_reconfig(HWND hwnd) +int do_reconfig(HWND hwnd, int protcfginfo) { Config backup_cfg; int ret; @@ -632,7 +632,7 @@ int do_reconfig(HWND hwnd) backup_cfg = cfg; /* structure copy */ ctrlbox = ctrl_new_box(); - setup_config_box(ctrlbox, NULL, TRUE, cfg.protocol); + setup_config_box(ctrlbox, &sesslist, TRUE, cfg.protocol, protcfginfo); win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), TRUE); dp_init(&dp); winctrl_init(&ctrls_base); @@ -661,7 +661,7 @@ int do_reconfig(HWND hwnd) 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,78 +761,98 @@ 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; } } /* - * Ask whether the selected cipher is acceptable (since it was + * Ask whether the selected algorithm is acceptable (since it was * below the configured 'warn' threshold). - * cs: 0 = both ways, 1 = client->server, 2 = server->client */ -void askcipher(void *frontend, char *ciphername, int cs) +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[] = - "The first %.35scipher supported by the server\n" + "The first %s supported by the server\n" "is %.64s, which is below the configured\n" "warning threshold.\n" "Do you want to continue with this connection?\n"; char *message, *title; int mbret; - message = dupprintf(msg, ((cs == 0) ? "" : - (cs == 1) ? "client-to-server " : - "server-to-client "), ciphername); + 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" @@ -827,7 +869,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);