Fix cosmetic keyboard-interactive issue: at the end of a normal k-i session,
[sgt/putty] / ssh.c
diff --git a/ssh.c b/ssh.c
index cdf321f..e1740f1 100644 (file)
--- a/ssh.c
+++ b/ssh.c
@@ -4996,10 +4996,10 @@ static void do_ssh1_connection(Ssh ssh, unsigned char *in, int inlen,
        }
     }
 
-    if (ssh->cfg.x11_forward) {
+    if (ssh->cfg.x11_forward &&
+       (ssh->x11disp = x11_setup_display(ssh->cfg.x11_display,
+                                         ssh->cfg.x11_auth, &ssh->cfg))) {
        logevent("Requesting X11 forwarding");
-       ssh->x11disp = x11_setup_display(ssh->cfg.x11_display,
-                                        ssh->cfg.x11_auth, &ssh->cfg);
        /*
         * Note that while we blank the X authentication data here, we don't
         * take any special action to blank the start of an X11 channel,
@@ -8103,23 +8103,6 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
                    ssh_pkt_getstring(pktin, &lang, &lang_len);
                    s->cur_prompt = new_prompts(ssh->frontend);
                    s->cur_prompt->to_server = TRUE;
-                   if (name_len) {
-                       /* FIXME: better prefix to distinguish from
-                        * local prompts? */
-                       s->cur_prompt->name =
-                           dupprintf("SSH server: %.*s", name_len, name);
-                       s->cur_prompt->name_reqd = TRUE;
-                   } else {
-                       s->cur_prompt->name =
-                           dupstr("SSH server authentication");
-                       s->cur_prompt->name_reqd = FALSE;
-                   }
-                   /* FIXME: ugly to print "Using..." in prompt _every_
-                    * time round. Can this be done more subtly? */
-                   s->cur_prompt->instruction =
-                       dupprintf("Using keyboard-interactive authentication.%s%.*s",
-                                 inst_len ? "\n" : "", inst_len, inst);
-                   s->cur_prompt->instr_reqd = TRUE;
 
                    /*
                     * Get any prompt(s) from the packet.
@@ -8143,6 +8126,33 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
                                   echo, SSH_MAX_PASSWORD_LEN);
                    }
 
+                   if (name_len) {
+                       /* FIXME: better prefix to distinguish from
+                        * local prompts? */
+                       s->cur_prompt->name =
+                           dupprintf("SSH server: %.*s", name_len, name);
+                       s->cur_prompt->name_reqd = TRUE;
+                   } else {
+                       s->cur_prompt->name =
+                           dupstr("SSH server authentication");
+                       s->cur_prompt->name_reqd = FALSE;
+                   }
+                   /* We add a prefix to try to make it clear that a prompt
+                    * has come from the server.
+                    * FIXME: ugly to print "Using..." in prompt _every_
+                    * time round. Can this be done more subtly? */
+                   /* Special case: for reasons best known to themselves,
+                    * some servers send k-i requests with no prompts and
+                    * nothing to display. Keep quiet in this case. */
+                   if (s->num_prompts || name_len || inst_len) {
+                       s->cur_prompt->instruction =
+                           dupprintf("Using keyboard-interactive authentication.%s%.*s",
+                                     inst_len ? "\n" : "", inst_len, inst);
+                       s->cur_prompt->instr_reqd = TRUE;
+                   } else {
+                       s->cur_prompt->instr_reqd = FALSE;
+                   }
+
                    /*
                      * Display any instructions, and get the user's
                      * response(s).
@@ -8577,10 +8587,10 @@ static void do_ssh2_authconn(Ssh ssh, unsigned char *in, int inlen,
     /*
      * Potentially enable X11 forwarding.
      */
-    if (ssh->mainchan && !ssh->ncmode && ssh->cfg.x11_forward) {
+    if (ssh->mainchan && !ssh->ncmode && ssh->cfg.x11_forward &&
+       (ssh->x11disp = x11_setup_display(ssh->cfg.x11_display,
+                                         ssh->cfg.x11_auth, &ssh->cfg))) {
        logevent("Requesting X11 forwarding");
-       ssh->x11disp = x11_setup_display(ssh->cfg.x11_display,
-                                        ssh->cfg.x11_auth, &ssh->cfg);
        s->pktout = ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
        ssh2_pkt_adduint32(s->pktout, ssh->mainchan->remoteid);
        ssh2_pkt_addstring(s->pktout, "x11-req");