X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/12745e35f6aa5ba7b1a89afe6d5249d8ca46dd37..973612f5e86c9eaabc812a47d81c5cb14f672249:/config.c diff --git a/config.c b/config.c index 336f2b60..c844e059 100644 --- a/config.c +++ b/config.c @@ -120,6 +120,7 @@ static void cipherlist_handler(union control *ctrl, void *dlg, { "Blowfish", CIPHER_BLOWFISH }, { "DES", CIPHER_DES }, { "AES (SSH-2 only)", CIPHER_AES }, + { "Arcfour (SSH-2 only)", CIPHER_ARCFOUR }, { "-- warn below here --", CIPHER_WARN } }; @@ -349,9 +350,25 @@ static void sessionsaver_handler(union control *ctrl, void *dlg, dlg_update_done(ctrl, dlg); } } else if (event == EVENT_VALCHANGE) { + int top, bottom, halfway, i; if (ctrl == ssd->editbox) { dlg_editbox_get(ctrl, dlg, savedsession, SAVEDSESSION_LEN); + top = ssd->sesslist.nsessions; + bottom = -1; + while (top-bottom > 1) { + halfway = (top+bottom)/2; + i = strcmp(savedsession, ssd->sesslist.sessions[halfway]); + if (i <= 0 ) { + top = halfway; + } else { + bottom = halfway; + } + } + if (top == ssd->sesslist.nsessions) { + top -= 1; + } + dlg_listbox_select(ssd->listbox, dlg, top); } } else if (event == EVENT_ACTION) { if (!ssd->midsession && @@ -601,6 +618,99 @@ static void colour_handler(union control *ctrl, void *dlg, } } +struct ttymodes_data { + union control *modelist, *valradio, *valbox; + union control *addbutton, *rembutton, *listbox; +}; + +static void ttymodes_handler(union control *ctrl, void *dlg, + void *data, int event) +{ + Config *cfg = (Config *)data; + struct ttymodes_data *td = + (struct ttymodes_data *)ctrl->generic.context.p; + + if (event == EVENT_REFRESH) { + if (ctrl == td->listbox) { + char *p = cfg->ttymodes; + dlg_update_start(ctrl, dlg); + dlg_listbox_clear(ctrl, dlg); + while (*p) { + int tabpos = strchr(p, '\t') - p; + char *disp = dupprintf("%.*s\t%s", tabpos, p, + (p[tabpos+1] == 'A') ? "(auto)" : + p+tabpos+2); + dlg_listbox_add(ctrl, dlg, disp); + p += strlen(p) + 1; + sfree(disp); + } + dlg_update_done(ctrl, dlg); + } else if (ctrl == td->modelist) { + int i; + dlg_update_start(ctrl, dlg); + dlg_listbox_clear(ctrl, dlg); + for (i = 0; ttymodes[i]; i++) + dlg_listbox_add(ctrl, dlg, ttymodes[i]); + dlg_listbox_select(ctrl, dlg, 0); /* *shrug* */ + dlg_update_done(ctrl, dlg); + } else if (ctrl == td->valradio) { + dlg_radiobutton_set(ctrl, dlg, 0); + } + } else if (event == EVENT_ACTION) { + if (ctrl == td->addbutton) { + int ind = dlg_listbox_index(td->modelist, dlg); + if (ind >= 0) { + char type = dlg_radiobutton_get(td->valradio, dlg) ? 'V' : 'A'; + int slen, left; + char *p, str[lenof(cfg->ttymodes)]; + /* Construct new entry */ + memset(str, 0, lenof(str)); + strncpy(str, ttymodes[ind], lenof(str)-3); + slen = strlen(str); + str[slen] = '\t'; + str[slen+1] = type; + slen += 2; + if (type == 'V') { + dlg_editbox_get(td->valbox, dlg, str+slen, lenof(str)-slen); + } + /* Find end of list, deleting any existing instance */ + p = cfg->ttymodes; + left = lenof(cfg->ttymodes); + while (*p) { + int t = strchr(p, '\t') - p; + if (t == strlen(ttymodes[ind]) && + strncmp(p, ttymodes[ind], t) == 0) { + memmove(p, p+strlen(p)+1, left - (strlen(p)+1)); + continue; + } + left -= strlen(p) + 1; + p += strlen(p) + 1; + } + /* Append new entry */ + memset(p, 0, left); + strncpy(p, str, left - 2); + dlg_refresh(td->listbox, dlg); + } else + dlg_beep(dlg); + } else if (ctrl == td->rembutton) { + char *p = cfg->ttymodes; + int i = 0, len = lenof(cfg->ttymodes); + while (*p) { + if (dlg_listbox_issel(td->listbox, dlg, i)) { + memmove(p, p+strlen(p)+1, len - (strlen(p)+1)); + i++; + continue; + } + len -= strlen(p) + 1; + p += strlen(p) + 1; + i++; + } + memset(p, 0, lenof(cfg->ttymodes) - len); + dlg_refresh(td->listbox, dlg); + } + } +} + struct environ_data { union control *varbox, *valbox, *addbutton, *rembutton, *listbox; }; @@ -826,6 +936,7 @@ void setup_config_box(struct controlbox *b, int midsession, struct sessionsaver_data *ssd; struct charclass_data *ccd; struct colour_data *cd; + struct ttymodes_data *td; struct environ_data *ed; struct portfwd_data *pfd; union control *c; @@ -1242,7 +1353,7 @@ void setup_config_box(struct controlbox *b, int midsession, s = ctrl_getset(b, "Window/Appearance", "border", "Adjust the window border"); - ctrl_editbox(s, "Gap between text and window edge:", NO_SHORTCUT, 20, + ctrl_editbox(s, "Gap between text and window edge:", 'e', 20, HELPCTX(appearance_border), dlg_stdeditbox_handler, I(offsetof(Config,window_border)), I(-1)); @@ -1423,9 +1534,9 @@ void setup_config_box(struct controlbox *b, int midsession, HELPCTX(connection_ipversion), dlg_stdradiobutton_handler, I(offsetof(Config, addressfamily)), - "Auto", NO_SHORTCUT, I(ADDRTYPE_UNSPEC), - "IPv4", NO_SHORTCUT, I(ADDRTYPE_IPV4), - "IPv6", NO_SHORTCUT, I(ADDRTYPE_IPV6), + "Auto", 'u', I(ADDRTYPE_UNSPEC), + "IPv4", '4', I(ADDRTYPE_IPV4), + "IPv6", '6', I(ADDRTYPE_IPV6), NULL); #endif } @@ -1640,10 +1751,6 @@ void setup_config_box(struct controlbox *b, int midsession, I(sizeof(((Config *)0)->remote_cmd))); s = ctrl_getset(b, "Connection/SSH", "protocol", "Protocol options"); - ctrl_checkbox(s, "Don't allocate a pseudo-terminal", 'p', - HELPCTX(ssh_nopty), - dlg_stdcheckbox_handler, - I(offsetof(Config,nopty))); ctrl_checkbox(s, "Don't start a shell or command at all", 'n', HELPCTX(ssh_noshell), dlg_stdcheckbox_handler, @@ -1726,8 +1833,18 @@ void setup_config_box(struct controlbox *b, int midsession, ctrl_settitle(b, "Connection/SSH/Auth", "Options controlling SSH authentication"); + s = ctrl_getset(b, "Connection/SSH/Auth", "main", NULL); + ctrl_checkbox(s, "Bypass authentication entirely (SSH-2 only)", 'b', + HELPCTX(ssh_auth_bypass), + dlg_stdcheckbox_handler, + I(offsetof(Config,ssh_no_userauth))); + s = ctrl_getset(b, "Connection/SSH/Auth", "methods", "Authentication methods"); + ctrl_checkbox(s, "Attempt authentication using Pageant", 'p', + HELPCTX(ssh_auth_pageant), + dlg_stdcheckbox_handler, + I(offsetof(Config,tryagent))); ctrl_checkbox(s, "Attempt TIS or CryptoCard auth (SSH-1)", 'm', HELPCTX(ssh_auth_tis), dlg_stdcheckbox_handler, @@ -1754,6 +1871,72 @@ void setup_config_box(struct controlbox *b, int midsession, if (!midsession) { /* + * The Connection/SSH/TTY panel. + */ + ctrl_settitle(b, "Connection/SSH/TTY", "Remote terminal settings"); + + s = ctrl_getset(b, "Connection/SSH/TTY", "sshtty", NULL); + ctrl_checkbox(s, "Don't allocate a pseudo-terminal", 'p', + HELPCTX(ssh_nopty), + dlg_stdcheckbox_handler, + I(offsetof(Config,nopty))); + + s = ctrl_getset(b, "Connection/SSH/TTY", "ttymodes", + "Terminal modes"); + td = (struct ttymodes_data *) + ctrl_alloc(b, sizeof(struct ttymodes_data)); + ctrl_columns(s, 2, 75, 25); + c = ctrl_text(s, "Terminal modes to send:", HELPCTX(ssh_ttymodes)); + c->generic.column = 0; + td->rembutton = ctrl_pushbutton(s, "Remove", 'r', + HELPCTX(ssh_ttymodes), + ttymodes_handler, P(td)); + td->rembutton->generic.column = 1; + td->rembutton->generic.tabdelay = 1; + ctrl_columns(s, 1, 100); + td->listbox = ctrl_listbox(s, NULL, NO_SHORTCUT, + HELPCTX(ssh_ttymodes), + ttymodes_handler, P(td)); + td->listbox->listbox.multisel = 1; + td->listbox->listbox.height = 4; + td->listbox->listbox.ncols = 2; + td->listbox->listbox.percentages = snewn(2, int); + td->listbox->listbox.percentages[0] = 40; + td->listbox->listbox.percentages[1] = 60; + ctrl_tabdelay(s, td->rembutton); + ctrl_columns(s, 2, 75, 25); + td->modelist = ctrl_droplist(s, "Mode:", 'm', 67, + HELPCTX(ssh_ttymodes), + ttymodes_handler, P(td)); + td->modelist->generic.column = 0; + td->addbutton = ctrl_pushbutton(s, "Add", 'd', + HELPCTX(ssh_ttymodes), + ttymodes_handler, P(td)); + td->addbutton->generic.column = 1; + td->addbutton->generic.tabdelay = 1; + ctrl_columns(s, 1, 100); /* column break */ + /* Bit of a hack to get the value radio buttons and + * edit-box on the same row. */ + ctrl_columns(s, 3, 25, 50, 25); + c = ctrl_text(s, "Value:", HELPCTX(ssh_ttymodes)); + c->generic.column = 0; + td->valradio = ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 2, + HELPCTX(ssh_ttymodes), + ttymodes_handler, P(td), + "Auto", NO_SHORTCUT, P(NULL), + "This:", NO_SHORTCUT, P(NULL), + NULL); + td->valradio->generic.column = 1; + td->valbox = ctrl_editbox(s, NULL, NO_SHORTCUT, 100, + HELPCTX(ssh_ttymodes), + ttymodes_handler, P(td), P(NULL)); + td->valbox->generic.column = 2; + ctrl_tabdelay(s, td->addbutton); + + } + + if (!midsession) { + /* * The Connection/SSH/X11 panel. */ ctrl_settitle(b, "Connection/SSH/X11", @@ -1839,9 +2022,9 @@ void setup_config_box(struct controlbox *b, int midsession, ctrl_radiobuttons(s, NULL, NO_SHORTCUT, 3, HELPCTX(ssh_tunnels_portfwd_ipversion), portfwd_handler, P(pfd), - "Auto", NO_SHORTCUT, I(ADDRTYPE_UNSPEC), - "IPv4", NO_SHORTCUT, I(ADDRTYPE_IPV4), - "IPv6", NO_SHORTCUT, I(ADDRTYPE_IPV6), + "Auto", 'u', I(ADDRTYPE_UNSPEC), + "IPv4", '4', I(ADDRTYPE_IPV4), + "IPv6", '6', I(ADDRTYPE_IPV6), NULL); #endif ctrl_tabdelay(s, pfd->addbutton);