]> andersk Git - openssh.git/commitdiff
- (tim) [CREDITS LICENCE auth.c configure.ac defines.h includes.h session.c
authortim <tim>
Fri, 26 Aug 2005 20:15:19 +0000 (20:15 +0000)
committertim <tim>
Fri, 26 Aug 2005 20:15:19 +0000 (20:15 +0000)
   openbsd-compat/Makefile.in openbsd-compat/openbsd-compat.h
   openbsd-compat/xcrypt.c] New files [openssh/openbsd-compat/port-uw.c
   openssh/openbsd-compat/port-uw.h] Support long passwords (> 8-char)
   on UnixWare 7 from Dhiraj Gulati and Ahsan Rashid. Cleanup and testing
   by tim@. Feedback and OK dtucker@

13 files changed:
CREDITS
ChangeLog
LICENCE
auth.c
configure.ac
defines.h
includes.h
openbsd-compat/Makefile.in
openbsd-compat/openbsd-compat.h
openbsd-compat/port-uw.c [new file with mode: 0644]
openbsd-compat/port-uw.h [new file with mode: 0644]
openbsd-compat/xcrypt.c
session.c

diff --git a/CREDITS b/CREDITS
index e3877686d7f4fb5617122eda8914e6abd43c6bd5..2d067f9dbc140b12e09e65d33e2dc33f018e6f8d 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -3,6 +3,7 @@ Tatu Ylonen <ylo@cs.hut.fi> - Creator of SSH
 Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos,
 Theo de Raadt, and Dug Song - Creators of OpenSSH
 
+Ahsan Rashid <arms@sco.com> - UnixWare long passwords
 Alain St-Denis <Alain.St-Denis@ec.gc.ca> - Irix fix
 Alexandre Oliva <oliva@lsd.ic.unicamp.br> - AIX fixes
 Andre Lucas <andre@ae-35.com> - new login code, many fixes
@@ -32,6 +33,7 @@ David Del Piero <David.DelPiero@qed.qld.gov.au> - bug fixes
 David Hesprich <darkgrue@gue-tech.org> - Configure fixes
 David Rankin <drankin@bohemians.lexington.ky.us> - libwrap, AIX, NetBSD fixes
 Dag-Erling Smørgrav <des at freebsd.org> - Challenge-Response PAM code.
+Dhiraj Gulati <dgulati@sco.com> - UnixWare long passwords
 Ed Eden <ede370@stl.rural.usda.gov> - configure fixes
 Garrick James <garrick@james.net> - configure fixes
 Gary E. Miller <gem@rellim.com> - SCO support
index 410eb8ed76119d2524edccf599ec9d0a18c445c5..f0ac2bd5f5941e71cceca4dfd1829eb4a3b18ce7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+20050826
+ - (tim) [CREDITS LICENCE auth.c configure.ac defines.h includes.h session.c
+   openbsd-compat/Makefile.in openbsd-compat/openbsd-compat.h
+   openbsd-compat/xcrypt.c] New files [openssh/openbsd-compat/port-uw.c
+   openssh/openbsd-compat/port-uw.h] Support long passwords (> 8-char)
+   on UnixWare 7 from Dhiraj Gulati and Ahsan Rashid. Cleanup and testing
+   by tim@. Feedback and OK dtucker@
+
 20050823
  - (dtucker) [regress/test-exec.sh] Do not prepend an extra "/" to a fully-
    qualified sshd pathname since some systems (eg Cygwin) may consider "/foo"
diff --git a/LICENCE b/LICENCE
index 5def839e5ae524ae77d5e6c4f06195210d3fee22..ac3634f221a923461f08546b2f3c9281d7b21810 100644 (file)
--- a/LICENCE
+++ b/LICENCE
@@ -204,6 +204,7 @@ OpenSSH contains no GPL code.
        William Jones
        Darren Tucker
        Sun Microsystems
+       The SCO Group
 
      * Redistribution and use in source and binary forms, with or without
      * modification, are permitted provided that the following conditions
diff --git a/auth.c b/auth.c
index 82fe8f06b7c53c1088f49154688c3d727021e23b..d62d8ff2235b2f6bfbea18e7c350d9ab265ac5e9 100644 (file)
--- a/auth.c
+++ b/auth.c
@@ -97,7 +97,11 @@ allowed_user(struct passwd * pw)
        /* grab passwd field for locked account check */
 #ifdef USE_SHADOW
        if (spw != NULL)
+#ifdef HAVE_LIBIAF
+               passwd = get_iaf_password(pw);
+#else
                passwd = spw->sp_pwdp;
+#endif /* HAVE_LIBIAF */
 #else
        passwd = pw->pw_passwd;
 #endif
index eea151fe8bdc4f7762b934104b300a0f74a82aa5..fb5a21de0b9e737d4afeac3dc2e3905eaa84d2b2 100644 (file)
@@ -446,6 +446,8 @@ mips-sony-bsd|mips-sony-newsos4)
        ;;
 # UnixWare 7.x, OpenUNIX 8
 *-*-sysv5*)
+       check_for_libcrypt_later=1
+       AC_DEFINE(UNIXWARE_LONG_PASSWORDS, 1, [Support passwords > 8 chars])
        AC_DEFINE(USE_PIPES)
        AC_DEFINE(SETEUID_BREAKS_SETUID)
        AC_DEFINE(BROKEN_SETREUID)
@@ -643,6 +645,7 @@ AC_CHECK_HEADERS( \
        getopt.h \
        glob.h \
        ia.h \
+       iaf.h \
        lastlog.h \
        limits.h \
        login.h \
@@ -1721,6 +1724,7 @@ if test "x$check_for_libcrypt_later" = "x1"; then
        AC_CHECK_LIB(crypt, crypt, LIBS="$LIBS -lcrypt")
 fi
 
+AC_CHECK_LIB(iaf, ia_openinfo)
 
 ### Configure cryptographic random number support
 
index 9d79eea6e6a091af7f1613b1c95a2391965e350c..1118834860ab95f3a11fdbc2d43bb222b99e03a7 100644 (file)
--- a/defines.h
+++ b/defines.h
@@ -688,6 +688,10 @@ struct winsize {
 # define CUSTOM_SYS_AUTH_PASSWD 1
 #endif
 
+#ifdef UNIXWARE_LONG_PASSWORDS
+# define CUSTOM_SYS_AUTH_PASSWD 1
+#endif
+
 /* HP-UX 11.11 */
 #ifdef BTMP_FILE
 # define _PATH_BTMP BTMP_FILE
index 9408fec9a77f2c30ca7cd6f9e34cfc4cf4198b0b..fa65aa38d6bbcbc8eafa17b37dfae78e162d0544 100644 (file)
@@ -169,6 +169,10 @@ static /**/const char *const rcsid[] = { (const char *)rcsid, "\100(#)" msg }
 # include <ia.h>
 #endif
 
+#ifdef HAVE_IAF_H
+# include <iaf.h>
+#endif
+
 #ifdef HAVE_TMPDIR_H
 # include <tmpdir.h>
 #endif
index b023468621180853ee9ddc981903441d26effa80..7324cb3bf020517b6c1f90fd7c219dd73907c37d 100644 (file)
@@ -20,7 +20,7 @@ OPENBSD=base64.o basename.o bindresvport.o daemon.o dirname.o getcwd.o getgroupl
 
 COMPAT=bsd-arc4random.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-snprintf.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o
 
-PORTS=port-irix.o port-aix.o
+PORTS=port-irix.o port-aix.o port-uw.o
 
 .c.o:
        $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
index 8f55193b006f32654d7fe61a6a232fc510f108ae..39c9e3f8aece0f7677fefac3572b1ff41edb36fa 100644 (file)
@@ -173,5 +173,6 @@ char *shadow_pw(struct passwd *pw);
 #include "bsd-cygwin_util.h"
 #include "port-irix.h"
 #include "port-aix.h"
+#include "port-uw.h"
 
 #endif /* _OPENBSD_COMPAT_H */
diff --git a/openbsd-compat/port-uw.c b/openbsd-compat/port-uw.c
new file mode 100644 (file)
index 0000000..cbc3f68
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2005 The SCO Group. All rights reserved.
+ * Copyright (c) 2005 Tim Rice. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "includes.h"
+
+#ifdef UNIXWARE_LONG_PASSWORDS
+#ifdef HAVE_CRYPT_H
+#include <crypt.h>
+#endif
+#include "packet.h"
+#include "buffer.h"
+#include "log.h"
+#include "servconf.h"
+#include "auth.h"
+#include "auth-options.h"
+
+int nischeck(char *);
+
+int
+sys_auth_passwd(Authctxt *authctxt, const char *password)
+{
+       struct passwd *pw = authctxt->pw;
+       char *encrypted_password;
+       char *salt;
+
+       /* Just use the supplied fake password if authctxt is invalid */
+       char *pw_password = authctxt->valid ? shadow_pw(pw) : pw->pw_passwd;
+
+       /* Check for users with no password. */
+       if (strcmp(pw_password, "") == 0 && strcmp(password, "") == 0)
+               return (1);
+
+       salt = (pw_password[0] && pw_password[1]) ? pw_password : "xx";
+       if (nischeck(pw->pw_name))
+               return(strcmp(crypt(password, salt), pw_password) == 0);
+       else
+               return(strcmp(bigcrypt(password, salt), pw_password) == 0);
+}
+
+int
+nischeck(char *namep)
+{
+       char password_file[] = "/etc/passwd";
+       FILE *fd;
+       struct passwd *ent = NULL;
+
+       if ((fd = fopen (password_file, "r")) == NULL) {
+               /*
+                * If the passwd file has dissapeared we are in a bad state.
+                * However, returning 0 will send us back through the
+                * authentication scheme that has checked the ia database for
+                * passwords earlier.
+                */
+               return(0);
+       }
+
+       /*
+        * fgetpwent() only reads from password file, so we know for certain
+        * that the user is local.
+        */
+       while (ent = fgetpwent(fd)) {
+               if (strcmp (ent->pw_name, namep) == 0) {
+                       /* Local user */
+                       fclose (fd);
+                       return(0);
+               }
+       }
+
+       fclose (fd);
+       return (1);
+}
+
+#endif /* UNIXWARE_LONG_PASSWORDS */
+
+#ifdef HAVE_LIBIAF
+char *
+get_iaf_password(struct passwd *pw)
+{
+       char *pw_password = NULL;
+
+       uinfo_t uinfo;
+       if (!ia_openinfo(pw->pw_name,&uinfo)) {
+               ia_get_logpwd(uinfo, &pw_password);
+               if (pw_password == NULL)
+                       fatal("Unable to get the shadow passwd");
+               ia_closeinfo(uinfo);
+               return pw_password;
+       }
+       else
+               fatal("Unable to open the shadow passwd file");
+}
+#endif /* HAVE_LIBIAF */
+
diff --git a/openbsd-compat/port-uw.h b/openbsd-compat/port-uw.h
new file mode 100644 (file)
index 0000000..f16bb5e
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2005 Tim Rice.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "includes.h"
+
+#ifdef HAVE_LIBIAF
+char * get_iaf_password(struct passwd *pw);
+#endif /* HAVE_LIBIAF */
+
index c3cea3c8689381e4face6b2eac19b015728b43b1..453203270657c603fc349df4016b893b690ddbad 100644 (file)
@@ -91,7 +91,11 @@ shadow_pw(struct passwd *pw)
        struct spwd *spw = getspnam(pw->pw_name);
 
        if (spw != NULL)
+#ifdef HAVE_LIBIAF
+               pw_password = get_iaf_password(pw);
+#else
                pw_password = spw->sp_pwdp;
+#endif /* HAVE_LIBIAF */
 # endif
 # if defined(HAVE_GETPWANAM) && !defined(DISABLE_SHADOW)
        struct passwd_adjunct *spw;
index 95084aec6c2158decd619bf64f655d2ed8a52a96..98bd3121c12bc725356de0fe19742d51d9aa8d57 100644 (file)
--- a/session.c
+++ b/session.c
@@ -1334,6 +1334,11 @@ do_setusercontext(struct passwd *pw)
 # ifdef _AIX
                aix_usrinfo(pw);
 # endif /* _AIX */
+# ifdef HAVE_LIBIAF
+               if (set_id(pw->pw_name) != 0) {
+                       exit(1);
+               }
+# endif
                /* Permanently switch to the desired uid. */
                permanently_set_uid(pw);
 #endif
This page took 0.08255 seconds and 5 git commands to generate.