{ "Blowfish", CIPHER_BLOWFISH },
{ "DES", CIPHER_DES },
{ "AES (SSH-2 only)", CIPHER_AES },
+ { "Arcfour (SSH-2 only)", CIPHER_ARCFOUR },
{ "-- warn below here --", CIPHER_WARN }
};
}
}
+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;
};
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;
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));
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
}
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,
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 TIS or CryptoCard auth (SSH-1)", 'm',
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",
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);