Add an option to force SSH1 protocol only. Partly for symmetry;
[u/mdw/putty] / windlg.c
index 316115e..474a054 100644 (file)
--- a/windlg.c
+++ b/windlg.c
@@ -438,6 +438,32 @@ enum { IDCX_ABOUT =
     IDC_NODELAY,
     connectionpanelend,
 
+    proxypanelstart,
+    IDC_TITLE_PROXY,
+    IDC_BOX_PROXY1,
+    IDC_PROXYTYPESTATIC,
+    IDC_PROXYTYPENONE,
+    IDC_PROXYTYPEHTTP,
+    IDC_PROXYTYPESOCKS,
+    IDC_PROXYTYPETELNET,
+    IDC_PROXYHOSTSTATIC,
+    IDC_PROXYHOSTEDIT,
+    IDC_PROXYPORTSTATIC,
+    IDC_PROXYPORTEDIT,
+    IDC_PROXYEXCLUDESTATIC,
+    IDC_PROXYEXCLUDEEDIT,
+    IDC_PROXYUSERSTATIC,
+    IDC_PROXYUSEREDIT,
+    IDC_PROXYPASSSTATIC,
+    IDC_PROXYPASSEDIT,
+    IDC_BOX_PROXY2,
+    IDC_PROXYTELNETCMDSTATIC,
+    IDC_PROXYTELNETCMDEDIT,
+    IDC_PROXYSOCKSVERSTATIC,
+    IDC_PROXYSOCKSVER5,
+    IDC_PROXYSOCKSVER4,
+    proxypanelend,
+
     telnetpanelstart,
     IDC_TITLE_TELNET,
     IDC_BOX_TELNET1,
@@ -486,8 +512,10 @@ enum { IDCX_ABOUT =
     IDC_BUGGYMAC,
     IDC_SSH2DES,
     IDC_SSHPROTSTATIC,
+    IDC_SSHPROT1ONLY,
     IDC_SSHPROT1,
     IDC_SSHPROT2,
+    IDC_SSHPROT2ONLY,
     IDC_CMDSTATIC,
     IDC_CMDEDIT,
     IDC_COMPRESS,
@@ -864,8 +892,10 @@ char *help_context_cmd(int id)
       case IDC_BUGGYMAC:
         return "JI(`',`ssh.buggymac')";
       case IDC_SSHPROTSTATIC:
+      case IDC_SSHPROT1ONLY:
       case IDC_SSHPROT1:
       case IDC_SSHPROT2:
+      case IDC_SSHPROT2ONLY:
         return "JI(`',`ssh.protocol')";
       case IDC_CMDSTATIC:
       case IDC_CMDEDIT:
@@ -1123,8 +1153,10 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
     CheckDlgButton(hwnd, IDC_SSH2DES, cfg.ssh2_des_cbc);
     CheckDlgButton(hwnd, IDC_AGENTFWD, cfg.agentfwd);
     CheckDlgButton(hwnd, IDC_CHANGEUSER, cfg.change_username);
-    CheckRadioButton(hwnd, IDC_SSHPROT1, IDC_SSHPROT2,
-                    cfg.sshprot == 1 ? IDC_SSHPROT1 : IDC_SSHPROT2);
+    CheckRadioButton(hwnd, IDC_SSHPROT1ONLY, IDC_SSHPROT2ONLY,
+                    cfg.sshprot == 1 ? IDC_SSHPROT1 :
+                    cfg.sshprot == 2 ? IDC_SSHPROT2 :
+                    cfg.sshprot == 3 ? IDC_SSHPROT2ONLY : IDC_SSHPROT1ONLY);
     CheckDlgButton(hwnd, IDC_AUTHTIS, cfg.try_tis_auth);
     CheckDlgButton(hwnd, IDC_AUTHKI, cfg.try_ki_auth);
     SetDlgItemText(hwnd, IDC_PKEDIT, cfg.keyfile);
@@ -1216,7 +1248,6 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
        int i, nprinters;
        printer_enum *pe;
        pe = printer_start_enum(&nprinters);
-       strcpy(cfg.line_codepage, cp_name(decode_codepage(cfg.line_codepage)));
        SendDlgItemMessage(hwnd, IDC_PRINTER, CB_RESETCONTENT, 0, 0);
        SendDlgItemMessage(hwnd, IDC_PRINTER, CB_ADDSTRING,
                           0, (LPARAM) PRINTER_DISABLED_STRING);
@@ -1243,6 +1274,20 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
     CheckDlgButton(hwnd, IDC_LPORT_ALL, cfg.lport_acceptall);
     CheckDlgButton(hwnd, IDC_RPORT_ALL, cfg.rport_acceptall);
     CheckRadioButton(hwnd, IDC_PFWDLOCAL, IDC_PFWDREMOTE, IDC_PFWDLOCAL);
+
+    /* proxy config */
+    CheckRadioButton(hwnd, IDC_PROXYTYPENONE, IDC_PROXYTYPETELNET,
+                    cfg.proxy_type == PROXY_HTTP ? IDC_PROXYTYPEHTTP :
+                    cfg.proxy_type == PROXY_SOCKS ? IDC_PROXYTYPESOCKS :
+                    cfg.proxy_type == PROXY_TELNET ? IDC_PROXYTYPETELNET : IDC_PROXYTYPENONE);
+    SetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host);
+    SetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, cfg.proxy_port, FALSE);
+    SetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT, cfg.proxy_exclude_list);
+    SetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT, cfg.proxy_telnet_command);
+    SetDlgItemText(hwnd, IDC_PROXYUSEREDIT, cfg.proxy_username);
+    SetDlgItemText(hwnd, IDC_PROXYPASSEDIT, cfg.proxy_password);
+    CheckRadioButton(hwnd, IDC_PROXYSOCKSVER5, IDC_PROXYSOCKSVER4,
+                    cfg.proxy_socks_version == 4 ? IDC_PROXYSOCKSVER4 : IDC_PROXYSOCKSVER5);
 }
 
 struct treeview_faff {
@@ -1687,6 +1732,41 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
        }
     }
 
+    if (panel == proxypanelstart) {
+       /* The Proxy panel. Accelerators used: [acgoh] ntslypeuwmv */
+       struct ctlpos cp;
+       ctlposinit(&cp, hwnd, 80, 3, 13);
+       if (dlgtype == 0) {
+           bartitle(&cp, "Options controlling proxy usage",
+                    IDC_TITLE_PROXY);
+           beginbox(&cp, "Proxy basics", IDC_BOX_PROXY1);
+           radioline(&cp, "Proxy type:", IDC_PROXYTYPESTATIC, 4,
+                     "&None", IDC_PROXYTYPENONE,
+                     "H&TTP", IDC_PROXYTYPEHTTP,
+                     "&SOCKS", IDC_PROXYTYPESOCKS,
+                     "Te&lnet", IDC_PROXYTYPETELNET, NULL);
+           multiedit(&cp,
+                     "Prox&y Host", IDC_PROXYHOSTSTATIC, IDC_PROXYHOSTEDIT, 80,
+                     "&Port", IDC_PROXYPORTSTATIC, IDC_PROXYPORTEDIT, 20, NULL);
+           multiedit(&cp,
+                     "&Exclude Hosts/IPs", IDC_PROXYEXCLUDESTATIC,
+                     IDC_PROXYEXCLUDEEDIT, 100, NULL);
+           staticedit(&cp, "&Username", IDC_PROXYUSERSTATIC,
+                      IDC_PROXYUSEREDIT, 60);
+           staticedit(&cp, "Pass&word", IDC_PROXYPASSSTATIC,
+                      IDC_PROXYPASSEDIT, 60);
+           endbox(&cp);
+           beginbox(&cp, "Misc. proxy settings", IDC_BOX_PROXY2);
+           multiedit(&cp,
+                     "Telnet co&mmand", IDC_PROXYTELNETCMDSTATIC,
+                     IDC_PROXYTELNETCMDEDIT, 100, NULL);
+           radioline(&cp, "SOCKS &Version", IDC_PROXYSOCKSVERSTATIC,
+                     2, "Version 5", IDC_PROXYSOCKSVER5, "Version 4",
+                     IDC_PROXYSOCKSVER4, NULL);
+           endbox(&cp);
+       }
+    }
+
     if (panel == telnetpanelstart) {
        /* The Telnet panel. Accelerators used: [acgoh] svldr bftk */
        struct ctlpos cp;
@@ -1734,7 +1814,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
     }
 
     if (panel == sshpanelstart) {
-       /* The SSH panel. Accelerators used: [acgoh] r pe12i sd */
+       /* The SSH panel. Accelerators used: [acgoh] r pe12ni sd */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        if (dlgtype == 0) {
@@ -1749,8 +1829,10 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
            checkbox(&cp, "Don't allocate a &pseudo-terminal", IDC_NOPTY);
            checkbox(&cp, "Enable compr&ession", IDC_COMPRESS);
            radioline(&cp, "Preferred SSH protocol version:",
-                     IDC_SSHPROTSTATIC, 2,
-                     "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2, NULL);
+                     IDC_SSHPROTSTATIC, 4,
+                     "1 on&ly", IDC_SSHPROT1ONLY,
+                     "&1", IDC_SSHPROT1, "&2", IDC_SSHPROT2,
+                     "2 o&nly", IDC_SSHPROT2ONLY, NULL);
            checkbox(&cp, "&Imitate SSH 2 MAC bug in commercial <= v2.3.x",
                     IDC_BUGGYMAC);
            endbox(&cp);
@@ -1957,6 +2039,7 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
        treeview_insert(&tvfaff, 1, "Colours");
        treeview_insert(&tvfaff, 0, "Connection");
        if (dlgtype == 0) {
+           treeview_insert(&tvfaff, 1, "Proxy");
            treeview_insert(&tvfaff, 1, "Telnet");
            treeview_insert(&tvfaff, 1, "Rlogin");
            if (backends[3].backend != NULL) {
@@ -2040,6 +2123,8 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                create_controls(hwnd, dlgtype, tunnelspanelstart);
            if (!strcmp(buffer, "Connection"))
                create_controls(hwnd, dlgtype, connectionpanelstart);
+           if (!strcmp(buffer, "Proxy"))
+               create_controls(hwnd, dlgtype, proxypanelstart);
            if (!strcmp(buffer, "Telnet"))
                create_controls(hwnd, dlgtype, telnetpanelstart);
            if (!strcmp(buffer, "Rlogin"))
@@ -2741,6 +2826,73 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                    GetDlgItemText(hwnd, IDC_TTEDIT, cfg.termtype,
                                   sizeof(cfg.termtype) - 1);
                break;
+
+               /* proxy config */
+             case IDC_PROXYHOSTEDIT:
+               if (HIWORD(wParam) == EN_CHANGE)
+                   GetDlgItemText(hwnd, IDC_PROXYHOSTEDIT, cfg.proxy_host, 
+                                  sizeof(cfg.proxy_host) - 1);
+               break;
+             case IDC_PROXYPORTEDIT:
+               if (HIWORD(wParam) == EN_CHANGE) {
+                   GetDlgItemText(hwnd, IDC_PROXYPORTEDIT, portname, 31);
+                   if (isdigit(portname[0]))
+                       MyGetDlgItemInt(hwnd, IDC_PROXYPORTEDIT, &cfg.proxy_port);
+                   else {
+                       service = getservbyname(portname, NULL);
+                       if (service)
+                           cfg.proxy_port = ntohs(service->s_port);
+                       else
+                           cfg.proxy_port = 0;
+                   }
+               }
+               break;
+             case IDC_PROXYEXCLUDEEDIT:
+               if (HIWORD(wParam) == EN_CHANGE)
+                   GetDlgItemText(hwnd, IDC_PROXYEXCLUDEEDIT,
+                                  cfg.proxy_exclude_list,
+                                  sizeof(cfg.proxy_exclude_list) - 1);
+               break;
+             case IDC_PROXYUSEREDIT:
+               if (HIWORD(wParam) == EN_CHANGE)
+                   GetDlgItemText(hwnd, IDC_PROXYUSEREDIT,
+                                  cfg.proxy_username, 
+                                  sizeof(cfg.proxy_username) - 1);
+               break;
+             case IDC_PROXYPASSEDIT:
+               if (HIWORD(wParam) == EN_CHANGE)
+                   GetDlgItemText(hwnd, IDC_PROXYPASSEDIT,
+                                  cfg.proxy_password, 
+                                  sizeof(cfg.proxy_password) - 1);
+               break;
+             case IDC_PROXYTELNETCMDEDIT:
+               if (HIWORD(wParam) == EN_CHANGE)
+                   GetDlgItemText(hwnd, IDC_PROXYTELNETCMDEDIT,
+                                  cfg.proxy_telnet_command,
+                                  sizeof(cfg.proxy_telnet_command) - 1);
+               break;
+             case IDC_PROXYSOCKSVER5:
+             case IDC_PROXYSOCKSVER4:
+               if (HIWORD(wParam) == BN_CLICKED ||
+                   HIWORD(wParam) == BN_DOUBLECLICKED) {
+                   cfg.proxy_socks_version =
+                       IsDlgButtonChecked(hwnd, IDC_PROXYSOCKSVER4) ? 4 : 5;
+               }
+               break;
+             case IDC_PROXYTYPENONE:
+             case IDC_PROXYTYPEHTTP:
+             case IDC_PROXYTYPESOCKS:
+             case IDC_PROXYTYPETELNET:
+               if (HIWORD(wParam) == BN_CLICKED ||
+                   HIWORD(wParam) == BN_DOUBLECLICKED) {
+                   cfg.proxy_type =
+                       IsDlgButtonChecked(hwnd, IDC_PROXYTYPEHTTP) ? PROXY_HTTP :
+                       IsDlgButtonChecked(hwnd, IDC_PROXYTYPESOCKS) ? PROXY_SOCKS :
+                       IsDlgButtonChecked(hwnd, IDC_PROXYTYPETELNET) ? PROXY_TELNET :
+                       PROXY_NONE;
+               }
+               break;
+
              case IDC_LGFEDIT:
                if (HIWORD(wParam) == EN_CHANGE)
                    GetDlgItemText(hwnd, IDC_LGFEDIT, cfg.logfilename,
@@ -2942,14 +3094,20 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                                 cfg.ssh_cipherlist, CIPHER_MAX,
                                 0, hwnd, wParam, lParam);
                break;
+             case IDC_SSHPROT1ONLY:
              case IDC_SSHPROT1:
              case IDC_SSHPROT2:
+             case IDC_SSHPROT2ONLY:
                if (HIWORD(wParam) == BN_CLICKED ||
                    HIWORD(wParam) == BN_DOUBLECLICKED) {
+                   if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1ONLY))
+                       cfg.sshprot = 0;
                    if (IsDlgButtonChecked(hwnd, IDC_SSHPROT1))
                        cfg.sshprot = 1;
                    else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2))
                        cfg.sshprot = 2;
+                   else if (IsDlgButtonChecked(hwnd, IDC_SSHPROT2ONLY))
+                       cfg.sshprot = 3;
                }
                break;
              case IDC_AUTHTIS:
@@ -2982,7 +3140,8 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                of.lStructSize = sizeof(of);
 #endif
                of.hwndOwner = hwnd;
-               of.lpstrFilter = "All Files\0*\0\0\0";
+               of.lpstrFilter = "PuTTY Private Key Files\0*.PPK\0"
+                   "AllFiles\0*\0\0\0";
                of.lpstrCustomFilter = NULL;
                of.nFilterIndex = 1;
                of.lpstrFile = filename;