Merge branch 'vendor/OPENSSH'
[dragonfly.git] / crypto / openssh / sshd.c
index 481d001..d64bc21 100644 (file)
@@ -84,6 +84,7 @@
 #include <prot.h>
 #endif
 
+#include <resolv.h>
 #include "xmalloc.h"
 #include "ssh.h"
 #include "ssh1.h"
 #define REEXEC_CONFIG_PASS_FD          (STDERR_FILENO + 3)
 #define REEXEC_MIN_FREE_FD             (STDERR_FILENO + 4)
 
+int myflag = 0;
+
+
 extern char *__progname;
 
 /* Server configuration options. */
@@ -485,6 +489,9 @@ sshd_exchange_identification(int sock_in, int sock_out)
        }
        debug("Client protocol version %d.%d; client software version %.100s",
            remote_major, remote_minor, remote_version);
+       logit("SSH: Server;Ltype: Version;Remote: %s-%d;Protocol: %d.%d;Client: %.100s",
+             get_remote_ipaddr(), get_remote_port(),
+           remote_major, remote_minor, remote_version);
 
        compat_datafellows(remote_version);
 
@@ -1092,6 +1099,8 @@ server_listen(void)
        int ret, listen_sock, on = 1;
        struct addrinfo *ai;
        char ntop[NI_MAXHOST], strport[NI_MAXSERV];
+       int socksize;
+       int socksizelen = sizeof(int);
 
        for (ai = options.listen_addrs; ai; ai = ai->ai_next) {
                if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
@@ -1132,6 +1141,11 @@ server_listen(void)
 
                debug("Bind to port %s on %s.", strport, ntop);
 
+               getsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF,
+                                  &socksize, &socksizelen);
+               debug("Server TCP RWIN socket size: %d", socksize);
+               debug("HPN Buffer Size: %d", options.hpn_buffer_size);
+
                /* Bind the socket to the desired port. */
                if (bind(listen_sock, ai->ai_addr, ai->ai_addrlen) < 0) {
                        error("Bind to port %s on %s failed: %.200s.",
@@ -1707,6 +1721,21 @@ main(int ac, char **av)
 
        for (i = 0; i < options.num_host_key_files; i++) {
                key = key_load_private(options.host_key_files[i], "", NULL);
+               if (key && blacklisted_key(key)) {
+                       char *fp;
+                       fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
+                       if (options.permit_blacklisted_keys)
+                               error("Host key %s blacklisted (see "
+                                   "ssh-vulnkey(1)); continuing anyway", fp);
+                       else
+                               error("Host key %s blacklisted (see "
+                                   "ssh-vulnkey(1))", fp);
+                       xfree(fp);
+                       if (!options.permit_blacklisted_keys) {
+                               sensitive_data.host_keys[i] = NULL;
+                               continue;
+                       }
+               }
                pubkey = key_load_public(options.host_key_files[i], NULL);
                sensitive_data.host_keys[i] = key;
                sensitive_data.host_pubkeys[i] = pubkey;
@@ -1951,6 +1980,15 @@ main(int ac, char **av)
        /* This is the child processing a new connection. */
        setproctitle("%s", "[accepted]");
 
+       /*
+        * Initialize the resolver.  This may not happen automatically
+        * before privsep chroot().
+        */
+       if ((_res.options & RES_INIT) == 0) {
+               debug("res_init()");
+               res_init();
+       }
+
        /*
         * Create a new session and process group since the 4.4BSD
         * setlogin() affects the entire process group.  We don't
@@ -2060,6 +2098,9 @@ main(int ac, char **av)
            remote_ip, remote_port,
            get_local_ipaddr(sock_in), get_local_port());
 
+       /* set the HPN options for the child */
+       channel_set_hpn(options.hpn_disabled, options.hpn_buffer_size);
+
        /*
         * We don't want to listen forever unless the other side
         * successfully authenticates itself.  So we set up an alarm which is
@@ -2449,9 +2490,15 @@ do_ssh2_kex(void)
        char *myproposal[PROPOSAL_MAX] = { KEX_SERVER };
        Kex *kex;
 
+       myflag++;
+       debug ("MYFLAG IS %d", myflag);
        if (options.ciphers != NULL) {
                myproposal[PROPOSAL_ENC_ALGS_CTOS] =
                myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers;
+       } else if (options.none_enabled == 1) {
+               debug ("WARNING: None cipher enabled");
+               myproposal[PROPOSAL_ENC_ALGS_CTOS] =
+               myproposal[PROPOSAL_ENC_ALGS_STOC] = KEX_ENCRYPT_INCLUDE_NONE;
        }
        myproposal[PROPOSAL_ENC_ALGS_CTOS] =
            compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_CTOS]);