Add support for RFC 4432 RSA key exchange, the patch for which has been
[u/mdw/putty] / settings.c
index 6197c1e..c937d3c 100644 (file)
@@ -27,6 +27,7 @@ static const struct keyval kexnames[] = {
     { "dh-gex-sha1",       KEX_DHGEX },
     { "dh-group14-sha1",    KEX_DHGROUP14 },
     { "dh-group1-sha1",            KEX_DHGROUP1 },
+    { "rsa",               KEX_RSA },
     { "WARN",              KEX_WARN }
 };
 
@@ -231,7 +232,7 @@ static void wprefs(void *sesskey, char *name,
     write_setting_s(sesskey, name, buf);
 }
 
-char *save_settings(char *section, int do_host, Config * cfg)
+char *save_settings(char *section, Config * cfg)
 {
     void *sesskey;
     char *errmsg;
@@ -239,20 +240,18 @@ char *save_settings(char *section, int do_host, Config * cfg)
     sesskey = open_settings_w(section, &errmsg);
     if (!sesskey)
        return errmsg;
-    save_open_settings(sesskey, do_host, cfg);
+    save_open_settings(sesskey, cfg);
     close_settings_w(sesskey);
     return NULL;
 }
 
-void save_open_settings(void *sesskey, int do_host, Config *cfg)
+void save_open_settings(void *sesskey, Config *cfg)
 {
     int i;
     char *p;
 
     write_setting_i(sesskey, "Present", 1);
-    if (do_host) {
-       write_setting_s(sesskey, "HostName", cfg->host);
-    }
+    write_setting_s(sesskey, "HostName", cfg->host);
     write_setting_filename(sesskey, "LogFileName", cfg->logfilename);
     write_setting_i(sesskey, "LogType", cfg->logtype);
     write_setting_i(sesskey, "LogFileClash", cfg->logxfovr);
@@ -297,6 +296,7 @@ void save_open_settings(void *sesskey, int do_host, Config *cfg)
     write_setting_s(sesskey, "LocalUserName", cfg->localusername);
     write_setting_i(sesskey, "NoPTY", cfg->nopty);
     write_setting_i(sesskey, "Compression", cfg->compression);
+    write_setting_i(sesskey, "TryAgent", cfg->tryagent);
     write_setting_i(sesskey, "AgentFwd", cfg->agentfwd);
     write_setting_i(sesskey, "ChangeUsername", cfg->change_username);
     wprefs(sesskey, "Cipher", ciphernames, CIPHER_MAX,
@@ -323,7 +323,7 @@ void save_open_settings(void *sesskey, int do_host, Config *cfg)
     write_setting_i(sesskey, "NoRemoteResize", cfg->no_remote_resize);
     write_setting_i(sesskey, "NoAltScreen", cfg->no_alt_screen);
     write_setting_i(sesskey, "NoRemoteWinTitle", cfg->no_remote_wintitle);
-    write_setting_i(sesskey, "NoRemoteQTitle", cfg->no_remote_qtitle);
+    write_setting_i(sesskey, "RemoteQTitleAction", cfg->remote_qtitle_action);
     write_setting_i(sesskey, "NoDBackspace", cfg->no_dbackspace);
     write_setting_i(sesskey, "NoRemoteCharset", cfg->no_remote_charset);
     write_setting_i(sesskey, "ApplicationCursorKeys", cfg->app_cursor);
@@ -372,6 +372,7 @@ void save_open_settings(void *sesskey, int do_host, Config *cfg)
     write_setting_i(sesskey, "TermWidth", cfg->width);
     write_setting_i(sesskey, "TermHeight", cfg->height);
     write_setting_fontspec(sesskey, "Font", cfg->font);
+    write_setting_i(sesskey, "FontQuality", cfg->font_quality);
     write_setting_i(sesskey, "FontVTMode", cfg->vtmode);
     write_setting_i(sesskey, "UseSystemColours", cfg->system_colour);
     write_setting_i(sesskey, "TryPalette", cfg->try_palette);
@@ -437,18 +438,24 @@ void save_open_settings(void *sesskey, int do_host, Config *cfg)
     write_setting_fontspec(sesskey, "WideBoldFont", cfg->wideboldfont);
     write_setting_i(sesskey, "ShadowBold", cfg->shadowbold);
     write_setting_i(sesskey, "ShadowBoldOffset", cfg->shadowboldoffset);
+    write_setting_s(sesskey, "SerialLine", cfg->serline);
+    write_setting_i(sesskey, "SerialSpeed", cfg->serspeed);
+    write_setting_i(sesskey, "SerialDataBits", cfg->serdatabits);
+    write_setting_i(sesskey, "SerialStopHalfbits", cfg->serstopbits);
+    write_setting_i(sesskey, "SerialParity", cfg->serparity);
+    write_setting_i(sesskey, "SerialFlowControl", cfg->serflow);
 }
 
-void load_settings(char *section, int do_host, Config * cfg)
+void load_settings(char *section, Config * cfg)
 {
     void *sesskey;
 
     sesskey = open_settings_r(section);
-    load_open_settings(sesskey, do_host, cfg);
+    load_open_settings(sesskey, cfg);
     close_settings_r(sesskey);
 }
 
-void load_open_settings(void *sesskey, int do_host, Config *cfg)
+void load_open_settings(void *sesskey, Config *cfg)
 {
     int i;
     char prot[10];
@@ -456,12 +463,9 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
     cfg->ssh_subsys = 0;              /* FIXME: load this properly */
     cfg->remote_cmd_ptr = NULL;
     cfg->remote_cmd_ptr2 = NULL;
+    cfg->ssh_nc_host[0] = '\0';
 
-    if (do_host) {
-       gpps(sesskey, "HostName", "", cfg->host, sizeof(cfg->host));
-    } else {
-       cfg->host[0] = '\0';           /* blank hostname */
-    }
+    gpps(sesskey, "HostName", "", cfg->host, sizeof(cfg->host));
     gppfile(sesskey, "LogFileName", &cfg->logfilename);
     gppi(sesskey, "LogType", 0, &cfg->logtype);
     gppi(sesskey, "LogFileClash", LGXF_ASK, &cfg->logxfovr);
@@ -555,6 +559,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
         sizeof(cfg->localusername));
     gppi(sesskey, "NoPTY", 0, &cfg->nopty);
     gppi(sesskey, "Compression", 0, &cfg->compression);
+    gppi(sesskey, "TryAgent", 1, &cfg->tryagent);
     gppi(sesskey, "AgentFwd", 0, &cfg->agentfwd);
     gppi(sesskey, "ChangeUsername", 0, &cfg->change_username);
     gprefs(sesskey, "Cipher", "\0",
@@ -567,9 +572,9 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
        char *default_kexes;
        gppi(sesskey, "BugDHGEx2", 0, &i); i = 2-i;
        if (i == FORCE_ON)
-           default_kexes = "dh-group14-sha1,dh-group1-sha1,WARN,dh-gex-sha1";
+           default_kexes = "dh-group14-sha1,dh-group1-sha1,rsa,WARN,dh-gex-sha1";
        else
-           default_kexes = "dh-gex-sha1,dh-group14-sha1,dh-group1-sha1,WARN";
+           default_kexes = "dh-gex-sha1,dh-group14-sha1,dh-group1-sha1,rsa,WARN";
        gprefs(sesskey, "KEX", default_kexes,
               kexnames, KEX_MAX, cfg->ssh_kexlist);
     }
@@ -596,7 +601,17 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
     gppi(sesskey, "NoRemoteResize", 0, &cfg->no_remote_resize);
     gppi(sesskey, "NoAltScreen", 0, &cfg->no_alt_screen);
     gppi(sesskey, "NoRemoteWinTitle", 0, &cfg->no_remote_wintitle);
-    gppi(sesskey, "NoRemoteQTitle", 1, &cfg->no_remote_qtitle);
+    {
+       /* Backward compatibility */
+       int no_remote_qtitle;
+       gppi(sesskey, "NoRemoteQTitle", 1, &no_remote_qtitle);
+       /* We deliberately interpret the old setting of "no response" as
+        * "empty string". This changes the behaviour, but hopefully for
+        * the better; the user can always recover the old behaviour. */
+       gppi(sesskey, "RemoteQTitleAction",
+            no_remote_qtitle ? TITLE_EMPTY : TITLE_REAL,
+            &cfg->remote_qtitle_action);
+    }
     gppi(sesskey, "NoDBackspace", 0, &cfg->no_dbackspace);
     gppi(sesskey, "NoRemoteCharset", 0, &cfg->no_remote_charset);
     gppi(sesskey, "ApplicationCursorKeys", 0, &cfg->app_cursor);
@@ -649,6 +664,7 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
     gppi(sesskey, "TermWidth", 80, &cfg->width);
     gppi(sesskey, "TermHeight", 24, &cfg->height);
     gppfont(sesskey, "Font", &cfg->font);
+    gppi(sesskey, "FontQuality", FQ_DEFAULT, &cfg->font_quality);
     gppi(sesskey, "FontVTMode", VT_UNICODE, (int *) &cfg->vtmode);
     gppi(sesskey, "UseSystemColours", 0, &cfg->system_colour);
     gppi(sesskey, "TryPalette", 0, &cfg->try_palette);
@@ -754,11 +770,17 @@ void load_open_settings(void *sesskey, int do_host, Config *cfg)
     gppfont(sesskey, "WideFont", &cfg->widefont);
     gppfont(sesskey, "WideBoldFont", &cfg->wideboldfont);
     gppi(sesskey, "ShadowBoldOffset", 1, &cfg->shadowboldoffset);
+    gpps(sesskey, "SerialLine", "", cfg->serline, sizeof(cfg->serline));
+    gppi(sesskey, "SerialSpeed", 9600, &cfg->serspeed);
+    gppi(sesskey, "SerialDataBits", 8, &cfg->serdatabits);
+    gppi(sesskey, "SerialStopHalfbits", 2, &cfg->serstopbits);
+    gppi(sesskey, "SerialParity", SER_PAR_NONE, &cfg->serparity);
+    gppi(sesskey, "SerialFlowControl", SER_FLOW_XONXOFF, &cfg->serflow);
 }
 
 void do_defaults(char *session, Config * cfg)
 {
-    load_settings(session, (session != NULL && *session), cfg);
+    load_settings(session, cfg);
 }
 
 static int sessioncmp(const void *av, const void *bv)