Support, on Unix only (so far), for OpenSSH-style generic proxying
[u/mdw/putty] / config.c
index 184023d..e462ec2 100644 (file)
--- a/config.c
+++ b/config.c
@@ -256,8 +256,12 @@ static void sessionsaver_handler(union control *ctrl, void *dlg,
      * allocate space to store the current contents of the saved
      * session edit box (since it must persist even when we switch
      * panels, but is not part of the Config).
+     * 
+     * Of course, this doesn't need to be done mid-session.
      */
-    if (!dlg_get_privdata(ssd->editbox, dlg)) {
+    if (!ssd->editbox) {
+        savedsession = NULL;
+    } else if (!dlg_get_privdata(ssd->editbox, dlg)) {
        savedsession = (char *)
            dlg_alloc_privdata(ssd->editbox, dlg, SAVEDSESSION_LEN);
        savedsession[0] = '\0';
@@ -333,6 +337,11 @@ static void sessionsaver_handler(union control *ctrl, void *dlg,
                dlg_refresh(ssd->listbox, dlg);
            }
        } else if (ctrl == ssd->okbutton) {
+            if (!savedsession) {
+                /* In a mid-session Change Settings, Apply is always OK. */
+               dlg_end(dlg, 1);
+                return;
+            }
            /*
             * Annoying special case. If the `Open' button is
             * pressed while no host name is currently set, _and_
@@ -730,6 +739,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
 
     ssd = (struct sessionsaver_data *)
        ctrl_alloc(b, sizeof(struct sessionsaver_data));
+    memset(ssd, 0, sizeof(*ssd));
     ssd->sesslist = (midsession ? NULL : sesslist);
 
     /*
@@ -839,14 +849,27 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
     ctrl_settitle(b, "Session/Logging", "Options controlling session logging");
 
     s = ctrl_getset(b, "Session/Logging", "main", NULL);
-    ctrl_radiobuttons(s, "Session logging:", NO_SHORTCUT, 1,
-                     HELPCTX(logging_main),
-                     dlg_stdradiobutton_handler, I(offsetof(Config, logtype)),
-                     "Logging turned off completely", 't', I(LGTYP_NONE),
-                     "Log printable output only", 'p', I(LGTYP_ASCII),
-                     "Log all session output", 'l', I(LGTYP_DEBUG),
-                     "Log SSH packet data", 's', I(LGTYP_PACKETS),
-                     NULL);
+    /*
+     * The logging buttons change depending on whether SSH packet
+     * logging can sensibly be available.
+     */
+    {
+       char *sshlogname;
+       if ((midsession && protocol == PROT_SSH) ||
+           (!midsession && backends[3].name != NULL))
+           sshlogname = "Log SSH packet data";
+       else
+           sshlogname = NULL;         /* this will disable the button */
+       ctrl_radiobuttons(s, "Session logging:", NO_SHORTCUT, 1,
+                         HELPCTX(logging_main),
+                         dlg_stdradiobutton_handler,
+                         I(offsetof(Config, logtype)),
+                         "Logging turned off completely", 't', I(LGTYP_NONE),
+                         "Log printable output only", 'p', I(LGTYP_ASCII),
+                         "Log all session output", 'l', I(LGTYP_DEBUG),
+                         sshlogname, 's', I(LGTYP_PACKETS),
+                         NULL);
+    }
     ctrl_filesel(s, "Log file name:", 'f',
                 NULL, TRUE, "Select session log file name",
                 HELPCTX(logging_filename),
@@ -1004,6 +1027,9 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                  HELPCTX(features_retitle),
                  dlg_stdcheckbox_handler,
                  I(offsetof(Config,no_remote_wintitle)));
+    ctrl_checkbox(s, "Disable remote window title querying (SECURITY)",
+                 'q', HELPCTX(features_qtitle), dlg_stdcheckbox_handler,
+                 I(offsetof(Config,no_remote_qtitle)));
     ctrl_checkbox(s, "Disable destructive backspace on server sending ^?",'b',
                  HELPCTX(features_dbackspace),
                  dlg_stdcheckbox_handler, I(offsetof(Config,no_dbackspace)));
@@ -1130,9 +1156,9 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                      HELPCTX(translation_linedraw),
                      dlg_stdradiobutton_handler,
                      I(offsetof(Config, vtmode)),
-                     "Font has XWindows encoding", 'x', I(VT_XWINDOWS),
+                     "Use Unicode line drawing code points",'u',I(VT_UNICODE),
                      "Poor man's line drawing (+, - and |)",'p',I(VT_POORMAN),
-                     "Unicode mode", 'u', I(VT_UNICODE), NULL);
+                     NULL);
 
     /*
      * The Window/Selection panel.
@@ -1141,7 +1167,7 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
 
     s = ctrl_getset(b, "Window/Selection", "trans",
                    "Translation of pasted characters");
-    ctrl_checkbox(s, "Don't translate line drawing chars into +, - and |",'d',
+    ctrl_checkbox(s, "Paste VT100 line drawing chars as lqqqk",'d',
                  HELPCTX(selection_linedraw),
                  dlg_stdcheckbox_handler, I(offsetof(Config,rawcnp)));
        
@@ -1224,36 +1250,42 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
     ctrl_columns(s, 1, 100);
 
     /*
-     * The Connection panel.
+     * The Connection panel. This doesn't show up if we're in a
+     * non-network utility such as pterm. We tell this by being
+     * passed a protocol < 0.
      */
-    ctrl_settitle(b, "Connection", "Options controlling the connection");
+    if (protocol >= 0) {
+       ctrl_settitle(b, "Connection", "Options controlling the connection");
 
-    if (!midsession) {
-       s = ctrl_getset(b, "Connection", "data", "Data to send to the server");
-       ctrl_editbox(s, "Terminal-type string", 't', 50,
-                    HELPCTX(connection_termtype),
-                    dlg_stdeditbox_handler, I(offsetof(Config,termtype)),
-                    I(sizeof(((Config *)0)->termtype)));
-       ctrl_editbox(s, "Auto-login username", 'u', 50,
-                    HELPCTX(connection_username),
-                    dlg_stdeditbox_handler, I(offsetof(Config,username)),
-                    I(sizeof(((Config *)0)->username)));
-    }
+       if (!midsession) {
+           s = ctrl_getset(b, "Connection", "data",
+                           "Data to send to the server");
+           ctrl_editbox(s, "Terminal-type string", 't', 50,
+                        HELPCTX(connection_termtype),
+                        dlg_stdeditbox_handler, I(offsetof(Config,termtype)),
+                        I(sizeof(((Config *)0)->termtype)));
+           ctrl_editbox(s, "Auto-login username", 'u', 50,
+                        HELPCTX(connection_username),
+                        dlg_stdeditbox_handler, I(offsetof(Config,username)),
+                        I(sizeof(((Config *)0)->username)));
+       }
 
-    s = ctrl_getset(b, "Connection", "keepalive",
-                   "Sending of null packets to keep session active");
-    ctrl_editbox(s, "Seconds between keepalives (0 to turn off)", 'k', 20,
-                HELPCTX(connection_keepalive),
-                dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)),
-                I(-1));
+       s = ctrl_getset(b, "Connection", "keepalive",
+                       "Sending of null packets to keep session active");
+       ctrl_editbox(s, "Seconds between keepalives (0 to turn off)", 'k', 20,
+                    HELPCTX(connection_keepalive),
+                    dlg_stdeditbox_handler, I(offsetof(Config,ping_interval)),
+                    I(-1));
+
+       if (!midsession) {
+           s = ctrl_getset(b, "Connection", "tcp",
+                           "Low-level TCP connection options");
+           ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)",
+                         'n', HELPCTX(connection_nodelay),
+                         dlg_stdcheckbox_handler,
+                         I(offsetof(Config,tcp_nodelay)));
+       }
 
-    if (!midsession) {
-       s = ctrl_getset(b, "Connection", "tcp",
-                       "Low-level TCP connection options");
-       ctrl_checkbox(s, "Disable Nagle's algorithm (TCP_NODELAY option)", 'n',
-                     HELPCTX(connection_nodelay),
-                     dlg_stdcheckbox_handler,
-                     I(offsetof(Config,tcp_nodelay)));
     }
 
     if (!midsession) {
@@ -1264,14 +1296,14 @@ void setup_config_box(struct controlbox *b, struct sesslist *sesslist,
                      "Options controlling proxy usage");
 
        s = ctrl_getset(b, "Connection/Proxy", "basics", "Proxy basics");
-       ctrl_radiobuttons(s, "Proxy type:", NO_SHORTCUT, 4,
+       ctrl_radiobuttons(s, "Proxy type:", 't', 4,
                          HELPCTX(proxy_type),
                          dlg_stdradiobutton_handler,
                          I(offsetof(Config, proxy_type)),
-                         "None", 'n', I(PROXY_NONE),
-                         "HTTP", 't', I(PROXY_HTTP),
-                         "SOCKS", 's', I(PROXY_SOCKS),
-                         "Telnet", 'l', I(PROXY_TELNET),
+                         "None", I(PROXY_NONE),
+                         "HTTP", I(PROXY_HTTP),
+                         "SOCKS", I(PROXY_SOCKS),
+                         "Telnet", I(PROXY_TELNET),
                          NULL);
        ctrl_columns(s, 2, 80, 20);
        c = ctrl_editbox(s, "Proxy hostname", 'y', 100,