Support for XDM-AUTHORIZATION-1 at the SSH server end, making use of
[u/mdw/putty] / windlg.c
index 5040a24..37d840c 100644 (file)
--- 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)
@@ -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,
@@ -613,6 +620,9 @@ enum { IDCX_ABOUT =
     IDC_X11_FORWARD,
     IDC_X11_DISPSTATIC,
     IDC_X11_DISPLAY,
+    IDC_X11AUTHSTATIC,
+    IDC_X11MIT,
+    IDC_X11XDM,
     IDC_LPORT_ALL,
     IDC_RPORT_ALL,
     IDC_PFWDSTATIC,
@@ -880,7 +890,13 @@ char *help_context_cmd(int id)
         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:
@@ -1012,6 +1028,10 @@ char *help_context_cmd(int id)
       case IDC_X11_DISPSTATIC:
       case IDC_X11_DISPLAY:
         return "JI(`',`ssh.tunnels.x11')";
+      case IDC_X11AUTHSTATIC:
+      case IDC_X11MIT:
+      case IDC_X11XDM:
+       return "JI(`',`ssh.tunnels.x11auth')";
       case IDC_PFWDSTATIC:
       case IDC_PFWDSTATIC2:
       case IDC_PFWDREMOVE:
@@ -1069,9 +1089,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,
@@ -1334,6 +1354,8 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
 
     CheckDlgButton(hwnd, IDC_X11_FORWARD, cfg.x11_forward);
     SetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_display);
+    CheckRadioButton(hwnd, IDC_X11MIT, IDC_X11XDM,
+                    cfg.x11_auth == X11_MIT ? IDC_X11MIT : IDC_X11XDM);
 
     CheckDlgButton(hwnd, IDC_LPORT_ALL, cfg.lport_acceptall);
     CheckDlgButton(hwnd, IDC_RPORT_ALL, cfg.rport_acceptall);
@@ -1347,6 +1369,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);
@@ -1848,7 +1875,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) {
@@ -1866,6 +1893,13 @@ 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);
            staticpassedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC,
@@ -2021,8 +2055,12 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
                     IDC_TITLE_TUNNELS);
            beginbox(&cp, "X11 forwarding", IDC_BOX_TUNNELS1);
            checkbox(&cp, "&Enable X11 forwarding", IDC_X11_FORWARD);
-           multiedit(&cp, "&X display location", IDC_X11_DISPSTATIC,
-                     IDC_X11_DISPLAY, 50, NULL);
+           staticedit(&cp, "&X display location", IDC_X11_DISPSTATIC,
+                     IDC_X11_DISPLAY, 50);
+           radioline(&cp, "Remote X11 a&uthentication protocol",
+                     IDC_X11AUTHSTATIC, 2,
+                     "MIT-Magic-Cookie-1", IDC_X11MIT,
+                     "XDM-Authorization-1", IDC_X11XDM, NULL);
            endbox(&cp);
            beginbox(&cp, "Port forwarding", IDC_BOX_TUNNELS2);
            checkbox(&cp, "Local ports accept connections from o&ther hosts",
@@ -2035,10 +2073,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);
 
        }
@@ -2059,11 +2096,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
@@ -2413,20 +2450,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,
@@ -2472,17 +2509,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,
@@ -3022,6 +3059,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:
@@ -3494,6 +3548,16 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                    GetDlgItemText(hwnd, IDC_X11_DISPLAY, cfg.x11_display,
                                   sizeof(cfg.x11_display) - 1);
                break;
+             case IDC_X11MIT:
+             case IDC_X11XDM:
+               if (HIWORD(wParam) == BN_CLICKED ||
+                   HIWORD(wParam) == BN_DOUBLECLICKED) {
+                   if (IsDlgButtonChecked(hwnd, IDC_X11MIT))
+                       cfg.x11_auth = X11_MIT;
+                   else if (IsDlgButtonChecked(hwnd, IDC_X11XDM))
+                       cfg.x11_auth = X11_XDM;
+               }
+               break;
              case IDC_PFWDADD:
                if (HIWORD(wParam) == BN_CLICKED ||
                    HIWORD(wParam) == BN_DOUBLECLICKED) {
@@ -3726,11 +3790,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;
 }
@@ -3910,9 +3974,7 @@ int askappend(void *frontend, char *filename)
        "or Cancel to disable logging.";
     char message[sizeof(msgtemplate) + FILENAME_MAX];
     int mbret;
-    if (cfg.logxfovr != LGXF_ASK) {
-       return ((cfg.logxfovr == LGXF_OVR) ? 2 : 1);
-    }
+
     sprintf(message, msgtemplate, FILENAME_MAX, filename);
 
     mbret = MessageBox(NULL, message, mbtitle,