From: damien Date: Sat, 13 Nov 1999 04:40:10 +0000 (+0000) Subject: - Added shadow password patch from Thomas Neumann X-Git-Tag: V_1_2_PRE12~11 X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/commitdiff_plain/b2344d54c592e01257c19d86a3e6bcf1feae1ee5 - Added shadow password patch from Thomas Neumann - Added ifdefs to auth-passwd.c to exclude it when PAM is enabled --- diff --git a/ChangeLog b/ChangeLog index 242b29d9..1ac4dfee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,8 @@ totalsize, ok niels,aaron - Delay fork (-f option) in ssh until after port forwarded connections have been initialised. Patch from Jani Hakala + - Added shadow password patch from Thomas Neumann + - Added ifdefs to auth-passwd.c to exclude it when PAM is enabled 19991112 - Merged changes from OpenBSD CVS diff --git a/README b/README index 5cf0b449..f60f5960 100644 --- a/README +++ b/README @@ -52,6 +52,7 @@ Nalin Dahyabhai - PAM environment patch Phil Hands - Debian scripts, assorted patches Niels Kristian Bech Jensen - Makefile patches Marc G. Fournier - Solaris patches +Thomas Neumann - Shadow passwords Miscellania - diff --git a/auth-passwd.c b/auth-passwd.c index 9e7e0069..0cd53884 100644 --- a/auth-passwd.c +++ b/auth-passwd.c @@ -21,6 +21,14 @@ RCSID("$Id$"); #include "ssh.h" #include "servconf.h" #include "xmalloc.h" +#include "config.h" + +#ifdef HAVE_SHADOW_H +#include +#endif + +#ifndef HAVE_PAM +/* Don't need anything from here if we are using PAM */ /* Tries to authenticate the user using password. Returns true if authentication succeeds. */ @@ -29,6 +37,9 @@ int auth_password(struct passwd *pw, const char *password) { extern ServerOptions options; char *encrypted_password; +#ifdef HAVE_SHADOW_H + struct spwd *spw; +#endif if (pw->pw_uid == 0 && options.permit_root_login == 2) { @@ -164,11 +175,31 @@ int auth_password(struct passwd *pw, const char *password) return 1; /* The user has no password and an empty password was tried. */ } +#ifdef HAVE_SHADOW_H + spw = getspnam(pw->pw_name); + if (spw == NULL) + return(0); + + if ((spw->sp_namp == NULL) || (strcmp(pw->pw_name, spw->sp_namp) != 0)) + fatal("Shadow lookup returned garbage."); + + if (strlen(spw->sp_pwdp) < 3) + return(0); + + /* Encrypt the candidate password using the proper salt. */ + encrypted_password = crypt(password, spw->sp_pwdp); + + /* Authentication is accepted if the encrypted passwords are identical. */ + return (strcmp(encrypted_password, spw->sp_pwdp) == 0); +#else /* !HAVE_SHADOW_H */ + /* Encrypt the candidate password using the proper salt. */ encrypted_password = crypt(password, (pw->pw_passwd[0] && pw->pw_passwd[1]) ? pw->pw_passwd : "xx"); - /* Authentication is accepted if the encrypted passwords are identical. */ return (strcmp(encrypted_password, pw->pw_passwd) == 0); +#endif /* !HAVE_SHADOW_H */ } + +#endif /* !HAVE_PAM */ diff --git a/configure.in b/configure.in index d80ac7c7..bd34e6dd 100644 --- a/configure.in +++ b/configure.in @@ -55,7 +55,7 @@ AC_CHECK_LIB(dl, dlopen, , ) AC_CHECK_LIB(pam, pam_authenticate, , ) dnl Checks for header files. -AC_CHECK_HEADERS(pty.h endian.h paths.h lastlog.h) +AC_CHECK_HEADERS(pty.h endian.h paths.h lastlog.h shadow.h) dnl Checks for library functions. AC_PROG_GCC_TRADITIONAL