X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/2c9c6388caa7e80195bffd93be7be7369c20bb98..b7a189f38294c745ae4ea6efb55891c8196e275b:/windlg.c diff --git a/windlg.c b/windlg.c index 76d4804f..a8603e65 100644 --- a/windlg.c +++ b/windlg.c @@ -27,6 +27,8 @@ static int requested_help; static struct prefslist cipherlist; +struct sesslist sesslist; /* exported to window.c */ + #define PRINTER_DISABLED_STRING "None (printing disabled)" void force_normal(HWND hwnd) @@ -140,7 +142,7 @@ static int CALLBACK LogProc(HWND hwnd, UINT msg, memcpy(p, sel_nl, sizeof(sel_nl)); p += sizeof(sel_nl); } - write_aclip(clipdata, size, TRUE); + write_aclip(NULL, clipdata, size, TRUE); sfree(clipdata); } sfree(selitems); @@ -452,6 +454,11 @@ enum { IDCX_ABOUT = IDC_PROXYPORTEDIT, IDC_PROXYEXCLUDESTATIC, IDC_PROXYEXCLUDEEDIT, + IDC_PROXYLOCALHOST, + IDC_PROXYDNSSTATIC, + IDC_PROXYDNSNO, + IDC_PROXYDNSAUTO, + IDC_PROXYDNSYES, IDC_PROXYUSERSTATIC, IDC_PROXYUSEREDIT, IDC_PROXYPASSSTATIC, @@ -548,6 +555,8 @@ enum { IDCX_ABOUT = IDC_BUGD_DERIVEKEY2, IDC_BUGS_RSAPAD2, IDC_BUGD_RSAPAD2, + IDC_BUGS_DHGEX2, + IDC_BUGD_DHGEX2, sshbugspanelend, selectionpanelstart, @@ -865,6 +874,39 @@ char *help_context_cmd(int id) case IDC_NODELAY: return "JI(`',`connection.nodelay')"; + case IDC_PROXYTYPESTATIC: + case IDC_PROXYTYPENONE: + case IDC_PROXYTYPEHTTP: + case IDC_PROXYTYPESOCKS: + case IDC_PROXYTYPETELNET: + return "JI(`',`proxy.type')"; + case IDC_PROXYHOSTSTATIC: + case IDC_PROXYHOSTEDIT: + case IDC_PROXYPORTSTATIC: + case IDC_PROXYPORTEDIT: + return "JI(`',`proxy.main')"; + case IDC_PROXYEXCLUDESTATIC: + case IDC_PROXYEXCLUDEEDIT: + case IDC_PROXYLOCALHOST: + return "JI(`',`proxy.exclude')"; + case IDC_PROXYDNSSTATIC: + case IDC_PROXYDNSNO: + case IDC_PROXYDNSAUTO: + case IDC_PROXYDNSYES: + return "JI(`',`proxy.dns')"; + case IDC_PROXYUSERSTATIC: + case IDC_PROXYUSEREDIT: + case IDC_PROXYPASSSTATIC: + case IDC_PROXYPASSEDIT: + return "JI(`',`proxy.auth')"; + case IDC_PROXYTELNETCMDSTATIC: + case IDC_PROXYTELNETCMDEDIT: + return "JI(`',`proxy.command')"; + case IDC_PROXYSOCKSVERSTATIC: + case IDC_PROXYSOCKSVER5: + case IDC_PROXYSOCKSVER4: + return "JI(`',`proxy.socksver')"; + case IDC_TSSTATIC: case IDC_TSEDIT: return "JI(`',`telnet.termspeed')"; @@ -1017,6 +1059,9 @@ char *help_context_cmd(int id) case IDC_BUGS_RSAPAD2: case IDC_BUGD_RSAPAD2: return "JI(`',`ssh.bugs.rsapad2')"; + case IDC_BUGS_DHGEX2: + case IDC_BUGD_DHGEX2: + return "JI(`',`ssh.bugs.dhgex2')"; default: return NULL; @@ -1037,9 +1082,9 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) n = SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_GETCOUNT, 0, 0); for (i = n; i-- > 0;) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_DELETESTRING, i, 0); - for (i = 0; i < nsessions; i++) + for (i = 0; i < sesslist.nsessions; i++) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING, - 0, (LPARAM) (sessions[i])); + 0, (LPARAM) (sesslist.sessions[i])); } SetDlgItemInt(hwnd, IDC_PORT, cfg.port, FALSE); CheckRadioButton(hwnd, IDC_PROTRAW, IDC_PROTSSH, @@ -1315,6 +1360,11 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) SetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host); SetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, cfg.proxy_port, FALSE); SetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT, cfg.proxy_exclude_list); + CheckDlgButton(hwnd, IDC_PROXYLOCALHOST, cfg.even_proxy_localhost); + CheckRadioButton(hwnd, IDC_PROXYDNSNO, IDC_PROXYDNSYES, + cfg.proxy_dns == PROXYDNS_NO ? IDC_PROXYDNSNO : + cfg.proxy_dns == PROXYDNS_YES ? IDC_PROXYDNSYES : + IDC_PROXYDNSAUTO); SetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT, cfg.proxy_telnet_command); SetDlgItemText(hwnd, IDC_PROXYUSEREDIT, cfg.proxy_username); SetDlgItemText(hwnd, IDC_PROXYPASSEDIT, cfg.proxy_password); @@ -1364,6 +1414,13 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess) SendDlgItemMessage(hwnd, IDC_BUGD_RSAPAD2, CB_SETCURSEL, cfg.sshbug_rsapad2 == BUG_ON ? 2 : cfg.sshbug_rsapad2 == BUG_OFF ? 1 : 0, 0); + SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_RESETCONTENT, 0, 0); + SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"Auto"); + SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"Off"); + SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_ADDSTRING, 0, (LPARAM)"On"); + SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, CB_SETCURSEL, + cfg.sshbug_dhgex2 == BUG_ON ? 2 : + cfg.sshbug_dhgex2 == BUG_OFF ? 1 : 0, 0); } struct treeview_faff { @@ -1809,7 +1866,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) } if (panel == proxypanelstart) { - /* The Proxy panel. Accelerators used: [acgoh] ntslypeuwmv */ + /* The Proxy panel. Accelerators used: [acgoh] ntslypeuwmvxd */ struct ctlpos cp; ctlposinit(&cp, hwnd, 80, 3, 13); if (dlgtype == 0) { @@ -1827,10 +1884,17 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) multiedit(&cp, "&Exclude Hosts/IPs", IDC_PROXYEXCLUDESTATIC, IDC_PROXYEXCLUDEEDIT, 100, NULL); + checkbox(&cp, "Consider pro&xying local host connections", + IDC_PROXYLOCALHOST); + radioline(&cp, "Do &DNS name lookup at proxy end:", + IDC_PROXYDNSSTATIC, 3, + "No", IDC_PROXYDNSNO, + "Auto", IDC_PROXYDNSAUTO, + "Yes", IDC_PROXYDNSYES, NULL); staticedit(&cp, "&Username", IDC_PROXYUSERSTATIC, IDC_PROXYUSEREDIT, 60); - staticedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC, - IDC_PROXYPASSEDIT, 60); + staticpassedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC, + IDC_PROXYPASSEDIT, 60); endbox(&cp); beginbox(&cp, "Misc. proxy settings", IDC_BOX_PROXY2); multiedit(&cp, @@ -1967,6 +2031,8 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) IDC_BUGS_DERIVEKEY2, IDC_BUGD_DERIVEKEY2, 20); staticddl(&cp, "Requires &padding on SSH2 RSA signatures", IDC_BUGS_RSAPAD2, IDC_BUGD_RSAPAD2, 20); + staticddl(&cp, "Chokes on &Diffie-Hellman group exchange", + IDC_BUGS_DHGEX2, IDC_BUGD_DHGEX2, 20); endbox(&cp); } } @@ -1994,10 +2060,9 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) "Add new forwarded port:", IDC_PFWDSTATIC2, "&Source port", IDC_SPORTSTATIC, IDC_SPORTEDIT, "Dest&ination", IDC_DPORTSTATIC, IDC_DPORTEDIT, - "A&dd", IDC_PFWDADD); - bareradioline(&cp, 2, - "&Local", IDC_PFWDLOCAL, - "Re&mote", IDC_PFWDREMOTE, NULL); + "A&dd", IDC_PFWDADD, + "&Local", IDC_PFWDLOCAL, + "Re&mote", IDC_PFWDREMOTE); endbox(&cp); } @@ -2018,11 +2083,11 @@ static int load_selected_session(HWND hwnd) MessageBeep(0); return 0; } - isdef = !strcmp(sessions[n], "Default Settings"); - load_settings(sessions[n], !isdef, &cfg); + isdef = !strcmp(sesslist.sessions[n], "Default Settings"); + load_settings(sesslist.sessions[n], !isdef, &cfg); init_dlg_ctrls(hwnd, TRUE); if (!isdef) - SetDlgItemText(hwnd, IDC_SESSEDIT, sessions[n]); + SetDlgItemText(hwnd, IDC_SESSEDIT, sesslist.sessions[n]); else SetDlgItemText(hwnd, IDC_SESSEDIT, ""); /* Restore the selection, which will have been clobbered by @@ -2372,20 +2437,20 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, MessageBeep(0); break; } - strcpy(str, sessions[n]); + strcpy(str, sesslist.sessions[n]); } save_settings(str, !!strcmp(str, "Default Settings"), &cfg); - get_sesslist(FALSE); - get_sesslist(TRUE); + get_sesslist(&sesslist, FALSE); + get_sesslist(&sesslist, TRUE); SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW, FALSE, 0); SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT, 0, 0); - for (i = 0; i < nsessions; i++) + for (i = 0; i < sesslist.nsessions; i++) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING, 0, - (LPARAM) (sessions[i])); + (LPARAM) (sesslist.sessions[i])); SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) - 1, 0); SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW, @@ -2431,17 +2496,17 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, MessageBeep(0); break; } - del_settings(sessions[n]); - get_sesslist(FALSE); - get_sesslist(TRUE); + del_settings(sesslist.sessions[n]); + get_sesslist(&sesslist, FALSE); + get_sesslist(&sesslist, TRUE); SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW, FALSE, 0); SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_RESETCONTENT, 0, 0); - for (i = 0; i < nsessions; i++) + for (i = 0; i < sesslist.nsessions; i++) SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_ADDSTRING, 0, - (LPARAM) (sessions[i])); + (LPARAM) (sesslist.sessions[i])); SendDlgItemMessage(hwnd, IDC_SESSLIST, LB_SETCURSEL, (WPARAM) - 1, 0); SendDlgItemMessage(hwnd, IDC_SESSLIST, WM_SETREDRAW, @@ -2981,6 +3046,23 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, IsDlgButtonChecked(hwnd, IDC_PROXYSOCKSVER4) ? 4 : 5; } break; + case IDC_PROXYLOCALHOST: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) + cfg.even_proxy_localhost = + IsDlgButtonChecked(hwnd, IDC_PROXYLOCALHOST); + break; + case IDC_PROXYDNSNO: + case IDC_PROXYDNSAUTO: + case IDC_PROXYDNSYES: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) { + cfg.proxy_dns = + IsDlgButtonChecked(hwnd, IDC_PROXYDNSNO) ? PROXYDNS_NO : + IsDlgButtonChecked(hwnd, IDC_PROXYDNSYES) ? PROXYDNS_YES : + PROXYDNS_AUTO; + } + break; case IDC_PROXYTYPENONE: case IDC_PROXYTYPEHTTP: case IDC_PROXYTYPESOCKS: @@ -3585,6 +3667,14 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg, index == 1 ? BUG_OFF : BUG_ON); } break; + case IDC_BUGD_DHGEX2: + if (HIWORD(wParam) == CBN_SELCHANGE) { + int index = SendDlgItemMessage(hwnd, IDC_BUGD_DHGEX2, + CB_GETCURSEL, 0, 0); + cfg.sshbug_dhgex2 = (index == 0 ? BUG_AUTO : + index == 1 ? BUG_OFF : BUG_ON); + } + break; } return 0; case WM_HELP: @@ -3677,11 +3767,11 @@ int do_config(void) { int ret; - get_sesslist(TRUE); + get_sesslist(&sesslist, TRUE); savedsession[0] = '\0'; ret = DialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL, MainDlgProc); - get_sesslist(FALSE); + get_sesslist(&sesslist, FALSE); return ret; } @@ -3700,11 +3790,13 @@ int do_reconfig(HWND hwnd) return ret; } -void logevent(char *string) +void logevent(void *frontend, char *string) { char timebuf[40]; time_t t; + log_eventlog(logctx, string); + if (nevents >= negsize) { negsize += 64; events = srealloc(events, negsize * sizeof(*events)); @@ -3742,7 +3834,7 @@ void showabout(HWND hwnd) DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, AboutProc); } -void verify_ssh_host_key(char *host, int port, char *keytype, +void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint) { int ret; @@ -3818,7 +3910,7 @@ void verify_ssh_host_key(char *host, int port, char *keytype, * below the configured 'warn' threshold). * cs: 0 = both ways, 1 = client->server, 2 = server->client */ -void askcipher(char *ciphername, int cs) +void askcipher(void *frontend, char *ciphername, int cs) { static const char mbtitle[] = "PuTTY Security Alert"; static const char msg[] = @@ -3847,7 +3939,7 @@ void askcipher(char *ciphername, int cs) * 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(char *filename) +int askappend(void *frontend, char *filename) { static const char mbtitle[] = "PuTTY Log to File"; static const char msgtemplate[] = @@ -3876,6 +3968,13 @@ int askappend(char *filename) /* * Warn about the obsolescent key file format. + * + * Uniquely among these functions, this one does _not_ expect a + * frontend handle. This means that if PuTTY is ported to a + * platform which requires frontend handles, this function will be + * an anomaly. Fortunately, the problem it addresses will not have + * been present on that platform, so it can plausibly be + * implemented as an empty function. */ void old_keyfile_warning(void) {