Introduce framework for authenticating with the local X server.
[u/mdw/putty] / ssh.c
diff --git a/ssh.c b/ssh.c
index 4da6505..c0f06ef 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -166,7 +166,7 @@ static const char *const ssh2_disconnect_reasons[] = {
 
 #define translate(x) if (type == x) return #x
 #define translatec(x,ctx) if (type == x && (pkt_ctx & ctx)) return #x
-char *ssh1_pkt_type(int type)
+static char *ssh1_pkt_type(int type)
 {
     translate(SSH1_MSG_DISCONNECT);
     translate(SSH1_SMSG_PUBLIC_KEY);
@@ -211,7 +211,7 @@ char *ssh1_pkt_type(int type)
     translate(SSH1_CMSG_AUTH_CCARD_RESPONSE);
     return "unknown";
 }
-char *ssh2_pkt_type(int pkt_ctx, int type)
+static char *ssh2_pkt_type(int pkt_ctx, int type)
 {
     translate(SSH2_MSG_DISCONNECT);
     translate(SSH2_MSG_IGNORE);
@@ -625,7 +625,7 @@ struct ssh_tag {
 #define logevent(s) logevent(ssh->frontend, s)
 
 /* logevent, only printf-formatted. */
-void logeventf(Ssh ssh, char *fmt, ...)
+static void logeventf(Ssh ssh, char *fmt, ...)
 {
     va_list ap;
     char *buf;
@@ -1844,7 +1844,7 @@ static int do_ssh_init(Ssh ssh, unsigned char c)
                s->i = -1;
            } else if (s->i < sizeof(s->version) - 1)
                s->version[s->i++] = c;
-       } else if (c == '\n')
+       } else if (c == '\012')
            break;
     }
 
@@ -1894,7 +1894,7 @@ static int do_ssh_init(Ssh ssh, unsigned char c)
        sha_string(&ssh->exhashbase, s->vstring, strcspn(s->vstring, "\r\n"));
        sprintf(vlog, "We claim version: %s", verstring);
        logevent(vlog);
-       strcat(verstring, "\n");
+       strcat(verstring, "\012");
        logevent("Using SSH protocol version 2");
        sk_write(ssh->s, verstring, strlen(verstring));
        ssh->protocol = ssh2_protocol;
@@ -1910,7 +1910,7 @@ static int do_ssh_init(Ssh ssh, unsigned char c)
                sshver);
        sprintf(vlog, "We claim version: %s", verstring);
        logevent(vlog);
-       strcat(verstring, "\n");
+       strcat(verstring, "\012");
 
        logevent("Using SSH protocol version 1");
        sk_write(ssh->s, verstring, strlen(verstring));
@@ -2125,7 +2125,7 @@ static void ssh_throttle_all(Ssh ssh, int enable, int bufsize)
  */
 
 /* Set up a username or password input loop on a given buffer. */
-void setup_userpass_input(Ssh ssh, char *buffer, int buflen, int echo)
+static void setup_userpass_input(Ssh ssh, char *buffer, int buflen, int echo)
 {
     ssh->userpass_input_buffer = buffer;
     ssh->userpass_input_buflen = buflen;
@@ -2139,7 +2139,7 @@ void setup_userpass_input(Ssh ssh, char *buffer, int buflen, int echo)
  * buffer), <0 for failure (user hit ^C/^D, bomb out and exit), 0
  * for inconclusive (keep waiting for more input please).
  */
-int process_userpass_input(Ssh ssh, unsigned char *in, int inlen)
+static int process_userpass_input(Ssh ssh, unsigned char *in, int inlen)
 {
     char c;
 
@@ -3019,6 +3019,7 @@ static void ssh1_protocol(Ssh ssh, unsigned char *in, int inlen, int ispkt)
        logevent("Requesting X11 forwarding");
        ssh->x11auth = x11_invent_auth(proto, sizeof(proto),
                                       data, sizeof(data));
+        x11_get_real_auth(ssh->x11auth, cfg.x11_display);
        if (ssh->v1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) {
            send_packet(ssh, SSH1_CMSG_X11_REQUEST_FORWARDING,
                        PKT_STR, proto, PKT_STR, data,
@@ -4942,6 +4943,7 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, int ispkt)
                ssh2_pkt_addstring(ssh, "password");
                ssh2_pkt_addbool(ssh, FALSE);
                ssh2_pkt_addstring(ssh, s->password);
+               memset(s->password, 0, sizeof(s->password));
                ssh2_pkt_defer(ssh);
                /*
                 * We'll include a string that's an exact multiple of the
@@ -5067,6 +5069,7 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen, int ispkt)
        logevent("Requesting X11 forwarding");
        ssh->x11auth = x11_invent_auth(proto, sizeof(proto),
                                       data, sizeof(data));
+        x11_get_real_auth(ssh->x11auth, cfg.x11_display);
        ssh2_pkt_init(ssh, SSH2_MSG_CHANNEL_REQUEST);
        ssh2_pkt_adduint32(ssh, ssh->mainchan->remoteid);
        ssh2_pkt_addstring(ssh, "x11-req");
@@ -5926,6 +5929,8 @@ static char *ssh_init(void *frontend_handle, void **backend_handle,
     ssh->overall_bufsize = 0;
     ssh->fallback_cmd = 0;
 
+    ssh->protocol = NULL;
+
     p = connect_to_host(ssh, host, port, realhost, nodelay);
     if (p != NULL)
        return p;
@@ -6087,7 +6092,7 @@ void *new_sock_channel(void *handle, Socket s)
  * This is called when stdout/stderr (the entity to which
  * from_backend sends data) manages to clear some backlog.
  */
-void ssh_unthrottle(void *handle, int bufsize)
+static void ssh_unthrottle(void *handle, int bufsize)
 {
     Ssh ssh = (Ssh) handle;
     if (ssh->version == 1) {