commit:     9b74fc16d7b050757989bd8ebba1366e3b8eeda1
Author:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
AuthorDate: Wed Apr 11 02:16:28 2018 +0000
Commit:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
CommitDate: Wed Apr 11 02:43:57 2018 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=9b74fc16

net-misc/openssh: Bump to v7.7_p1

Ebuild changes:
===============
- HPN patch set updated to v14.14. MT AES CTR cipher are still not
  working at the moment but we are working on this.

- SCTP patch updated for openssh-7.7_p1.

- LDAP patch is currently not available because patch isn't compatble
  with openssh-7.7_p1 and needs a major rewrite because upstream removed
  auth_parse_options() via commit 7c8568576071.

- X.509 patch updated to v11.3.1.

- Previously, SCTP patch sometimes got applied even when "sctp" USE flag
  wasn't set, this is now fixed.

- We now always expose applied patches in version string (previously
  this was only the case for some patches and was also depending on
  whether the "hpn" USE flag was enabled or not).

- Make sure "/var/empty" gets preserved by package manager. [Bug 647034]

- Runscript: "use" entropy. [Bug 470020]

- Runscript: Use "/run" instead of "/var/run". [Bug 555734]

- Runscript: Verify daemon is really up and running. [Bug 617596]

- Runscript: Simplified (thanks to Michael Orlitzky)

- Runscript: Add prefix support. [Bug 640666]

- Runscript: It is now possible to pass any by start-stop-daemon supported
             arguments (like "--ionice" or "--nicelevel" for example) to
             start-stop-daemon. [Bug 636764]

Closes: https://bugs.gentoo.org/470020
Closes: https://bugs.gentoo.org/555734
Closes: https://bugs.gentoo.org/617596
Closes: https://bugs.gentoo.org/636764
Closes: https://bugs.gentoo.org/640666
Closes: https://bugs.gentoo.org/647034
Closes: https://bugs.gentoo.org/652438
Package-Manager: Portage-2.3.28, Repoman-2.3.9

 net-misc/openssh/Manifest                          |   4 +
 .../openssh/files/openssh-7.7_p1-GSSAPI-dns.patch  | 351 ++++++++++++++++++
 net-misc/openssh/files/sshd-r1.confd               |  33 ++
 net-misc/openssh/files/sshd.rc6.5                  |  89 +++++
 net-misc/openssh/openssh-7.7_p1.ebuild             | 406 +++++++++++++++++++++
 5 files changed, 883 insertions(+)

diff --git a/net-misc/openssh/Manifest b/net-misc/openssh/Manifest
index 299ae83a14c..7817efe9f09 100644
--- a/net-misc/openssh/Manifest
+++ b/net-misc/openssh/Manifest
@@ -6,5 +6,9 @@ DIST openssh-7.6_p1-sctp.patch.xz 6996 BLAKE2B 
4a857afdc8fa5cb2bfb9dd1805ac6343e
 DIST openssh-7.6p1+x509-11.2.diff.gz 466657 BLAKE2B 
3f4f108e2d97eb292c215bc3a6e2c64ae6b9e49704f46f46a21496a71d5ebd051ab648446bf71ef141e2114f4a03363d8cd043f5813f957c2c5f2e2eb193931d
 SHA512 
1c0fea91037bfcaed7aa3f0cb01d262410a99d3e1b98a25a012db5d683f3275ab52f78f1e446bd7e543c78f9d406b1dce2bb3997214534ae94e11c254658080f
 DIST openssh-7.6p1-hpnssh14v12-r1.tar.xz 15440 BLAKE2B 
e140852a3ce63e4f744ed4b18b474cf88d09ca55509e5a16d26eef5cf8574466b472073eef56e19467932959d9ba7e941ab561d9ea0704dfee3fd08a6ba7ba8c
 SHA512 
9d0450ec99fe550d790e471cb7815d0863788cf9c41dfef653d102f02be3d38a09e5103e537658279216a5815c1a075ded9f011e05ce216beee2c7daeea8c75a
 DIST openssh-7.6p1.tar.gz 1489788 BLAKE2B 
938bfeeff0a0aaa2fc7e4c345f04561c6c071c526e354a7d344a08742cb70ab1f4a41d325b31720f2fba5c4afa4db11f3fc87055c8c9c8bea37b29cc11dc8f39
 SHA512 
de17fdcb8239401f76740c8d689a8761802f6df94e68d953f3c70b9f4f8bdb403617c48c1d01cc8c368d88e9d50aee540bf03d5a36687dfb39dfd28d73029d72
+DIST openssh-7.7p1-hpnssh14v14-gentoo1.patch.xz 21448 BLAKE2B 
51d9324990d8098707359f355b9212679db38569e566f47659ffdae8046bdbb4e6873bd67ecb7da0b5706c5243f44f82089f08ecbc59c7e39062fceb4be78316
 SHA512 
63d2ffbcfe121ddedaa07955b1025d2c6e196ea694464610437368835cf46dd507d4d17361548cae93db53a1e3d93d9c409910620bbd0cd619d82b6215c833b5
+DIST openssh-7.7p1-sctp-1.0.patch.xz 7380 BLAKE2B 
6ad40972ece131ff148ede6ba94d63bffc606e0bcabb959d4c9056196cb6f4fddc285f97d7b49b73fde7ee84e3c981c07bddb058ad88eb7c7c2fe716e657c630
 SHA512 
bc5f50805ba25415f93f61b6654e5bcbaef673b0af48d339116ca9c94b6152afae294c5a9144adeb40190da97c2fc73b43e3ac7ac34feb4a647628327a7cac0a
+DIST openssh-7.7p1-x509-11.3.1.patch.xz 362672 BLAKE2B 
55b8b0ef00dc4d962a0db1115406b7b1e84110870c74198e9e4cb081b2ffde8daca67cb281c69d73b4c5cbffde361429d62634be194b57e888a0b434a0f42a37
 SHA512 
f84744f6d2e5a15017bce37bfa65ebb47dbafeac07ea9aab46bdc780b4062ff70687512d9d512cab81e3b9c701adb6ce17c5474f35cb4b49f57db2e2d45ac9ac
+DIST openssh-7.7p1.tar.gz 1536900 BLAKE2B 
7aee360f2cea5bfa3f8426fcbd66fde2568f05f9c8e623326b60f03b7c5f8abf223e178aa1d5958015b51627565bf5b1ace35b57f309638c908f5a7bf5500d21
 SHA512 
597252cb48209a0cb98ca1928a67e8d63e4275252f25bc37269204c108f034baade6ba0634e32ae63422fddd280f73096a6b31ad2f2e7a848dde75ca30e14261
 DIST openssh-lpk-7.5p1-0.3.14.patch.xz 17040 BLAKE2B 
5b2204316dd244bb8dd11db50d5bc3a194e2cc4b64964a2d3df68bbe54c53588f15fc5176dbc3811e929573fa3e41cf91f412aa2513bb9a4b6ed02c2523c1e24
 SHA512 
9ce5d7e5d831c972f0f866b686bf93a048a03979ab38627973f5491eeeaa45f9faab0520b3a7ed90a13a67213fdc9cd4cf11e423acad441ea91b71037c8b435b
 DIST openssh-lpk-7.6p1-0.3.14.patch.xz 17044 BLAKE2B 
a31dcb15848d3a22306108a4e181b1d52b195e6adcd2a78d5c7bf57f33c8ed62c3affa434c8d31c07eae84b59f1a3968a3f2a92e702f9225b121127616cb9d61
 SHA512 
e9a2b18fd6a58354198b6e48199059d055451a5f09c99bf7293d0d54137a59c581a9cb3bd906f31589e03d8450fb017b9015e18c67b7b6ae840e336039436974

diff --git a/net-misc/openssh/files/openssh-7.7_p1-GSSAPI-dns.patch 
b/net-misc/openssh/files/openssh-7.7_p1-GSSAPI-dns.patch
new file mode 100644
index 00000000000..2840652a9b4
--- /dev/null
+++ b/net-misc/openssh/files/openssh-7.7_p1-GSSAPI-dns.patch
@@ -0,0 +1,351 @@
+https://bugs.gentoo.org/165444
+https://bugzilla.mindrot.org/show_bug.cgi?id=1008
+
+--- a/auth.c
++++ b/auth.c
+@@ -728,120 +728,6 @@ fakepw(void)
+       return (&fake);
+ }
+ 
+-/*
+- * Returns the remote DNS hostname as a string. The returned string must not
+- * be freed. NB. this will usually trigger a DNS query the first time it is
+- * called.
+- * This function does additional checks on the hostname to mitigate some
+- * attacks on legacy rhosts-style authentication.
+- * XXX is RhostsRSAAuthentication vulnerable to these?
+- * XXX Can we remove these checks? (or if not, remove 
RhostsRSAAuthentication?)
+- */
+-
+-static char *
+-remote_hostname(struct ssh *ssh)
+-{
+-      struct sockaddr_storage from;
+-      socklen_t fromlen;
+-      struct addrinfo hints, *ai, *aitop;
+-      char name[NI_MAXHOST], ntop2[NI_MAXHOST];
+-      const char *ntop = ssh_remote_ipaddr(ssh);
+-
+-      /* Get IP address of client. */
+-      fromlen = sizeof(from);
+-      memset(&from, 0, sizeof(from));
+-      if (getpeername(ssh_packet_get_connection_in(ssh),
+-          (struct sockaddr *)&from, &fromlen) < 0) {
+-              debug("getpeername failed: %.100s", strerror(errno));
+-              return strdup(ntop);
+-      }
+-
+-      ipv64_normalise_mapped(&from, &fromlen);
+-      if (from.ss_family == AF_INET6)
+-              fromlen = sizeof(struct sockaddr_in6);
+-
+-      debug3("Trying to reverse map address %.100s.", ntop);
+-      /* Map the IP address to a host name. */
+-      if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
+-          NULL, 0, NI_NAMEREQD) != 0) {
+-              /* Host name not found.  Use ip address. */
+-              return strdup(ntop);
+-      }
+-
+-      /*
+-       * if reverse lookup result looks like a numeric hostname,
+-       * someone is trying to trick us by PTR record like following:
+-       *      1.1.1.10.in-addr.arpa.  IN PTR  2.3.4.5
+-       */
+-      memset(&hints, 0, sizeof(hints));
+-      hints.ai_socktype = SOCK_DGRAM; /*dummy*/
+-      hints.ai_flags = AI_NUMERICHOST;
+-      if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
+-              logit("Nasty PTR record \"%s\" is set up for %s, ignoring",
+-                  name, ntop);
+-              freeaddrinfo(ai);
+-              return strdup(ntop);
+-      }
+-
+-      /* Names are stored in lowercase. */
+-      lowercase(name);
+-
+-      /*
+-       * Map it back to an IP address and check that the given
+-       * address actually is an address of this host.  This is
+-       * necessary because anyone with access to a name server can
+-       * define arbitrary names for an IP address. Mapping from
+-       * name to IP address can be trusted better (but can still be
+-       * fooled if the intruder has access to the name server of
+-       * the domain).
+-       */
+-      memset(&hints, 0, sizeof(hints));
+-      hints.ai_family = from.ss_family;
+-      hints.ai_socktype = SOCK_STREAM;
+-      if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
+-              logit("reverse mapping checking getaddrinfo for %.700s "
+-                  "[%s] failed.", name, ntop);
+-              return strdup(ntop);
+-      }
+-      /* Look for the address from the list of addresses. */
+-      for (ai = aitop; ai; ai = ai->ai_next) {
+-              if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
+-                  sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
+-                  (strcmp(ntop, ntop2) == 0))
+-                              break;
+-      }
+-      freeaddrinfo(aitop);
+-      /* If we reached the end of the list, the address was not there. */
+-      if (ai == NULL) {
+-              /* Address not found for the host name. */
+-              logit("Address %.100s maps to %.600s, but this does not "
+-                  "map back to the address.", ntop, name);
+-              return strdup(ntop);
+-      }
+-      return strdup(name);
+-}
+-
+-/*
+- * Return the canonical name of the host in the other side of the current
+- * connection.  The host name is cached, so it is efficient to call this
+- * several times.
+- */
+-
+-const char *
+-auth_get_canonical_hostname(struct ssh *ssh, int use_dns)
+-{
+-      static char *dnsname;
+-
+-      if (!use_dns)
+-              return ssh_remote_ipaddr(ssh);
+-      else if (dnsname != NULL)
+-              return dnsname;
+-      else {
+-              dnsname = remote_hostname(ssh);
+-              return dnsname;
+-      }
+-}
+-
+ /*
+  * Runs command in a subprocess wuth a minimal environment.
+  * Returns pid on success, 0 on failure.
+--- a/canohost.c
++++ b/canohost.c
+@@ -202,3 +202,117 @@ get_local_port(int sock)
+ {
+       return get_sock_port(sock, 1);
+ }
++
++/*
++ * Returns the remote DNS hostname as a string. The returned string must not
++ * be freed. NB. this will usually trigger a DNS query the first time it is
++ * called.
++ * This function does additional checks on the hostname to mitigate some
++ * attacks on legacy rhosts-style authentication.
++ * XXX is RhostsRSAAuthentication vulnerable to these?
++ * XXX Can we remove these checks? (or if not, remove 
RhostsRSAAuthentication?)
++ */
++
++static char *
++remote_hostname(struct ssh *ssh)
++{
++      struct sockaddr_storage from;
++      socklen_t fromlen;
++      struct addrinfo hints, *ai, *aitop;
++      char name[NI_MAXHOST], ntop2[NI_MAXHOST];
++      const char *ntop = ssh_remote_ipaddr(ssh);
++
++      /* Get IP address of client. */
++      fromlen = sizeof(from);
++      memset(&from, 0, sizeof(from));
++      if (getpeername(ssh_packet_get_connection_in(ssh),
++          (struct sockaddr *)&from, &fromlen) < 0) {
++              debug("getpeername failed: %.100s", strerror(errno));
++              return strdup(ntop);
++      }
++
++      ipv64_normalise_mapped(&from, &fromlen);
++      if (from.ss_family == AF_INET6)
++              fromlen = sizeof(struct sockaddr_in6);
++
++      debug3("Trying to reverse map address %.100s.", ntop);
++      /* Map the IP address to a host name. */
++      if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
++          NULL, 0, NI_NAMEREQD) != 0) {
++              /* Host name not found.  Use ip address. */
++              return strdup(ntop);
++      }
++
++      /*
++       * if reverse lookup result looks like a numeric hostname,
++       * someone is trying to trick us by PTR record like following:
++       *      1.1.1.10.in-addr.arpa.  IN PTR  2.3.4.5
++       */
++      memset(&hints, 0, sizeof(hints));
++      hints.ai_socktype = SOCK_DGRAM; /*dummy*/
++      hints.ai_flags = AI_NUMERICHOST;
++      if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
++              logit("Nasty PTR record \"%s\" is set up for %s, ignoring",
++                  name, ntop);
++              freeaddrinfo(ai);
++              return strdup(ntop);
++      }
++
++      /* Names are stored in lowercase. */
++      lowercase(name);
++
++      /*
++       * Map it back to an IP address and check that the given
++       * address actually is an address of this host.  This is
++       * necessary because anyone with access to a name server can
++       * define arbitrary names for an IP address. Mapping from
++       * name to IP address can be trusted better (but can still be
++       * fooled if the intruder has access to the name server of
++       * the domain).
++       */
++      memset(&hints, 0, sizeof(hints));
++      hints.ai_family = from.ss_family;
++      hints.ai_socktype = SOCK_STREAM;
++      if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
++              logit("reverse mapping checking getaddrinfo for %.700s "
++                  "[%s] failed.", name, ntop);
++              return strdup(ntop);
++      }
++      /* Look for the address from the list of addresses. */
++      for (ai = aitop; ai; ai = ai->ai_next) {
++              if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
++                  sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
++                  (strcmp(ntop, ntop2) == 0))
++                              break;
++      }
++      freeaddrinfo(aitop);
++      /* If we reached the end of the list, the address was not there. */
++      if (ai == NULL) {
++              /* Address not found for the host name. */
++              logit("Address %.100s maps to %.600s, but this does not "
++                  "map back to the address.", ntop, name);
++              return strdup(ntop);
++      }
++      return strdup(name);
++}
++
++/*
++ * Return the canonical name of the host in the other side of the current
++ * connection.  The host name is cached, so it is efficient to call this
++ * several times.
++ */
++
++const char *
++auth_get_canonical_hostname(struct ssh *ssh, int use_dns)
++{
++      static char *dnsname;
++
++      if (!use_dns)
++              return ssh_remote_ipaddr(ssh);
++      else if (dnsname != NULL)
++              return dnsname;
++      else {
++              dnsname = remote_hostname(ssh);
++              return dnsname;
++      }
++}
+--- a/readconf.c
++++ b/readconf.c
+@@ -160,6 +160,7 @@ typedef enum {
+       oClearAllForwardings, oNoHostAuthenticationForLocalhost,
+       oEnableSSHKeysign, oRekeyLimit, oVerifyHostKeyDNS, oConnectTimeout,
+       oAddressFamily, oGssAuthentication, oGssDelegateCreds,
++      oGssTrustDns,
+       oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly,
+       oSendEnv, oControlPath, oControlMaster, oControlPersist,
+       oHashKnownHosts,
+@@ -200,9 +201,11 @@ static struct {
+ #if defined(GSSAPI)
+       { "gssapiauthentication", oGssAuthentication },
+       { "gssapidelegatecredentials", oGssDelegateCreds },
++      { "gssapitrustdns", oGssTrustDns },
+ # else
+       { "gssapiauthentication", oUnsupported },
+       { "gssapidelegatecredentials", oUnsupported },
++      { "gssapitrustdns", oUnsupported },
+ #endif
+ #ifdef ENABLE_PKCS11
+       { "smartcarddevice", oPKCS11Provider },
+@@ -954,6 +957,10 @@ parse_time:
+               intptr = &options->gss_deleg_creds;
+               goto parse_flag;
+ 
++      case oGssTrustDns:
++              intptr = &options->gss_trust_dns;
++              goto parse_flag;
++
+       case oBatchMode:
+               intptr = &options->batch_mode;
+               goto parse_flag;
+@@ -1766,6 +1773,7 @@ initialize_options(Options * options)
+       options->challenge_response_authentication = -1;
+       options->gss_authentication = -1;
+       options->gss_deleg_creds = -1;
++      options->gss_trust_dns = -1;
+       options->password_authentication = -1;
+       options->kbd_interactive_authentication = -1;
+       options->kbd_interactive_devices = NULL;
+@@ -1908,6 +1916,8 @@ fill_default_options(Options * options)
+               options->gss_authentication = 0;
+       if (options->gss_deleg_creds == -1)
+               options->gss_deleg_creds = 0;
++      if (options->gss_trust_dns == -1)
++              options->gss_trust_dns = 0;
+       if (options->password_authentication == -1)
+               options->password_authentication = 1;
+       if (options->kbd_interactive_authentication == -1)
+--- a/readconf.h
++++ b/readconf.h
+@@ -43,6 +43,7 @@ typedef struct {
+                                       /* Try S/Key or TIS, authentication. */
+       int     gss_authentication;     /* Try GSS authentication */
+       int     gss_deleg_creds;        /* Delegate GSS credentials */
++      int     gss_trust_dns;          /* Trust DNS for GSS canonicalization */
+       int     password_authentication;        /* Try password
+                                                * authentication. */
+       int     kbd_interactive_authentication; /* Try keyboard-interactive 
auth. */
+--- a/ssh_config.5
++++ b/ssh_config.5
+@@ -731,6 +731,16 @@ The default is
+ Forward (delegate) credentials to the server.
+ The default is
+ .Cm no .
++Note that this option applies to protocol version 2 connections using GSSAPI.
++.It Cm GSSAPITrustDns
++Set to
++.Dq yes to indicate that the DNS is trusted to securely canonicalize
++the name of the host being connected to. If
++.Dq no, the hostname entered on the
++command line will be passed untouched to the GSSAPI library.
++The default is
++.Dq no .
++This option only applies to protocol version 2 connections using GSSAPI.
+ .It Cm HashKnownHosts
+ Indicates that
+ .Xr ssh 1
+--- a/sshconnect2.c
++++ b/sshconnect2.c
+@@ -643,6 +643,13 @@ userauth_gssapi(Authctxt *authctxt)
+       static u_int mech = 0;
+       OM_uint32 min;
+       int ok = 0;
++      const char *gss_host;
++
++      if (options.gss_trust_dns) {
++              extern const char *auth_get_canonical_hostname(struct ssh *ssh, 
int use_dns);
++              gss_host = auth_get_canonical_hostname(active_state, 1);
++      } else
++              gss_host = authctxt->host;
+ 
+       /* Try one GSSAPI method at a time, rather than sending them all at
+        * once. */
+@@ -655,7 +662,7 @@ userauth_gssapi(Authctxt *authctxt)
+               /* My DER encoding requires length<128 */
+               if (gss_supported->elements[mech].length < 128 &&
+                   ssh_gssapi_check_mechanism(&gssctxt, 
+-                  &gss_supported->elements[mech], authctxt->host)) {
++                  &gss_supported->elements[mech], gss_host)) {
+                       ok = 1; /* Mechanism works */
+               } else {
+                       mech++;
+-- 

diff --git a/net-misc/openssh/files/sshd-r1.confd 
b/net-misc/openssh/files/sshd-r1.confd
new file mode 100644
index 00000000000..cf430371bf0
--- /dev/null
+++ b/net-misc/openssh/files/sshd-r1.confd
@@ -0,0 +1,33 @@
+# /etc/conf.d/sshd: config file for /etc/init.d/sshd
+
+# Where is your sshd_config file stored?
+
+SSHD_CONFDIR="${RC_PREFIX%/}/etc/ssh"
+
+
+# Any random options you want to pass to sshd.
+# See the sshd(8) manpage for more info.
+
+SSHD_OPTS=""
+
+
+# Wait one second (length chosen arbitrarily) to see if sshd actually
+# creates a PID file, or if it crashes for some reason like not being
+# able to bind to the address in ListenAddress.
+
+#SSHD_SSD_OPTS="--wait 1000"
+
+
+# Pid file to use (needs to be absolute path).
+
+#SSHD_PIDFILE="${RC_PREFIX%/}/run/sshd.pid"
+
+
+# Path to the sshd binary (needs to be absolute path).
+
+#SSHD_BINARY="${RC_PREFIX%/}/usr/sbin/sshd"
+
+
+# Path to the ssh-keygen binary (needs to be absolute path).
+
+#SSHD_KEYGEN_BINARY="${RC_PREFIX%/}/usr/bin/ssh-keygen"

diff --git a/net-misc/openssh/files/sshd.rc6.5 
b/net-misc/openssh/files/sshd.rc6.5
new file mode 100644
index 00000000000..044cbe7268f
--- /dev/null
+++ b/net-misc/openssh/files/sshd.rc6.5
@@ -0,0 +1,89 @@
+#!/sbin/openrc-run
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+extra_commands="checkconfig"
+extra_started_commands="reload"
+
+: ${SSHD_CONFDIR:=${RC_PREFIX%/}/etc/ssh}
+: ${SSHD_CONFIG:=${SSHD_CONFDIR}/sshd_config}
+: ${SSHD_PIDFILE:=${RC_PREFIX%/}/run/${SVCNAME}.pid}
+: ${SSHD_BINARY:=${RC_PREFIX%/}/usr/sbin/sshd}
+: ${SSHD_KEYGEN_BINARY:=${RC_PREFIX%/}/usr/bin/ssh-keygen}
+
+command="${SSHD_BINARY}"
+pidfile="${SSHD_PIDFILE}"
+command_args="${SSHD_OPTS} -o PidFile=${pidfile} -f ${SSHD_CONFIG}"
+
+# Wait one second (length chosen arbitrarily) to see if sshd actually
+# creates a PID file, or if it crashes for some reason like not being
+# able to bind to the address in ListenAddress (bug 617596).
+: ${SSHD_SSD_OPTS:=--wait 1000}
+start_stop_daemon_args="${SSHD_SSD_OPTS}"
+
+depend() {
+       # Entropy can be used by ssh-keygen, among other things, but
+       # is not strictly required (bug 470020).
+       use logger dns entropy
+       if [ "${rc_need+set}" = "set" ] ; then
+               : # Do nothing, the user has explicitly set rc_need
+       else
+               local x warn_addr
+               for x in $(awk '/^ListenAddress/{ print $2 }' "$SSHD_CONFIG" 
2>/dev/null) ; do
+                       case "${x}" in
+                               0.0.0.0|0.0.0.0:*) ;;
+                               ::|\[::\]*) ;;
+                               *) warn_addr="${warn_addr} ${x}" ;;
+                       esac
+               done
+               if [ -n "${warn_addr}" ] ; then
+                       need net
+                       ewarn "You are binding an interface in ListenAddress 
statement in your sshd_config!"
+                       ewarn "You must add rc_need=\"net.FOO\" to your 
${RC_PREFIX%/}/etc/conf.d/sshd"
+                       ewarn "where FOO is the interface(s) providing the 
following address(es):"
+                       ewarn "${warn_addr}"
+               fi
+       fi
+}
+
+checkconfig() {
+       checkpath --directory "${RC_PREFIX%/}/var/empty"
+
+       if [ ! -e "${SSHD_CONFIG}" ] ; then
+               eerror "You need an ${SSHD_CONFIG} file to run sshd"
+               eerror "There is a sample file in /usr/share/doc/openssh"
+               return 1
+       fi
+
+       ${SSHD_KEYGEN_BINARY} -A || return 2
+
+       "${command}" -t ${command_args} || return 3
+}
+
+start_pre() {
+       # If this isn't a restart, make sure that the user's config isn't
+       # busted before we try to start the daemon (this will produce
+       # better error messages than if we just try to start it blindly).
+       #
+       # If, on the other hand, this *is* a restart, then the stop_pre
+       # action will have ensured that the config is usable and we don't
+       # need to do that again.
+       if [ "${RC_CMD}" != "restart" ] ; then
+               checkconfig || return $?
+       fi
+}
+
+stop_pre() {
+       # If this is a restart, check to make sure the user's config
+       # isn't busted before we stop the running daemon.
+       if [ "${RC_CMD}" = "restart" ] ; then
+               checkconfig || return $?
+       fi
+}
+
+reload() {
+       checkconfig || return $?
+       ebegin "Reloading ${SVCNAME}"
+       start-stop-daemon --signal HUP --pidfile "${pidfile}"
+       eend $?
+}

diff --git a/net-misc/openssh/openssh-7.7_p1.ebuild 
b/net-misc/openssh/openssh-7.7_p1.ebuild
new file mode 100644
index 00000000000..ba76b889200
--- /dev/null
+++ b/net-misc/openssh/openssh-7.7_p1.ebuild
@@ -0,0 +1,406 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+inherit user flag-o-matic multilib autotools pam systemd versionator
+
+# Make it more portable between straight releases
+# and _p? releases.
+PARCH=${P/_}
+
+HPN_VER="14v14-gentoo1" HPN_PATCH="${PARCH}-hpnssh${HPN_VER}.patch.xz" 
HPN_DISABLE_MTAES=1
+SCTP_VER="1.0" SCTP_PATCH="${PARCH}-sctp-${SCTP_VER}.patch.xz"
+X509_VER="11.3.1" X509_PATCH="${PARCH}-x509-${X509_VER}.patch.xz"
+
+# Disable LDAP support until someone will rewrite the patch,
+# upstream removed auth_parse_options() via commit 
7c856857607112a3dfe6414696bf4c7ab7fb0cb3
+#LDAP_VER="0.3.14" LDAP_PATCH="${PN}-lpk-7.7p1-${LDAP_VER}.patch.xz"
+
+DESCRIPTION="Port of OpenBSD's free SSH release"
+HOMEPAGE="https://www.openssh.com/";
+SRC_URI="mirror://openbsd/OpenSSH/portable/${PARCH}.tar.gz
+       ${SCTP_PATCH:+https://dev.gentoo.org/~whissi/dist/openssh/${SCTP_PATCH}}
+       ${HPN_PATCH:+hpn? ( 
https://dev.gentoo.org/~whissi/dist/openssh/${HPN_PATCH} )}
+       ${LDAP_PATCH:+ldap? ( 
https://dev.gentoo.org/~whissi/dist/openssh/${LDAP_PATCH} )}
+       ${X509_PATCH:+X509? ( 
https://dev.gentoo.org/~whissi/dist/openssh/${X509_PATCH} )}
+       "
+
+LICENSE="BSD GPL-2"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 
~sh ~sparc ~x86 ~ppc-aix ~x64-cygwin ~amd64-fbsd ~x86-fbsd ~amd64-linux 
~arm-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~m68k-mint 
~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+# Probably want to drop ssl defaulting to on in a future version.
+IUSE="abi_mips_n32 audit bindist debug hpn kerberos kernel_linux ldap ldns 
libedit libressl livecd pam +pie sctp selinux skey +ssl static test X X509"
+REQUIRED_USE="ldns? ( ssl )
+       pie? ( !static )
+       static? ( !kerberos !pam )
+       X509? ( !ldap !sctp ssl )
+       test? ( ssl )"
+
+LIB_DEPEND="
+       audit? ( sys-process/audit[static-libs(+)] )
+       ldns? (
+               net-libs/ldns[static-libs(+)]
+               !bindist? ( net-libs/ldns[ecdsa,ssl(+)] )
+               bindist? ( net-libs/ldns[-ecdsa,ssl(+)] )
+       )
+       libedit? ( dev-libs/libedit:=[static-libs(+)] )
+       sctp? ( net-misc/lksctp-tools[static-libs(+)] )
+       selinux? ( >=sys-libs/libselinux-1.28[static-libs(+)] )
+       skey? ( >=sys-auth/skey-1.1.5-r1[static-libs(+)] )
+       ssl? (
+               !libressl? (
+                       >=dev-libs/openssl-1.0.1:0=[bindist=]
+                       dev-libs/openssl:0=[static-libs(+)]
+               )
+               libressl? ( dev-libs/libressl:0=[static-libs(+)] )
+       )
+       >=sys-libs/zlib-1.2.3:=[static-libs(+)]"
+RDEPEND="
+       !static? ( ${LIB_DEPEND//\[static-libs(+)]} )
+       pam? ( virtual/pam )
+       kerberos? ( virtual/krb5 )
+       ldap? ( net-nds/openldap )"
+DEPEND="${RDEPEND}
+       static? ( ${LIB_DEPEND} )
+       virtual/pkgconfig
+       virtual/os-headers
+       sys-devel/autoconf"
+RDEPEND="${RDEPEND}
+       pam? ( >=sys-auth/pambase-20081028 )
+       userland_GNU? ( virtual/shadow )
+       X? ( x11-apps/xauth )"
+
+S="${WORKDIR}/${PARCH}"
+
+pkg_pretend() {
+       # this sucks, but i'd rather have people unable to `emerge -u openssh`
+       # than not be able to log in to their server any more
+       maybe_fail() { [[ -z ${!2} ]] && echo "$1" ; }
+       local fail="
+               $(use hpn && maybe_fail hpn HPN_PATCH)
+               $(use ldap && maybe_fail ldap LDAP_PATCH)
+               $(use sctp && maybe_fail sctp SCTP_PATCH)
+               $(use X509 && maybe_fail X509 X509_PATCH)
+       "
+       fail=$(echo ${fail})
+       if [[ -n ${fail} ]] ; then
+               eerror "Sorry, but this version does not yet support features"
+               eerror "that you requested:      ${fail}"
+               eerror "Please mask ${PF} for now and check back later:"
+               eerror " # echo '=${CATEGORY}/${PF}' >> 
/etc/portage/package.mask"
+               die "booooo"
+       fi
+
+       # Make sure people who are using tcp wrappers are notified of its 
removal. #531156
+       if grep -qs '^ *sshd *:' "${EROOT%/}"/etc/hosts.{allow,deny} ; then
+               ewarn "Sorry, but openssh no longer supports tcp-wrappers, and 
it seems like"
+               ewarn "you're trying to use it.  Update your 
${EROOT}etc/hosts.{allow,deny} please."
+       fi
+}
+
+src_prepare() {
+       sed -i \
+               -e 
"/_PATH_XAUTH/s:/usr/X11R6/bin/xauth:${EPREFIX%/}/usr/bin/xauth:" \
+               pathnames.h || die
+
+       # don't break .ssh/authorized_keys2 for fun
+       sed -i '/^AuthorizedKeysFile/s:^:#:' sshd_config || die
+
+       eapply "${FILESDIR}"/${PN}-7.7_p1-GSSAPI-dns.patch #165444 integrated 
into gsskex
+       eapply "${FILESDIR}"/${PN}-6.7_p1-openssl-ignore-status.patch
+
+       local PATCHSET_VERSION_MACROS=()
+
+       if use X509 ; then
+               eapply "${WORKDIR}"/${X509_PATCH%.*}
+
+               einfo "Patching version.h to expose X.509 patch set ..."
+               sed -i \
+                       -e "/^#define SSH_PORTABLE.*/a #define SSH_X509         
      \"-PKIXSSH-${X509_VER}\"" \
+                       "${S}"/version.h || die "Failed to sed-in X.509 patch 
version"
+               PATCHSET_VERSION_MACROS+=( 'SSH_X509' )
+
+               einfo "Disabling broken X.509 agent test ..."
+               sed -i \
+                       -e "/^ agent$/d" \
+                       "${S}"/tests/CA/config || die "Failed to disable broken 
X.509 agent test"
+       fi
+
+       if use ldap ; then
+               eapply "${WORKDIR}"/${LDAP_PATCH%.*}
+
+               einfo "Patching version.h to expose LDAP patch set ..."
+               sed -i \
+                       -e "/^#define SSH_PORTABLE.*/a #define SSH_LDAP         
      \"-ldap-${LDAP_VER}\"" \
+                       "${S}"/version.h || die "Failed to sed-in LDAP patch 
version"
+               PATCHSET_VERSION_MACROS+=( 'SSH_LDAP' )
+       fi
+
+       if use sctp ; then
+               eapply "${WORKDIR}"/${SCTP_PATCH%.*}
+
+               einfo "Patching version.h to expose SCTP patch set ..."
+               sed -i \
+                       -e "/^#define SSH_PORTABLE/a #define SSH_SCTP        
\"-sctp-${SCTP_VER}\"" \
+                       "${S}"/version.h || die "Failed to sed-in SCTP patch 
version"
+               PATCHSET_VERSION_MACROS+=( 'SSH_SCTP' )
+
+               einfo "Disabling know failing test (cfgparse) caused by SCTP 
patch ..."
+               sed -i \
+                       -e "/\t\tcfgparse \\\/d" \
+                       "${S}"/regress/Makefile || die "Failed to disable known 
failing test (cfgparse) caused by SCTP patch"
+       fi
+
+       if use hpn ; then
+               eapply "${WORKDIR}"/${HPN_PATCH%.*}
+
+               einfo "Patching Makefile.in for HPN patch set ..."
+               sed -i \
+                       -e "/^LIBS=/ s/\$/ -lpthread/" \
+                       "${S}"/Makefile.in || die "Failed to patch Makefile.in"
+
+               einfo "Patching version.h to expose HPN patch set ..."
+               sed -i \
+                       -e "/^#define SSH_PORTABLE/a #define SSH_HPN         
\"-hpn${HPN_VER}\"" \
+                       "${S}"/version.h || die "Failed to sed-in HPN patch 
version"
+               PATCHSET_VERSION_MACROS+=( 'SSH_HPN' )
+
+               if [[ -n "${HPN_DISABLE_MTAES}" ]] ; then
+                       einfo "Disabling known non-working MT AES cipher per 
default ..."
+
+                       cat > "${T}"/disable_mtaes.conf <<- EOF
+                       
+                       # HPN's Multi-Threaded AES CTR cipher is currently 
known to be broken
+                       # and therefore disabled per default.
+                       DisableMTAES yes
+                       EOF
+                       sed -i \
+                               -e "/^#HPNDisabled.*/r ${T}/disable_mtaes.conf" 
\
+                               "${S}"/sshd_config || die "Failed to disabled 
MT AES ciphers in sshd_config"
+
+                       sed -i \
+                               -e "/AcceptEnv.*_XXX_TEST$/a 
\\\tDisableMTAES\t\tyes" \
+                               "${S}"/regress/test-exec.sh || die "Failed to 
disable MT AES ciphers in test config"
+               fi
+       fi
+
+       if use X509 || use hpn ; then
+               einfo "Patching packet.c for X509 and/or HPN patch set ..."
+               sed -i \
+                       -e "s/const struct sshcipher/struct sshcipher/" \
+                       "${S}"/packet.c || die "Failed to patch 
ssh_packet_set_connection() (packet.c)"
+       fi
+
+       if use X509 || use sctp || use ldap || use hpn ; then
+               einfo "Patching sshconnect.c to use SSH_RELEASE in 
send_client_banner() ..."
+               sed -i \
+                       -e "s/PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, 
SSH_VERSION/PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_RELEASE/" \
+                       "${S}"/sshconnect.c || die "Failed to patch 
send_client_banner() to use SSH_RELEASE (sshconnect.c)"
+
+               einfo "Patching sshd.c to use SSH_RELEASE in 
sshd_exchange_identification() ..."
+               sed -i \
+                       -e "s/PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, 
SSH_VERSION/PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_RELEASE/" \
+                       "${S}"/sshd.c || die "Failed to patch 
sshd_exchange_identification() to use SSH_RELEASE (sshd.c)"
+
+               einfo "Patching version.h to add our patch sets to SSH_RELEASE 
..."
+               sed -i \
+                       -e "s/^#define SSH_RELEASE.*/#define SSH_RELEASE     
SSH_VERSION SSH_PORTABLE ${PATCHSET_VERSION_MACROS[*]}/" \
+                       "${S}"/version.h || die "Failed to patch SSH_RELEASE 
(version.h)"
+       fi
+
+       tc-export PKG_CONFIG
+       local sed_args=(
+               -e "s:-lcrypto:$(${PKG_CONFIG} --libs openssl):"
+               # Disable PATH reset, trust what portage gives us #254615
+               -e 's:^PATH=/:#PATH=/:'
+               # Disable fortify flags ... our gcc does this for us
+               -e 's:-D_FORTIFY_SOURCE=2::'
+       )
+
+       # The -ftrapv flag ICEs on hppa #505182
+       use hppa && sed_args+=(
+               -e '/CFLAGS/s:-ftrapv:-fdisable-this-test:'
+               -e '/OSSH_CHECK_CFLAG_LINK.*-ftrapv/d'
+       )
+       # _XOPEN_SOURCE causes header conflicts on Solaris
+       [[ ${CHOST} == *-solaris* ]] && sed_args+=(
+               -e 's/-D_XOPEN_SOURCE//'
+       )
+       sed -i "${sed_args[@]}" configure{.ac,} || die
+
+       eapply_user #473004
+
+       eautoreconf
+}
+
+src_configure() {
+       addwrite /dev/ptmx
+
+       use debug && append-cppflags -DSANDBOX_SECCOMP_FILTER_DEBUG
+       use static && append-ldflags -static
+
+       local myconf=(
+               --with-ldflags="${LDFLAGS}"
+               --disable-strip
+               --with-pid-dir="${EPREFIX}"$(usex kernel_linux '' '/var')/run
+               --sysconfdir="${EPREFIX%/}"/etc/ssh
+               --libexecdir="${EPREFIX%/}"/usr/$(get_libdir)/misc
+               --datadir="${EPREFIX%/}"/usr/share/openssh
+               --with-privsep-path="${EPREFIX%/}"/var/empty
+               --with-privsep-user=sshd
+               $(use_with audit audit linux)
+               $(use_with kerberos kerberos5 "${EPREFIX%/}"/usr)
+               # We apply the ldap and sctp patch conditionally, so can't pass 
--without-{ldap,sctp}
+               # unconditionally else we get unknown flag warnings.
+               $(use ldap && use_with ldap)
+               $(use sctp && use_with sctp)
+               $(use_with ldns)
+               $(use_with libedit)
+               $(use_with pam)
+               $(use_with pie)
+               $(use_with selinux)
+               $(use_with skey)
+               $(use_with ssl openssl)
+               $(use_with ssl md5-passwords)
+               $(use_with ssl ssl-engine)
+       )
+
+       # The seccomp sandbox is broken on x32, so use the older method for 
now. #553748
+       use amd64 && [[ ${ABI} == "x32" ]] && myconf+=( --with-sandbox=rlimit )
+
+       econf "${myconf[@]}"
+}
+
+src_test() {
+       local t skipped=() failed=() passed=()
+       local tests=( interop-tests compat-tests )
+
+       local shell=$(egetshell "${UID}")
+       if [[ ${shell} == */nologin ]] || [[ ${shell} == */false ]] ; then
+               elog "Running the full OpenSSH testsuite requires a usable 
shell for the 'portage'"
+               elog "user, so we will run a subset only."
+               skipped+=( tests )
+       else
+               tests+=( tests )
+       fi
+
+       # It will also attempt to write to the homedir .ssh.
+       local sshhome=${T}/homedir
+       mkdir -p "${sshhome}"/.ssh
+       for t in "${tests[@]}" ; do
+               # Some tests read from stdin ...
+               HOMEDIR="${sshhome}" HOME="${sshhome}" \
+               emake -k -j1 ${t} </dev/null \
+                       && passed+=( "${t}" ) \
+                       || failed+=( "${t}" )
+       done
+
+       einfo "Passed tests: ${passed[*]}"
+       [[ ${#skipped[@]} -gt 0 ]] && ewarn "Skipped tests: ${skipped[*]}"
+       [[ ${#failed[@]}  -gt 0 ]] && die "Some tests failed: ${failed[*]}"
+}
+
+src_install() {
+       emake install-nokeys DESTDIR="${D}"
+       fperms 600 /etc/ssh/sshd_config
+       dobin contrib/ssh-copy-id
+       newinitd "${FILESDIR}"/sshd.rc6.5 sshd
+       newconfd "${FILESDIR}"/sshd-r1.confd sshd
+
+       newpamd "${FILESDIR}"/sshd.pam_include.2 sshd
+       if use pam ; then
+               sed -i \
+                       -e "/^#UsePAM /s:.*:UsePAM yes:" \
+                       -e "/^#PasswordAuthentication 
/s:.*:PasswordAuthentication no:" \
+                       -e "/^#PrintMotd /s:.*:PrintMotd no:" \
+                       -e "/^#PrintLastLog /s:.*:PrintLastLog no:" \
+                       "${ED%/}"/etc/ssh/sshd_config || die
+       fi
+
+       # Gentoo tweaks to default config files
+       cat <<-EOF >> "${ED%/}"/etc/ssh/sshd_config
+
+       # Allow client to pass locale environment variables #367017
+       AcceptEnv LANG LC_*
+       EOF
+       cat <<-EOF >> "${ED%/}"/etc/ssh/ssh_config
+
+       # Send locale environment variables #367017
+       SendEnv LANG LC_*
+       EOF
+
+       if use livecd ; then
+               sed -i \
+                       -e '/^#PermitRootLogin/c# Allow root login with 
password on livecds.\nPermitRootLogin Yes' \
+                       "${ED%/}"/etc/ssh/sshd_config || die
+       fi
+
+       if use ldap && [[ -n ${LDAP_PATCH} ]] ; then
+               insinto /etc/openldap/schema/
+               newins openssh-lpk_openldap.schema openssh-lpk.schema
+       fi
+
+       doman contrib/ssh-copy-id.1
+       dodoc CREDITS OVERVIEW README* TODO sshd_config
+       use hpn && dodoc HPN-README
+       use X509 || dodoc ChangeLog
+
+       diropts -m 0700
+       dodir /etc/skel/.ssh
+
+       keepdir /var/empty
+
+       systemd_dounit "${FILESDIR}"/sshd.{service,socket}
+       systemd_newunit "${FILESDIR}"/sshd_at.service 'sshd@.service'
+}
+
+pkg_preinst() {
+       enewgroup sshd 22
+       enewuser sshd 22 -1 /var/empty sshd
+}
+
+pkg_postinst() {
+       if has_version "<${CATEGORY}/${PN}-5.8_p1" ; then
+               elog "Starting with openssh-5.8p1, the server will default to a 
newer key"
+               elog "algorithm (ECDSA).  You are encouraged to manually update 
your stored"
+               elog "keys list as servers update theirs.  See ssh-keyscan(1) 
for more info."
+       fi
+       if has_version "<${CATEGORY}/${PN}-7.0_p1" ; then
+               elog "Starting with openssh-6.7, support for USE=tcpd has been 
dropped by upstream."
+               elog "Make sure to update any configs that you might have.  
Note that xinetd might"
+               elog "be an alternative for you as it supports USE=tcpd."
+       fi
+       if has_version "<${CATEGORY}/${PN}-7.1_p1" ; then #557388 #555518
+               elog "Starting with openssh-7.0, support for ssh-dss keys were 
disabled due to their"
+               elog "weak sizes.  If you rely on these key types, you can 
re-enable the key types by"
+               elog "adding to your sshd_config or ~/.ssh/config files:"
+               elog "  PubkeyAcceptedKeyTypes=+ssh-dss"
+               elog "You should however generate new keys using rsa or 
ed25519."
+
+               elog "Starting with openssh-7.0, the default for 
PermitRootLogin changed from 'yes'"
+               elog "to 'prohibit-password'.  That means password auth for 
root users no longer works"
+               elog "out of the box.  If you need this, please update your 
sshd_config explicitly."
+       fi
+       if has_version "<${CATEGORY}/${PN}-7.6_p1" ; then
+               elog "Starting with openssh-7.6p1, openssh upstream has removed 
ssh1 support entirely."
+               elog "Furthermore, rsa keys with less than 1024 bits will be 
refused."
+       fi
+       if ! use ssl && has_version "${CATEGORY}/${PN}[ssl]" ; then
+               elog "Be aware that by disabling openssl support in openssh, 
the server and clients"
+               elog "no longer support dss/rsa/ecdsa keys.  You will need to 
generate ed25519 keys"
+               elog "and update all clients/servers that utilize them."
+       fi
+
+       if use hpn && [[ -n "${HPN_DISABLE_MTAES}" ]] ; then
+               elog ""
+               elog "HPN's multi-threaded AES CTR cipher is currently known to 
be broken"
+               elog "and therefore disabled at runtime per default."
+               elog "Make sure your sshd_config is up to date and contains"
+               elog ""
+               elog "  DisableMTAES yes"
+               elog ""
+               elog "Otherwise you maybe unable to connect to this sshd using 
any AES CTR cipher."
+               elog ""
+       fi
+}

Reply via email to