From 0fda81ee5bdc656554d55fb8d6f40c39bae3a3bf Mon Sep 17 00:00:00 2001 From: Thorsten Kukuk Date: Tue, 14 Jun 2011 15:28:05 +0200 Subject: [PATCH] 2011-06-14 Thorsten Kukuk * configure.in: Check for libtirpc bye default. * libpam/Makefile.am: Add support for libtirpc. * modules/pam_access/Makefile.am: Likewise. * modules/pam_unix/Makefile.am: Likewise. * modules/pam_unix/pam_unix_passwd.c: Change ifdefs for new libtirpc support. * modules/pam_unix/yppasswd_xdr.c: Only compile if we have rpc/rpc.h. --- ChangeLog | 10 +++++++ configure.in | 45 ++++++++++++++++++++++------ libpam/Makefile.am | 3 +- modules/pam_access/Makefile.am | 4 +-- modules/pam_unix/Makefile.am | 5 ++-- modules/pam_unix/pam_unix_passwd.c | 48 +++++++++++++++++++----------- modules/pam_unix/yppasswd_xdr.c | 4 +++ 7 files changed, 87 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index 299b3167..8d6bfd21 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2011-06-14 Thorsten Kukuk + + * configure.in: Check for libtirpc bye default. + * libpam/Makefile.am: Add support for libtirpc. + * modules/pam_access/Makefile.am: Likewise. + * modules/pam_unix/Makefile.am: Likewise. + * modules/pam_unix/pam_unix_passwd.c: Change ifdefs for + new libtirpc support. + * modules/pam_unix/yppasswd_xdr.c: Only compile if we have rpc/rpc.h. + 2011-06-13 Tomas Mraz * modules/pam_securetty/pam_securetty.c (securetty_perform_check): Test diff --git a/configure.in b/configure.in index d09d753f..80f9ee96 100644 --- a/configure.in +++ b/configure.in @@ -441,12 +441,39 @@ fi AC_SUBST(LIBDB) AM_CONDITIONAL([HAVE_LIBDB], [test ! -z "$LIBDB"]) -AC_CHECK_LIB([nsl],[yp_get_default_domain], LIBNSL="-lnsl", LIBNSL="") -BACKUP_LIBS=$LIBS -LIBS="$LIBS $LIBNSL" -AC_CHECK_FUNCS(yp_get_default_domain getdomainname innetgr yperr_string yp_master yp_bind yp_match yp_unbind) -LIBS=$BACKUP_LIBS -AC_SUBST(LIBNSL) +AC_ARG_ENABLE([nis], + AS_HELP_STRING([-disable-nis], [Disable building NIS/YP support in pam_unix and pam_access])) + +AS_IF([test "x$enable_nis" != "xno"], [ + CFLAGS=$old_CFLAGS + LIBS=$old_LIBS + + dnl if there's libtirpc available, prefer that over the system + dnl implementation. + PKG_CHECK_MODULES([libtirpc], [libtirpc], [ + CFLAGS="$CFLAGS $libtirpc_CFLAGS" + LIBS="$LIBS $libtirpc_LIBS" + ], [:;]) + + AC_SEARCH_LIBS([yp_get_default_domain], [nsl]) + + AC_CHECK_FUNCS([yp_get_default_domain yperr_string yp_master yp_bind yp_match yp_unbind]) + AC_CHECK_HEADERS([rpc/rpc.h rpcsvc/ypclnt.h rpcsvc/yp_prot.h]) + AC_CHECK_DECLS([getrpcport], , , [ + #if HAVE_RPC_RPC_H + # include + #endif + ]) + + NIS_CFLAGS="${CFLAGS%${old_CFLAGS}}" + NIS_LIBS="${LIBS%${old_LIBS}}" + + CFLAGS="$old_CFLAGS" + LIBS="$old_LIBS" +]) + +AC_SUBST([NIS_CFLAGS]) +AC_SUBST([NIS_LIBS]) AC_ARG_ENABLE([selinux], AS_HELP_STRING([--disable-selinux],[do not use SELinux]), @@ -471,7 +498,7 @@ dnl Checks for header files. AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_SYS_WAIT -AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/file.h sys/ioctl.h sys/time.h syslog.h net/if.h termio.h unistd.h sys/fsuid.h inittypes.h rpcsvc/ypclnt.h rpcsvc/yp_prot.h) +AC_CHECK_HEADERS(fcntl.h limits.h malloc.h sys/file.h sys/ioctl.h sys/time.h syslog.h net/if.h termio.h unistd.h sys/fsuid.h inittypes.h) dnl For module/pam_lastlog AC_CHECK_HEADERS(lastlog.h utmp.h utmpx.h) @@ -491,11 +518,11 @@ AC_TYPE_GETGROUPS AC_PROG_GCC_TRADITIONAL AC_FUNC_MEMCMP AC_FUNC_VPRINTF -AC_CHECK_FUNCS(fseeko gethostname gettimeofday lckpwdf mkdir select) +AC_CHECK_FUNCS(fseeko getdomainname gethostname gettimeofday lckpwdf mkdir select) AC_CHECK_FUNCS(strcspn strdup strspn strstr strtol uname) AC_CHECK_FUNCS(getutent_r getpwnam_r getpwuid_r getgrnam_r getgrgid_r getspnam_r) AC_CHECK_FUNCS(getgrouplist getline getdelim) -AC_CHECK_FUNCS(inet_ntop inet_pton ruserok_af) +AC_CHECK_FUNCS(inet_ntop inet_pton innetgr ruserok_af) AC_CHECK_FUNCS(unshare, [UNSHARE=yes], [UNSHARE=no]) AM_CONDITIONAL([HAVE_UNSHARE], [test "$UNSHARE" = yes]) diff --git a/libpam/Makefile.am b/libpam/Makefile.am index 3c7ae1d6..f7e6c25d 100644 --- a/libpam/Makefile.am +++ b/libpam/Makefile.am @@ -25,7 +25,8 @@ libpam_la_LIBADD = @LIBAUDIT@ $(LIBPRELUDE_LIBS) @LIBDL@ if STATIC_MODULES libpam_la_LIBADD += $(shell ls ../modules/pam_*/*.lo) \ - @LIBDB@ @LIBCRYPT@ @LIBNSL@ @LIBCRACK@ -lutil + @LIBDB@ @LIBCRYPT@ $(NIS_LIBS) @LIBCRACK@ -lutil + AM_CFLAGS += $(NIS_CFLAGS) endif if HAVE_VERSIONING libpam_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libpam.map diff --git a/modules/pam_access/Makefile.am b/modules/pam_access/Makefile.am index b4fea7df..89222b56 100644 --- a/modules/pam_access/Makefile.am +++ b/modules/pam_access/Makefile.am @@ -15,14 +15,14 @@ securelibdir = $(SECUREDIR) secureconfdir = $(SCONFIGDIR) AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ - -DPAM_ACCESS_CONFIG=\"$(SCONFIGDIR)/access.conf\" + -DPAM_ACCESS_CONFIG=\"$(SCONFIGDIR)/access.conf\" $(NIS_CFLAGS) AM_LDFLAGS = -no-undefined -avoid-version -module if HAVE_VERSIONING AM_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map endif securelib_LTLIBRARIES = pam_access.la -pam_access_la_LIBADD = -L$(top_builddir)/libpam -lpam @LIBNSL@ +pam_access_la_LIBADD = -L$(top_builddir)/libpam -lpam $(NIS_LIBS) secureconf_DATA = access.conf diff --git a/modules/pam_unix/Makefile.am b/modules/pam_unix/Makefile.am index 44b37e94..ba77d39f 100644 --- a/modules/pam_unix/Makefile.am +++ b/modules/pam_unix/Makefile.am @@ -18,7 +18,8 @@ secureconfdir = $(SCONFIGDIR) AM_CFLAGS = -I$(top_srcdir)/libpam/include -I$(top_srcdir)/libpamc/include \ -DCHKPWD_HELPER=\"$(sbindir)/unix_chkpwd\" \ - -DUPDATE_HELPER=\"$(sbindir)/unix_update\" + -DUPDATE_HELPER=\"$(sbindir)/unix_update\" \ + $(NIS_CFLAGS) if HAVE_LIBSELINUX AM_CFLAGS += -D"WITH_SELINUX" @@ -28,7 +29,7 @@ pam_unix_la_LDFLAGS = -no-undefined -avoid-version -module if HAVE_VERSIONING pam_unix_la_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map endif -pam_unix_la_LIBADD = @LIBNSL@ -L$(top_builddir)/libpam -lpam \ +pam_unix_la_LIBADD = $(NIS_LIBS) -L$(top_builddir)/libpam -lpam \ @LIBCRYPT@ @LIBSELINUX@ securelib_LTLIBRARIES = pam_unix.la diff --git a/modules/pam_unix/pam_unix_passwd.c b/modules/pam_unix/pam_unix_passwd.c index 320bc547..631df318 100644 --- a/modules/pam_unix/pam_unix_passwd.c +++ b/modules/pam_unix/pam_unix_passwd.c @@ -54,13 +54,6 @@ #include #include #include -#include -#ifdef HAVE_RPCSVC_YP_PROT_H -#include -#endif -#ifdef HAVE_RPCSVC_YPCLNT_H -#include -#endif #include #include @@ -76,16 +69,33 @@ #include #include -#include "yppasswd.h" #include "md5.h" #include "support.h" #include "passverify.h" #include "bigcrypt.h" -#if !((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1)) +#if (HAVE_YP_GET_DEFAULT_DOMAIN || HAVE_GETDOMAINNAME) && HAVE_YP_MASTER +# define HAVE_NIS +#endif + +#ifdef HAVE_NIS +# include + +# if HAVE_RPCSVC_YP_PROT_H +# include +# endif + +# if HAVE_RPCSVC_YPCLNT_H +# include +# endif + +# include "yppasswd.h" + +# if !HAVE_DECL_GETRPCPORT extern int getrpcport(const char *host, unsigned long prognum, unsigned long versnum, unsigned int proto); -#endif /* GNU libc 2.1 */ +# endif /* GNU libc 2.1 */ +#endif /* How it works: @@ -102,9 +112,9 @@ extern int getrpcport(const char *host, unsigned long prognum, #define MAX_PASSWD_TRIES 3 +#ifdef HAVE_NIS static char *getNISserver(pam_handle_t *pamh, unsigned int ctrl) { -#if (defined(HAVE_YP_GET_DEFAULT_DOMAIN) || defined(HAVE_GETDOMAINNAME)) && defined(HAVE_YP_MASTER) char *master; char *domainname; int port, err; @@ -151,14 +161,8 @@ static char *getNISserver(pam_handle_t *pamh, unsigned int ctrl) master, port); } return master; -#else - if (on(UNIX_DEBUG, ctrl)) { - pam_syslog(pamh, LOG_DEBUG, "getNISserver: No NIS support available"); - } - - return NULL; -#endif } +#endif #ifdef WITH_SELINUX @@ -326,6 +330,7 @@ static int _do_setpass(pam_handle_t* pamh, const char *forwho, } if (on(UNIX_NIS, ctrl) && _unix_comesfromsource(pamh, forwho, 0, 1)) { +#ifdef HAVE_NIS if ((master=getNISserver(pamh, ctrl)) != NULL) { struct timeval timeout; struct yppasswd yppwd; @@ -391,6 +396,13 @@ static int _do_setpass(pam_handle_t* pamh, const char *forwho, } else { retval = PAM_TRY_AGAIN; } +#else + if (on(UNIX_DEBUG, ctrl)) { + pam_syslog(pamh, LOG_DEBUG, "No NIS support available"); + } + + retval = PAM_TRY_AGAIN; +#endif } if (_unix_comesfromsource(pamh, forwho, 1, 0)) { diff --git a/modules/pam_unix/yppasswd_xdr.c b/modules/pam_unix/yppasswd_xdr.c index 0b95b82b..f2b86a56 100644 --- a/modules/pam_unix/yppasswd_xdr.c +++ b/modules/pam_unix/yppasswd_xdr.c @@ -12,6 +12,8 @@ #include "config.h" +#ifdef HAVE_RPC_RPC_H + #include #include "yppasswd.h" @@ -34,3 +36,5 @@ xdr_yppasswd(XDR * xdrs, yppasswd * objp) return xdr_string(xdrs, &objp->oldpass, ~0) && xdr_xpasswd(xdrs, &objp->newpw); } + +#endif -- 2.40.0