<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">(Allow|Deny)Users patch against 1.2.20 from Steve Kann &lt;stevek@SteveK.COM&gt;
----------------------------------------------------------------------
diff -ru ./servconf.c /opt/ssh/v1.2.20/src/servconf.c
--- ./servconf.c	Tue Apr 22 20:40:08 1997
+++ /opt/ssh/v1.2.20/src/servconf.c	Thu Apr 24 12:13:34 1997
@@ -94,6 +94,8 @@
   options-&gt;forced_passwd_change = -1;
   options-&gt;num_allow_hosts = 0;
   options-&gt;num_deny_hosts = 0;
+  options-&gt;num_allow_users = 0;
+  options-&gt;num_deny_users = 0;
   options-&gt;umask = -1;
   options-&gt;idle_timeout = -1;
 }
@@ -190,11 +192,11 @@
   sPermitRootLogin, sQuietMode, sFascistLogging, sLogFacility,
   sRhostsAuthentication, sRhostsRSAAuthentication, sRSAAuthentication,
   sTISAuthentication, sPasswordAuthentication, sAllowHosts, sDenyHosts,
-  sListenAddress, sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset,
-  sStrictModes, sEmptyPasswd, sRandomSeedFile, sKeepAlives, sPidFile,
-  sForcedPasswd, sUmask, sSilentDeny, sIdleTimeout, sUseLogin,
-  sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTgtPassing,
-  sAllowTcpForwarding
+  sAllowUsers, sDenyUsers, sListenAddress, sPrintMotd, sIgnoreRhosts,
+  sX11Forwarding, sX11DisplayOffset, sStrictModes, sEmptyPasswd,
+  sRandomSeedFile, sKeepAlives, sPidFile, sForcedPasswd, sUmask,
+  sSilentDeny, sIdleTimeout, sUseLogin, sKerberosAuthentication,
+  sKerberosOrLocalPasswd, sKerberosTgtPassing, sAllowTcpForwarding 
 } ServerOpCodes;
 
 /* Textual representation of the tokens. */
@@ -221,6 +223,8 @@
   { "uselogin", sUseLogin },
   { "allowhosts", sAllowHosts },
   { "denyhosts", sDenyHosts },
+  { "allowusers", sAllowUsers },
+  { "denyusers", sDenyUsers },
   { "listenaddress", sListenAddress },
   { "printmotd", sPrintMotd },
   { "ignorerhosts", sIgnoreRhosts },
@@ -630,6 +634,32 @@
 		  exit(1);
 		}
 	      options-&gt;deny_hosts[options-&gt;num_deny_hosts++] = xstrdup(cp);
+	    }
+	  break;
+
+	case sAllowUsers:
+	  while ((cp = strtok(NULL, WHITESPACE)))
+	    {
+	      if (options-&gt;num_allow_users &gt;= MAX_ALLOW_USERS)
+		{
+		  fprintf(stderr, "%s line %d: too many allow users.\n",
+			  filename, linenum);
+		  exit(1);
+		}
+	      options-&gt;allow_users[options-&gt;num_allow_users++] = xstrdup(cp);
+	    }
+	  break;
+
+	case sDenyUsers:
+	  while ((cp = strtok(NULL, WHITESPACE)))
+	    {
+	      if (options-&gt;num_deny_users &gt;= MAX_DENY_USERS)
+		{
+		  fprintf(stderr, "%s line %d: too many deny users.\n",
+			  filename, linenum);
+		  exit(1);
+		}
+	      options-&gt;deny_users[options-&gt;num_deny_users++] = xstrdup(cp);
 	    }
 	  break;
 
diff -ru ./servconf.h /opt/ssh/v1.2.20/src/servconf.h
--- ./servconf.h	Tue Apr 22 20:40:16 1997
+++ /opt/ssh/v1.2.20/src/servconf.h	Thu Apr 24 12:10:13 1997
@@ -46,6 +46,8 @@
 
 #define MAX_ALLOW_HOSTS		256 /* Max # hosts on allow list. */
 #define MAX_DENY_HOSTS		256 /* Max # hosts on deny list. */
+#define MAX_ALLOW_USERS		256 /* Max # users on allow list. */
+#define MAX_DENY_USERS		256 /* Max # users on deny list. */
 
 typedef struct
 {
@@ -90,6 +92,10 @@
   char *allow_hosts[MAX_ALLOW_HOSTS];
   unsigned int num_deny_hosts;
   char *deny_hosts[MAX_DENY_HOSTS];
+  unsigned int num_allow_users;
+  char *allow_users[MAX_ALLOW_USERS];
+  unsigned int num_deny_users;
+  char *deny_users[MAX_DENY_USERS];
 } ServerOptions;
 
 /* Initializes the server options to special values that indicate that they
diff -ru ./sshd.8.in /opt/ssh/v1.2.20/src/sshd.8.in
--- ./sshd.8.in	Tue Apr 22 20:40:07 1997
+++ /opt/ssh/v1.2.20/src/sshd.8.in	Thu Apr 24 12:39:39 1997
@@ -274,9 +274,24 @@
 can also be configured to use tcp_wrappers using the --with-libwrap
 compile-time configuration option.
 .TP
+.B AllowUsers
+This keyword can be followed by any number of user name patterns,
+separated by spaces.  If specified, login is allowed only as users whose
+name matches one of the patterns.  '*' and '?' can be used as wildcards
+in the patterns.  By default, logins as all users are allowed.  
+
+Note that the all other login authentication steps must still be
+sucessfully completed.  AllowUsers and DenyUsers are additional
+restrictions.
+.TP
 .B DenyHosts
 This keyword can be followed by any number of host name patterns,
 separated by spaces.  If specified, login is disallowed from the hosts
+whose name matches any of the patterns.
+.TP
+.B DenyUsers
+This keyword can be followed by any number of user name patterns,
+separated by spaces.  If specified, login is disallowed as users
 whose name matches any of the patterns.
 .TP
 .B FascistLogging
diff -ru ./sshd.c /opt/ssh/v1.2.20/src/sshd.c
--- ./sshd.c	Tue Apr 22 20:40:08 1997
+++ /opt/ssh/v1.2.20/src/sshd.c	Thu Apr 24 12:19:12 1997
@@ -1572,6 +1572,36 @@
       }
   }
 #endif /* CHECK_ETC_SHELLS */
+
+  /* here we check the AllowUser and DenyUser config options - SteveK */
+  /* Check whether logins are permitted for this user. */
+  if (options.num_allow_users &gt; 0)
+    {
+      int i;
+      for (i = 0; i &lt; options.num_allow_users; i++)
+      if (match_pattern(user, options.allow_users[i]))
+        break;
+      if (i &gt;= options.num_allow_users)
+      {
+        log_msg("Connection for %.200s not allowed from %s\n",
+              user, get_canonical_hostname());
+        return 0;
+      }
+    }
+
+   /* Check whether logins are denied for this user. */
+   if (options.num_deny_users &gt; 0)
+     {
+       int i;
+       for (i = 0; i &lt; options.num_deny_users; i++)
+       if (match_pattern(user, options.deny_users[i]))
+       {
+         log_msg("Connection for %.200s denied from %s\n",
+               user, get_canonical_hostname());
+         return 0;
+       }
+     }
+ 
   return 1;
 }
 
</pre></body></html>