summaryrefslogtreecommitdiffstats
path: root/lib/libpam
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2013-09-07 16:10:15 +0000
committerdes <des@FreeBSD.org>2013-09-07 16:10:15 +0000
commite86dd36ab210b4404ece0cbcf05629b6ec4ef10b (patch)
tree90d685ee8badf6b53d689f32e97cf872f86c70f5 /lib/libpam
parentfc7edbae41d74ca6cbe14c4dfe9b83d8873ae71d (diff)
downloadFreeBSD-src-e86dd36ab210b4404ece0cbcf05629b6ec4ef10b.zip
FreeBSD-src-e86dd36ab210b4404ece0cbcf05629b6ec4ef10b.tar.gz
Prepare for OpenPAM Nummularia by reorganizing to match its new directory
structure.
Diffstat (limited to 'lib/libpam')
-rw-r--r--lib/libpam/Makefile.am92
-rw-r--r--lib/libpam/Makefile.in677
-rw-r--r--lib/libpam/openpam_borrow_cred.c125
-rw-r--r--lib/libpam/openpam_check_owner_perms.c146
-rw-r--r--lib/libpam/openpam_configure.c465
-rw-r--r--lib/libpam/openpam_constants.c127
-rw-r--r--lib/libpam/openpam_constants.h43
-rw-r--r--lib/libpam/openpam_ctype.h68
-rw-r--r--lib/libpam/openpam_debug.h112
-rw-r--r--lib/libpam/openpam_dispatch.c238
-rw-r--r--lib/libpam/openpam_dynamic.c188
-rw-r--r--lib/libpam/openpam_features.c69
-rw-r--r--lib/libpam/openpam_features.h48
-rw-r--r--lib/libpam/openpam_findenv.c73
-rw-r--r--lib/libpam/openpam_free_data.c76
-rw-r--r--lib/libpam/openpam_free_envlist.c72
-rw-r--r--lib/libpam/openpam_get_feature.c99
-rw-r--r--lib/libpam/openpam_get_option.c86
-rw-r--r--lib/libpam/openpam_impl.h179
-rw-r--r--lib/libpam/openpam_load.c135
-rw-r--r--lib/libpam/openpam_log.c170
-rw-r--r--lib/libpam/openpam_nullconv.c90
-rw-r--r--lib/libpam/openpam_readline.c138
-rw-r--r--lib/libpam/openpam_readlinev.c156
-rw-r--r--lib/libpam/openpam_readword.c202
-rw-r--r--lib/libpam/openpam_restore_cred.c98
-rw-r--r--lib/libpam/openpam_set_feature.c75
-rw-r--r--lib/libpam/openpam_set_option.c122
-rw-r--r--lib/libpam/openpam_static.c74
-rw-r--r--lib/libpam/openpam_straddch.c111
-rw-r--r--lib/libpam/openpam_strlcat.h54
-rw-r--r--lib/libpam/openpam_strlcmp.h49
-rw-r--r--lib/libpam/openpam_strlcpy.h52
-rw-r--r--lib/libpam/openpam_subst.c171
-rw-r--r--lib/libpam/openpam_ttyconv.c252
-rw-r--r--lib/libpam/pam_acct_mgmt.c88
-rw-r--r--lib/libpam/pam_authenticate.c96
-rw-r--r--lib/libpam/pam_authenticate_secondary.c67
-rw-r--r--lib/libpam/pam_chauthtok.c97
-rw-r--r--lib/libpam/pam_close_session.c89
-rw-r--r--lib/libpam/pam_end.c106
-rw-r--r--lib/libpam/pam_error.c89
-rw-r--r--lib/libpam/pam_get_authtok.c205
-rw-r--r--lib/libpam/pam_get_data.c91
-rw-r--r--lib/libpam/pam_get_item.c135
-rw-r--r--lib/libpam/pam_get_mapped_authtok.c66
-rw-r--r--lib/libpam/pam_get_mapped_username.c67
-rw-r--r--lib/libpam/pam_get_user.c135
-rw-r--r--lib/libpam/pam_getenv.c87
-rw-r--r--lib/libpam/pam_getenvlist.c110
-rw-r--r--lib/libpam/pam_info.c89
-rw-r--r--lib/libpam/pam_open_session.c90
-rw-r--r--lib/libpam/pam_prompt.c94
-rw-r--r--lib/libpam/pam_putenv.c112
-rw-r--r--lib/libpam/pam_set_data.c108
-rw-r--r--lib/libpam/pam_set_item.c129
-rw-r--r--lib/libpam/pam_set_mapped_authtok.c66
-rw-r--r--lib/libpam/pam_set_mapped_username.c67
-rw-r--r--lib/libpam/pam_setcred.c99
-rw-r--r--lib/libpam/pam_setenv.c102
-rw-r--r--lib/libpam/pam_sm_acct_mgmt.c85
-rw-r--r--lib/libpam/pam_sm_authenticate.c86
-rw-r--r--lib/libpam/pam_sm_authenticate_secondary.c72
-rw-r--r--lib/libpam/pam_sm_chauthtok.c91
-rw-r--r--lib/libpam/pam_sm_close_session.c82
-rw-r--r--lib/libpam/pam_sm_get_mapped_authtok.c71
-rw-r--r--lib/libpam/pam_sm_get_mapped_username.c72
-rw-r--r--lib/libpam/pam_sm_open_session.c82
-rw-r--r--lib/libpam/pam_sm_set_mapped_authtok.c71
-rw-r--r--lib/libpam/pam_sm_set_mapped_username.c69
-rw-r--r--lib/libpam/pam_sm_setcred.c86
-rw-r--r--lib/libpam/pam_start.c122
-rw-r--r--lib/libpam/pam_strerror.c137
-rw-r--r--lib/libpam/pam_verror.c84
-rw-r--r--lib/libpam/pam_vinfo.c84
-rw-r--r--lib/libpam/pam_vprompt.c133
76 files changed, 8843 insertions, 0 deletions
diff --git a/lib/libpam/Makefile.am b/lib/libpam/Makefile.am
new file mode 100644
index 0000000..9ce2d2f
--- /dev/null
+++ b/lib/libpam/Makefile.am
@@ -0,0 +1,92 @@
+# $Id: Makefile.am 602 2012-04-15 17:31:15Z des $
+
+NULL =
+
+INCLUDES = -I$(top_srcdir)/include
+
+lib_LTLIBRARIES = libpam.la
+
+noinst_HEADERS = \
+ openpam_constants.h \
+ openpam_ctype.h \
+ openpam_debug.h \
+ openpam_features.h \
+ openpam_impl.h \
+ openpam_strlcat.h \
+ openpam_strlcmp.h \
+ openpam_strlcpy.h
+
+libpam_la_SOURCES = \
+ openpam_borrow_cred.c \
+ openpam_check_owner_perms.c \
+ openpam_configure.c \
+ openpam_constants.c \
+ openpam_dispatch.c \
+ openpam_dynamic.c \
+ openpam_features.c \
+ openpam_findenv.c \
+ openpam_free_data.c \
+ openpam_free_envlist.c \
+ openpam_get_feature.c \
+ openpam_get_option.c \
+ openpam_load.c \
+ openpam_log.c \
+ openpam_nullconv.c \
+ openpam_readline.c \
+ openpam_readlinev.c \
+ openpam_readword.c \
+ openpam_restore_cred.c \
+ openpam_set_option.c \
+ openpam_set_feature.c \
+ openpam_static.c \
+ openpam_straddch.c \
+ openpam_subst.c \
+ openpam_ttyconv.c \
+ pam_acct_mgmt.c \
+ pam_authenticate.c \
+ pam_chauthtok.c \
+ pam_close_session.c \
+ pam_end.c \
+ pam_error.c \
+ pam_get_authtok.c \
+ pam_get_data.c \
+ pam_get_item.c \
+ pam_get_user.c \
+ pam_getenv.c \
+ pam_getenvlist.c \
+ pam_info.c \
+ pam_open_session.c \
+ pam_prompt.c \
+ pam_putenv.c \
+ pam_set_data.c \
+ pam_set_item.c \
+ pam_setcred.c \
+ pam_setenv.c \
+ pam_start.c \
+ pam_strerror.c \
+ pam_verror.c \
+ pam_vinfo.c \
+ pam_vprompt.c \
+ $(NULL)
+
+libpam_la_LDFLAGS = -no-undefined -version-info @LIB_MAJ@
+libpam_la_LIBADD = @DL_LIBS@
+
+EXTRA_DIST = \
+ pam_authenticate_secondary.c \
+ pam_get_mapped_authtok.c \
+ pam_get_mapped_username.c \
+ pam_set_mapped_authtok.c \
+ pam_set_mapped_username.c \
+ \
+ pam_sm_acct_mgmt.c \
+ pam_sm_authenticate.c \
+ pam_sm_authenticate_secondary.c \
+ pam_sm_chauthtok.c \
+ pam_sm_close_session.c \
+ pam_sm_get_mapped_authtok.c \
+ pam_sm_get_mapped_username.c \
+ pam_sm_open_session.c \
+ pam_sm_set_mapped_authtok.c \
+ pam_sm_set_mapped_username.c \
+ pam_sm_setcred.c
diff --git a/lib/libpam/Makefile.in b/lib/libpam/Makefile.in
new file mode 100644
index 0000000..353fbab
--- /dev/null
+++ b/lib/libpam/Makefile.in
@@ -0,0 +1,677 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# $Id: Makefile.am 602 2012-04-15 17:31:15Z des $
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = lib
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libpam_la_DEPENDENCIES =
+am__objects_1 =
+am_libpam_la_OBJECTS = openpam_borrow_cred.lo \
+ openpam_check_owner_perms.lo openpam_configure.lo \
+ openpam_constants.lo openpam_dispatch.lo openpam_dynamic.lo \
+ openpam_features.lo openpam_findenv.lo openpam_free_data.lo \
+ openpam_free_envlist.lo openpam_get_feature.lo \
+ openpam_get_option.lo openpam_load.lo openpam_log.lo \
+ openpam_nullconv.lo openpam_readline.lo openpam_readlinev.lo \
+ openpam_readword.lo openpam_restore_cred.lo \
+ openpam_set_option.lo openpam_set_feature.lo openpam_static.lo \
+ openpam_straddch.lo openpam_subst.lo openpam_ttyconv.lo \
+ pam_acct_mgmt.lo pam_authenticate.lo pam_chauthtok.lo \
+ pam_close_session.lo pam_end.lo pam_error.lo \
+ pam_get_authtok.lo pam_get_data.lo pam_get_item.lo \
+ pam_get_user.lo pam_getenv.lo pam_getenvlist.lo pam_info.lo \
+ pam_open_session.lo pam_prompt.lo pam_putenv.lo \
+ pam_set_data.lo pam_set_item.lo pam_setcred.lo pam_setenv.lo \
+ pam_start.lo pam_strerror.lo pam_verror.lo pam_vinfo.lo \
+ pam_vprompt.lo $(am__objects_1)
+libpam_la_OBJECTS = $(am_libpam_la_OBJECTS)
+libpam_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(libpam_la_LDFLAGS) $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+SOURCES = $(libpam_la_SOURCES)
+DIST_SOURCES = $(libpam_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CRYPT_LIBS = @CRYPT_LIBS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DL_LIBS = @DL_LIBS@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_MAJ = @LIB_MAJ@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENPAM_MODULES_DIR = @OPENPAM_MODULES_DIR@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+NULL =
+INCLUDES = -I$(top_srcdir)/include
+lib_LTLIBRARIES = libpam.la
+noinst_HEADERS = \
+ openpam_constants.h \
+ openpam_ctype.h \
+ openpam_debug.h \
+ openpam_features.h \
+ openpam_impl.h \
+ openpam_strlcat.h \
+ openpam_strlcmp.h \
+ openpam_strlcpy.h
+
+libpam_la_SOURCES = \
+ openpam_borrow_cred.c \
+ openpam_check_owner_perms.c \
+ openpam_configure.c \
+ openpam_constants.c \
+ openpam_dispatch.c \
+ openpam_dynamic.c \
+ openpam_features.c \
+ openpam_findenv.c \
+ openpam_free_data.c \
+ openpam_free_envlist.c \
+ openpam_get_feature.c \
+ openpam_get_option.c \
+ openpam_load.c \
+ openpam_log.c \
+ openpam_nullconv.c \
+ openpam_readline.c \
+ openpam_readlinev.c \
+ openpam_readword.c \
+ openpam_restore_cred.c \
+ openpam_set_option.c \
+ openpam_set_feature.c \
+ openpam_static.c \
+ openpam_straddch.c \
+ openpam_subst.c \
+ openpam_ttyconv.c \
+ pam_acct_mgmt.c \
+ pam_authenticate.c \
+ pam_chauthtok.c \
+ pam_close_session.c \
+ pam_end.c \
+ pam_error.c \
+ pam_get_authtok.c \
+ pam_get_data.c \
+ pam_get_item.c \
+ pam_get_user.c \
+ pam_getenv.c \
+ pam_getenvlist.c \
+ pam_info.c \
+ pam_open_session.c \
+ pam_prompt.c \
+ pam_putenv.c \
+ pam_set_data.c \
+ pam_set_item.c \
+ pam_setcred.c \
+ pam_setenv.c \
+ pam_start.c \
+ pam_strerror.c \
+ pam_verror.c \
+ pam_vinfo.c \
+ pam_vprompt.c \
+ $(NULL)
+
+libpam_la_LDFLAGS = -no-undefined -version-info @LIB_MAJ@
+libpam_la_LIBADD = @DL_LIBS@
+EXTRA_DIST = \
+ pam_authenticate_secondary.c \
+ pam_get_mapped_authtok.c \
+ pam_get_mapped_username.c \
+ pam_set_mapped_authtok.c \
+ pam_set_mapped_username.c \
+ \
+ pam_sm_acct_mgmt.c \
+ pam_sm_authenticate.c \
+ pam_sm_authenticate_secondary.c \
+ pam_sm_chauthtok.c \
+ pam_sm_close_session.c \
+ pam_sm_get_mapped_authtok.c \
+ pam_sm_get_mapped_username.c \
+ pam_sm_open_session.c \
+ pam_sm_set_mapped_authtok.c \
+ pam_sm_set_mapped_username.c \
+ pam_sm_setcred.c
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign lib/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libpam.la: $(libpam_la_OBJECTS) $(libpam_la_DEPENDENCIES)
+ $(libpam_la_LINK) -rpath $(libdir) $(libpam_la_OBJECTS) $(libpam_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_borrow_cred.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_check_owner_perms.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_configure.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_constants.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_dispatch.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_dynamic.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_features.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_findenv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_free_data.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_free_envlist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_get_feature.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_get_option.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_load.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_log.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_nullconv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_readline.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_readlinev.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_readword.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_restore_cred.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_set_feature.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_set_option.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_static.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_straddch.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_subst.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openpam_ttyconv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_acct_mgmt.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_authenticate.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_chauthtok.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_close_session.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_end.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_error.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_get_authtok.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_get_data.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_get_item.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_get_user.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_getenv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_getenvlist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_info.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_open_session.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_prompt.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_putenv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_set_data.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_set_item.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_setcred.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_setenv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_start.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_strerror.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_verror.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_vinfo.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pam_vprompt.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ set x; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am \
+ install-libLTLIBRARIES install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-libLTLIBRARIES
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/libpam/openpam_borrow_cred.c b/lib/libpam/openpam_borrow_cred.c
new file mode 100644
index 0000000..e0dfc55
--- /dev/null
+++ b/lib/libpam/openpam_borrow_cred.c
@@ -0,0 +1,125 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_borrow_cred.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <grp.h>
+#include <limits.h>
+#include <pwd.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Temporarily borrow user credentials
+ */
+
+int
+openpam_borrow_cred(pam_handle_t *pamh,
+ const struct passwd *pwd)
+{
+ struct pam_saved_cred *scred;
+ const void *scredp;
+ int r;
+
+ ENTERI(pwd->pw_uid);
+ r = pam_get_data(pamh, PAM_SAVED_CRED, &scredp);
+ if (r == PAM_SUCCESS && scredp != NULL) {
+ openpam_log(PAM_LOG_DEBUG,
+ "already operating under borrowed credentials");
+ RETURNC(PAM_SYSTEM_ERR);
+ }
+ if (geteuid() != 0 && geteuid() != pwd->pw_uid) {
+ openpam_log(PAM_LOG_DEBUG, "called with non-zero euid: %d",
+ (int)geteuid());
+ RETURNC(PAM_PERM_DENIED);
+ }
+ scred = calloc(1, sizeof *scred);
+ if (scred == NULL)
+ RETURNC(PAM_BUF_ERR);
+ scred->euid = geteuid();
+ scred->egid = getegid();
+ r = getgroups(NGROUPS_MAX, scred->groups);
+ if (r < 0) {
+ FREE(scred);
+ RETURNC(PAM_SYSTEM_ERR);
+ }
+ scred->ngroups = r;
+ r = pam_set_data(pamh, PAM_SAVED_CRED, scred, &openpam_free_data);
+ if (r != PAM_SUCCESS) {
+ FREE(scred);
+ RETURNC(r);
+ }
+ if (geteuid() == pwd->pw_uid)
+ RETURNC(PAM_SUCCESS);
+ if (initgroups(pwd->pw_name, pwd->pw_gid) < 0 ||
+ setegid(pwd->pw_gid) < 0 || seteuid(pwd->pw_uid) < 0) {
+ openpam_restore_cred(pamh);
+ RETURNC(PAM_SYSTEM_ERR);
+ }
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * =pam_set_data
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_PERM_DENIED
+ */
+
+/**
+ * The =openpam_borrow_cred function saves the current credentials and
+ * switches to those of the user specified by its =pwd argument.
+ * The affected credentials are the effective UID, the effective GID, and
+ * the group access list.
+ * The original credentials can be restored using =openpam_restore_cred.
+ *
+ * >setegid 2
+ * >seteuid 2
+ * >setgroups 2
+ */
diff --git a/lib/libpam/openpam_check_owner_perms.c b/lib/libpam/openpam_check_owner_perms.c
new file mode 100644
index 0000000..d3b2ca9
--- /dev/null
+++ b/lib/libpam/openpam_check_owner_perms.c
@@ -0,0 +1,146 @@
+/*-
+ * Copyright (c) 2011 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_check_owner_perms.c 543 2012-03-31 22:11:34Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM internal
+ *
+ * Verify that the file or directory referenced by the given descriptor is
+ * owned by either root or the arbitrator and that it is not writable by
+ * group or other.
+ */
+
+int
+openpam_check_desc_owner_perms(const char *name, int fd)
+{
+ uid_t root, arbitrator;
+ struct stat sb;
+ int serrno;
+
+ root = 0;
+ arbitrator = geteuid();
+ if (fstat(fd, &sb) != 0) {
+ serrno = errno;
+ openpam_log(PAM_LOG_ERROR, "%s: %m", name);
+ errno = serrno;
+ return (-1);
+ }
+ if (!S_ISREG(sb.st_mode)) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s: not a regular file", name);
+ errno = EINVAL;
+ return (-1);
+ }
+ if ((sb.st_uid != root && sb.st_uid != arbitrator) ||
+ (sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s: insecure ownership or permissions", name);
+ errno = EPERM;
+ return (-1);
+ }
+ return (0);
+}
+
+/*
+ * OpenPAM internal
+ *
+ * Verify that a file or directory and all components of the path leading
+ * up to it are owned by either root or the arbitrator and that they are
+ * not writable by group or other.
+ *
+ * Note that openpam_check_desc_owner_perms() should be used instead if
+ * possible to avoid a race between the ownership / permission check and
+ * the actual open().
+ */
+
+int
+openpam_check_path_owner_perms(const char *path)
+{
+ uid_t root, arbitrator;
+ char pathbuf[PATH_MAX];
+ struct stat sb;
+ int len, serrno, tip;
+
+ tip = 1;
+ root = 0;
+ arbitrator = geteuid();
+ if (realpath(path, pathbuf) == NULL)
+ return (-1);
+ len = strlen(pathbuf);
+ while (len > 0) {
+ if (stat(pathbuf, &sb) != 0) {
+ if (errno != ENOENT) {
+ serrno = errno;
+ openpam_log(PAM_LOG_ERROR, "%s: %m", pathbuf);
+ errno = serrno;
+ }
+ return (-1);
+ }
+ if (tip && !S_ISREG(sb.st_mode)) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s: not a regular file", pathbuf);
+ errno = EINVAL;
+ return (-1);
+ }
+ if ((sb.st_uid != root && sb.st_uid != arbitrator) ||
+ (sb.st_mode & (S_IWGRP|S_IWOTH)) != 0) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s: insecure ownership or permissions", pathbuf);
+ errno = EPERM;
+ return (-1);
+ }
+ while (--len > 0 && pathbuf[len] != '/')
+ pathbuf[len] = '\0';
+ tip = 0;
+ }
+ return (0);
+}
+
+/*
+ * NOPARSE
+ */
diff --git a/lib/libpam/openpam_configure.c b/lib/libpam/openpam_configure.c
new file mode 100644
index 0000000..8172a6f
--- /dev/null
+++ b/lib/libpam/openpam_configure.c
@@ -0,0 +1,465 @@
+/*-
+ * Copyright (c) 2001-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2012 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_configure.c 612 2012-05-26 23:02:55Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+#include "openpam_ctype.h"
+#include "openpam_strlcat.h"
+#include "openpam_strlcpy.h"
+
+static int openpam_load_chain(pam_handle_t *, const char *, pam_facility_t);
+
+/*
+ * Validate a service name.
+ *
+ * Returns a non-zero value if the argument points to a NUL-terminated
+ * string consisting entirely of characters in the POSIX portable filename
+ * character set, excluding the path separator character.
+ */
+static int
+valid_service_name(const char *name)
+{
+ const char *p;
+
+ if (OPENPAM_FEATURE(RESTRICT_SERVICE_NAME)) {
+ /* path separator not allowed */
+ for (p = name; *p != '\0'; ++p)
+ if (!is_pfcs(*p))
+ return (0);
+ } else {
+ /* path separator allowed */
+ for (p = name; *p != '\0'; ++p)
+ if (!is_pfcs(*p) && *p != '/')
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * Parse the facility name.
+ *
+ * Returns the corresponding pam_facility_t value, or -1 if the argument
+ * is not a valid facility name.
+ */
+static pam_facility_t
+parse_facility_name(const char *name)
+{
+ int i;
+
+ for (i = 0; i < PAM_NUM_FACILITIES; ++i)
+ if (strcmp(pam_facility_name[i], name) == 0)
+ return (i);
+ return ((pam_facility_t)-1);
+}
+
+/*
+ * Parse the control flag.
+ *
+ * Returns the corresponding pam_control_t value, or -1 if the argument is
+ * not a valid control flag name.
+ */
+static pam_control_t
+parse_control_flag(const char *name)
+{
+ int i;
+
+ for (i = 0; i < PAM_NUM_CONTROL_FLAGS; ++i)
+ if (strcmp(pam_control_flag_name[i], name) == 0)
+ return (i);
+ return ((pam_control_t)-1);
+}
+
+/*
+ * Validate a file name.
+ *
+ * Returns a non-zero value if the argument points to a NUL-terminated
+ * string consisting entirely of characters in the POSIX portable filename
+ * character set, including the path separator character.
+ */
+static int
+valid_module_name(const char *name)
+{
+ const char *p;
+
+ if (OPENPAM_FEATURE(RESTRICT_MODULE_NAME)) {
+ /* path separator not allowed */
+ for (p = name; *p != '\0'; ++p)
+ if (!is_pfcs(*p))
+ return (0);
+ } else {
+ /* path separator allowed */
+ for (p = name; *p != '\0'; ++p)
+ if (!is_pfcs(*p) && *p != '/')
+ return (0);
+ }
+ return (1);
+}
+
+typedef enum { pam_conf_style, pam_d_style } openpam_style_t;
+
+/*
+ * Extracts given chains from a policy file.
+ *
+ * Returns the number of policy entries which were found for the specified
+ * service and facility, or -1 if a system error occurred or a syntax
+ * error was encountered.
+ */
+static int
+openpam_parse_chain(pam_handle_t *pamh,
+ const char *service,
+ pam_facility_t facility,
+ FILE *f,
+ const char *filename,
+ openpam_style_t style)
+{
+ pam_chain_t *this, **next;
+ pam_facility_t fclt;
+ pam_control_t ctlf;
+ char *name, *servicename, *modulename;
+ int count, lineno, ret, serrno;
+ char **wordv, *word;
+ int i, wordc;
+
+ count = 0;
+ this = NULL;
+ name = NULL;
+ lineno = 0;
+ wordc = 0;
+ wordv = NULL;
+ while ((wordv = openpam_readlinev(f, &lineno, &wordc)) != NULL) {
+ /* blank line? */
+ if (wordc == 0) {
+ FREEV(wordc, wordv);
+ continue;
+ }
+ i = 0;
+
+ /* check service name if necessary */
+ if (style == pam_conf_style &&
+ strcmp(wordv[i++], service) != 0) {
+ FREEV(wordc, wordv);
+ continue;
+ }
+
+ /* check facility name */
+ if ((word = wordv[i++]) == NULL ||
+ (fclt = parse_facility_name(word)) == (pam_facility_t)-1) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s(%d): missing or invalid facility",
+ filename, lineno);
+ goto fail;
+ }
+ if (facility != fclt && facility != PAM_FACILITY_ANY) {
+ FREEV(wordc, wordv);
+ continue;
+ }
+
+ /* check for "include" */
+ if ((word = wordv[i++]) != NULL &&
+ strcmp(word, "include") == 0) {
+ if ((servicename = wordv[i++]) == NULL ||
+ !valid_service_name(servicename)) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s(%d): missing or invalid service name",
+ filename, lineno);
+ goto fail;
+ }
+ if (wordv[i] != NULL) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s(%d): garbage at end of line",
+ filename, lineno);
+ goto fail;
+ }
+ ret = openpam_load_chain(pamh, servicename, fclt);
+ FREEV(wordc, wordv);
+ if (ret < 0)
+ goto fail;
+ continue;
+ }
+
+ /* get control flag */
+ if (word == NULL || /* same word we compared to "include" */
+ (ctlf = parse_control_flag(word)) == (pam_control_t)-1) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s(%d): missing or invalid control flag",
+ filename, lineno);
+ goto fail;
+ }
+
+ /* get module name */
+ if ((modulename = wordv[i++]) == NULL ||
+ !valid_module_name(modulename)) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s(%d): missing or invalid module name",
+ filename, lineno);
+ goto fail;
+ }
+
+ /* allocate new entry */
+ if ((this = calloc(1, sizeof *this)) == NULL)
+ goto syserr;
+ this->flag = ctlf;
+
+ /* load module */
+ if ((this->module = openpam_load_module(modulename)) == NULL)
+ goto fail;
+
+ /*
+ * The remaining items in wordv are the module's
+ * arguments. We could set this->optv = wordv + i, but
+ * then free(this->optv) wouldn't work. Instead, we free
+ * the words we've already consumed, shift the rest up,
+ * and clear the tail end of the array.
+ */
+ this->optc = wordc - i;
+ for (i = 0; i < wordc - this->optc; ++i) {
+ FREE(wordv[i]);
+ }
+ for (i = 0; i < this->optc; ++i) {
+ wordv[i] = wordv[wordc - this->optc + i];
+ wordv[wordc - this->optc + i] = NULL;
+ }
+ this->optv = wordv;
+ wordv = NULL;
+ wordc = 0;
+
+ /* hook it up */
+ for (next = &pamh->chains[fclt]; *next != NULL;
+ next = &(*next)->next)
+ /* nothing */ ;
+ *next = this;
+ this = NULL;
+ ++count;
+ }
+ /*
+ * The loop ended because openpam_readword() returned NULL, which
+ * can happen for four different reasons: an I/O error (ferror(f)
+ * is true), a memory allocation failure (ferror(f) is false,
+ * errno is non-zero)
+ */
+ if (ferror(f) || errno != 0)
+ goto syserr;
+ if (!feof(f))
+ goto fail;
+ fclose(f);
+ return (count);
+syserr:
+ serrno = errno;
+ openpam_log(PAM_LOG_ERROR, "%s: %m", filename);
+ errno = serrno;
+ /* fall through */
+fail:
+ serrno = errno;
+ if (this && this->optc && this->optv)
+ FREEV(this->optc, this->optv);
+ FREE(this);
+ FREEV(wordc, wordv);
+ FREE(wordv);
+ FREE(name);
+ fclose(f);
+ errno = serrno;
+ return (-1);
+}
+
+static const char *openpam_policy_path[] = {
+ "/etc/pam.d/",
+ "/etc/pam.conf",
+ "/usr/local/etc/pam.d/",
+ "/usr/local/etc/pam.conf",
+ NULL
+};
+
+/*
+ * Read the specified chains from the specified file.
+ *
+ * Returns 0 if the file exists but does not contain any matching lines.
+ *
+ * Returns -1 and sets errno to ENOENT if the file does not exist.
+ *
+ * Returns -1 and sets errno to some other non-zero value if the file
+ * exists but is unsafe or unreadable, or an I/O error occurs.
+ */
+static int
+openpam_load_file(pam_handle_t *pamh,
+ const char *service,
+ pam_facility_t facility,
+ const char *filename,
+ openpam_style_t style)
+{
+ FILE *f;
+ int ret, serrno;
+
+ /* attempt to open the file */
+ if ((f = fopen(filename, "r")) == NULL) {
+ serrno = errno;
+ openpam_log(errno == ENOENT ? PAM_LOG_DEBUG : PAM_LOG_ERROR,
+ "%s: %m", filename);
+ errno = serrno;
+ RETURNN(-1);
+ } else {
+ openpam_log(PAM_LOG_DEBUG, "found %s", filename);
+ }
+
+ /* verify type, ownership and permissions */
+ if (OPENPAM_FEATURE(VERIFY_POLICY_FILE) &&
+ openpam_check_desc_owner_perms(filename, fileno(f)) != 0) {
+ /* already logged the cause */
+ serrno = errno;
+ fclose(f);
+ errno = serrno;
+ RETURNN(-1);
+ }
+
+ /* parse the file */
+ ret = openpam_parse_chain(pamh, service, facility,
+ f, filename, style);
+ RETURNN(ret);
+}
+
+/*
+ * Locates the policy file for a given service and reads the given chains
+ * from it.
+ *
+ * Returns the number of policy entries which were found for the specified
+ * service and facility, or -1 if a system error occurred or a syntax
+ * error was encountered.
+ */
+static int
+openpam_load_chain(pam_handle_t *pamh,
+ const char *service,
+ pam_facility_t facility)
+{
+ const char *p, **path;
+ char filename[PATH_MAX];
+ size_t len;
+ openpam_style_t style;
+ int ret;
+
+ ENTERS(facility < 0 ? "any" : pam_facility_name[facility]);
+
+ /* either absolute or relative to cwd */
+ if (strchr(service, '/') != NULL) {
+ if ((p = strrchr(service, '.')) != NULL && strcmp(p, ".conf") == 0)
+ style = pam_conf_style;
+ else
+ style = pam_d_style;
+ ret = openpam_load_file(pamh, service, facility,
+ service, style);
+ RETURNN(ret);
+ }
+
+ /* search standard locations */
+ for (path = openpam_policy_path; *path != NULL; ++path) {
+ /* construct filename */
+ len = strlcpy(filename, *path, sizeof filename);
+ if (filename[len - 1] == '/') {
+ len = strlcat(filename, service, sizeof filename);
+ if (len >= sizeof filename) {
+ errno = ENAMETOOLONG;
+ RETURNN(-1);
+ }
+ style = pam_d_style;
+ } else {
+ style = pam_conf_style;
+ }
+ ret = openpam_load_file(pamh, service, facility,
+ filename, style);
+ /* the file exists, but an error occurred */
+ if (ret == -1 && errno != ENOENT)
+ RETURNN(ret);
+ /* in pam.d style, an empty file counts as a hit */
+ if (ret == 0 && style == pam_d_style)
+ RETURNN(ret);
+ }
+
+ /* no hit */
+ RETURNN(0);
+}
+
+/*
+ * OpenPAM internal
+ *
+ * Configure a service
+ */
+
+int
+openpam_configure(pam_handle_t *pamh,
+ const char *service)
+{
+ pam_facility_t fclt;
+ int serrno;
+
+ ENTERS(service);
+ if (!valid_service_name(service)) {
+ openpam_log(PAM_LOG_ERROR, "invalid service name");
+ RETURNC(PAM_SYSTEM_ERR);
+ }
+ if (openpam_load_chain(pamh, service, PAM_FACILITY_ANY) < 0)
+ goto load_err;
+ for (fclt = 0; fclt < PAM_NUM_FACILITIES; ++fclt) {
+ if (pamh->chains[fclt] != NULL)
+ continue;
+ if (openpam_load_chain(pamh, PAM_OTHER, fclt) < 0)
+ goto load_err;
+ }
+ RETURNC(PAM_SUCCESS);
+load_err:
+ serrno = errno;
+ openpam_clear_chains(pamh->chains);
+ errno = serrno;
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ *
+ * Error codes:
+ * PAM_SYSTEM_ERR
+ */
diff --git a/lib/libpam/openpam_constants.c b/lib/libpam/openpam_constants.c
new file mode 100644
index 0000000..833e81f
--- /dev/null
+++ b/lib/libpam/openpam_constants.c
@@ -0,0 +1,127 @@
+/*-
+ * Copyright (c) 2001-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_constants.c 491 2011-11-12 00:12:32Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+const char *pam_err_name[PAM_NUM_ERRORS] = {
+ "PAM_SUCCESS",
+ "PAM_OPEN_ERR",
+ "PAM_SYMBOL_ERR",
+ "PAM_SERVICE_ERR",
+ "PAM_SYSTEM_ERR",
+ "PAM_BUF_ERR",
+ "PAM_CONV_ERR",
+ "PAM_PERM_DENIED",
+ "PAM_MAXTRIES",
+ "PAM_AUTH_ERR",
+ "PAM_NEW_AUTHTOK_REQD",
+ "PAM_CRED_INSUFFICIENT",
+ "PAM_AUTHINFO_UNAVAIL",
+ "PAM_USER_UNKNOWN",
+ "PAM_CRED_UNAVAIL",
+ "PAM_CRED_EXPIRED",
+ "PAM_CRED_ERR",
+ "PAM_ACCT_EXPIRED",
+ "PAM_AUTHTOK_EXPIRED",
+ "PAM_SESSION_ERR",
+ "PAM_AUTHTOK_ERR",
+ "PAM_AUTHTOK_RECOVERY_ERR",
+ "PAM_AUTHTOK_LOCK_BUSY",
+ "PAM_AUTHTOK_DISABLE_AGING",
+ "PAM_NO_MODULE_DATA",
+ "PAM_IGNORE",
+ "PAM_ABORT",
+ "PAM_TRY_AGAIN",
+ "PAM_MODULE_UNKNOWN",
+ "PAM_DOMAIN_UNKNOWN"
+};
+
+const char *pam_item_name[PAM_NUM_ITEMS] = {
+ "(NO ITEM)",
+ "PAM_SERVICE",
+ "PAM_USER",
+ "PAM_TTY",
+ "PAM_RHOST",
+ "PAM_CONV",
+ "PAM_AUTHTOK",
+ "PAM_OLDAUTHTOK",
+ "PAM_RUSER",
+ "PAM_USER_PROMPT",
+ "PAM_REPOSITORY",
+ "PAM_AUTHTOK_PROMPT",
+ "PAM_OLDAUTHTOK_PROMPT",
+ "PAM_HOST",
+};
+
+const char *pam_facility_name[PAM_NUM_FACILITIES] = {
+ [PAM_ACCOUNT] = "account",
+ [PAM_AUTH] = "auth",
+ [PAM_PASSWORD] = "password",
+ [PAM_SESSION] = "session",
+};
+
+const char *pam_control_flag_name[PAM_NUM_CONTROL_FLAGS] = {
+ [PAM_BINDING] = "binding",
+ [PAM_OPTIONAL] = "optional",
+ [PAM_REQUIRED] = "required",
+ [PAM_REQUISITE] = "requisite",
+ [PAM_SUFFICIENT] = "sufficient",
+};
+
+const char *pam_func_name[PAM_NUM_PRIMITIVES] = {
+ "pam_authenticate",
+ "pam_setcred",
+ "pam_acct_mgmt",
+ "pam_open_session",
+ "pam_close_session",
+ "pam_chauthtok"
+};
+
+const char *pam_sm_func_name[PAM_NUM_PRIMITIVES] = {
+ "pam_sm_authenticate",
+ "pam_sm_setcred",
+ "pam_sm_acct_mgmt",
+ "pam_sm_open_session",
+ "pam_sm_close_session",
+ "pam_sm_chauthtok"
+};
diff --git a/lib/libpam/openpam_constants.h b/lib/libpam/openpam_constants.h
new file mode 100644
index 0000000..a7d6ce8
--- /dev/null
+++ b/lib/libpam/openpam_constants.h
@@ -0,0 +1,43 @@
+/*-
+ * Copyright (c) 2011 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_constants.h 606 2012-04-20 11:06:38Z des $
+ */
+
+#ifndef OPENPAM_CONSTANTS_H_INCLUDED
+#define OPENPAM_CONSTANTS_H_INCLUDED
+
+extern const char *pam_err_name[PAM_NUM_ERRORS];
+extern const char *pam_item_name[PAM_NUM_ITEMS];
+extern const char *pam_facility_name[PAM_NUM_FACILITIES];
+extern const char *pam_control_flag_name[PAM_NUM_CONTROL_FLAGS];
+extern const char *pam_func_name[PAM_NUM_PRIMITIVES];
+extern const char *pam_sm_func_name[PAM_NUM_PRIMITIVES];
+
+#endif
diff --git a/lib/libpam/openpam_ctype.h b/lib/libpam/openpam_ctype.h
new file mode 100644
index 0000000..b3ec846
--- /dev/null
+++ b/lib/libpam/openpam_ctype.h
@@ -0,0 +1,68 @@
+/*-
+ * Copyright (c) 2012 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_ctype.h 578 2012-04-06 00:45:59Z des $
+ */
+
+#ifndef OPENPAM_CTYPE_H_INCLUDED
+#define OPENPAM_CTYPE_H_INCLUDED
+
+/*
+ * Evaluates to non-zero if the argument is a linear whitespace character.
+ * For the purposes of this macro, the definition of linear whitespace is
+ * extended to include the form feed and carraige return characters.
+ */
+#define is_lws(ch) \
+ (ch == ' ' || ch == '\t' || ch == '\f' || ch == '\r')
+
+/*
+ * Evaluates to non-zero if the argument is a whitespace character.
+ */
+#define is_ws(ch) \
+ (is_lws(ch) || ch == '\n')
+
+/*
+ * Evaluates to non-zero if the argument is a printable ASCII character.
+ * Assumes that the execution character set is a superset of ASCII.
+ */
+#define is_p(ch) \
+ (ch >= '!' && ch <= '~')
+
+/*
+ * Returns non-zero if the argument belongs to the POSIX Portable Filename
+ * Character Set. Assumes that the execution character set is a superset
+ * of ASCII.
+ */
+#define is_pfcs(ch) \
+ ((ch >= '0' && ch <= '9') || \
+ (ch >= 'A' && ch <= 'Z') || \
+ (ch >= 'a' && ch <= 'z') || \
+ ch == '.' || ch == '_' || ch == '-')
+
+#endif
diff --git a/lib/libpam/openpam_debug.h b/lib/libpam/openpam_debug.h
new file mode 100644
index 0000000..050783e
--- /dev/null
+++ b/lib/libpam/openpam_debug.h
@@ -0,0 +1,112 @@
+/*-
+ * Copyright (c) 2001-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_debug.h 606 2012-04-20 11:06:38Z des $
+ */
+
+#ifndef OPENPAM_DEBUG_H_INCLUDED
+#define OPENPAM_DEBUG_H_INCLUDED
+
+#ifdef OPENPAM_DEBUG
+#define ENTER() openpam_log(PAM_LOG_LIBDEBUG, "entering")
+#define ENTERI(i) do { \
+ int i_ = (i); \
+ if (i_ > 0 && i_ < PAM_NUM_ITEMS) \
+ openpam_log(PAM_LOG_LIBDEBUG, "entering: %s", pam_item_name[i_]); \
+ else \
+ openpam_log(PAM_LOG_LIBDEBUG, "entering: %d", i_); \
+} while (0)
+#define ENTERN(n) do { \
+ int n_ = (n); \
+ openpam_log(PAM_LOG_LIBDEBUG, "entering: %d", n_); \
+} while (0)
+#define ENTERS(s) do { \
+ const char *s_ = (s); \
+ if (s_ == NULL) \
+ openpam_log(PAM_LOG_LIBDEBUG, "entering: NULL"); \
+ else \
+ openpam_log(PAM_LOG_LIBDEBUG, "entering: '%s'", s_); \
+} while (0)
+#define ENTERF(f) do { \
+ int f_ = (f); \
+ if (f_ >= 0 && f_ <= OPENPAM_NUM_FEATURES) \
+ openpam_log(PAM_LOG_LIBDEBUG, "entering: %s", \
+ openpam_features[f_].name); \
+ else \
+ openpam_log(PAM_LOG_LIBDEBUG, "entering: %d", f_); \
+} while (0)
+#define RETURNV() openpam_log(PAM_LOG_LIBDEBUG, "returning")
+#define RETURNC(c) do { \
+ int c_ = (c); \
+ if (c_ >= 0 && c_ < PAM_NUM_ERRORS) \
+ openpam_log(PAM_LOG_LIBDEBUG, "returning %s", pam_err_name[c_]); \
+ else \
+ openpam_log(PAM_LOG_LIBDEBUG, "returning %d!", c_); \
+ return (c_); \
+} while (0)
+#define RETURNN(n) do { \
+ int n_ = (n); \
+ openpam_log(PAM_LOG_LIBDEBUG, "returning %d", n_); \
+ return (n_); \
+} while (0)
+#define RETURNP(p) do { \
+ void *p_ = (p); \
+ if (p_ == NULL) \
+ openpam_log(PAM_LOG_LIBDEBUG, "returning NULL"); \
+ else \
+ openpam_log(PAM_LOG_LIBDEBUG, "returning %p", p_); \
+ return (p_); \
+} while (0)
+#define RETURNS(s) do { \
+ const char *s_ = (s); \
+ if (s_ == NULL) \
+ openpam_log(PAM_LOG_LIBDEBUG, "returning NULL"); \
+ else \
+ openpam_log(PAM_LOG_LIBDEBUG, "returning '%s'", s_); \
+ return (s_); \
+} while (0)
+#else
+#define ENTER()
+#define ENTERI(i)
+#define ENTERN(n)
+#define ENTERS(s)
+#define ENTERF(f)
+#define RETURNV() return
+#define RETURNC(c) return (c)
+#define RETURNN(n) return (n)
+#define RETURNP(p) return (p)
+#define RETURNS(s) return (s)
+#endif
+
+#endif
diff --git a/lib/libpam/openpam_dispatch.c b/lib/libpam/openpam_dispatch.c
new file mode 100644
index 0000000..54dfd3b
--- /dev/null
+++ b/lib/libpam/openpam_dispatch.c
@@ -0,0 +1,238 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_dispatch.c 501 2011-12-07 01:28:05Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#if !defined(OPENPAM_RELAX_CHECKS)
+static void openpam_check_error_code(int, int);
+#else
+#define openpam_check_error_code(a, b)
+#endif /* !defined(OPENPAM_RELAX_CHECKS) */
+
+/*
+ * OpenPAM internal
+ *
+ * Execute a module chain
+ */
+
+int
+openpam_dispatch(pam_handle_t *pamh,
+ int primitive,
+ int flags)
+{
+ pam_chain_t *chain;
+ int err, fail, r;
+ int debug;
+
+ ENTER();
+ if (pamh == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+
+ /* prevent recursion */
+ if (pamh->current != NULL) {
+ openpam_log(PAM_LOG_ERROR,
+ "%s() called while %s::%s() is in progress",
+ pam_func_name[primitive],
+ pamh->current->module->path,
+ pam_sm_func_name[pamh->primitive]);
+ RETURNC(PAM_ABORT);
+ }
+
+ /* pick a chain */
+ switch (primitive) {
+ case PAM_SM_AUTHENTICATE:
+ case PAM_SM_SETCRED:
+ chain = pamh->chains[PAM_AUTH];
+ break;
+ case PAM_SM_ACCT_MGMT:
+ chain = pamh->chains[PAM_ACCOUNT];
+ break;
+ case PAM_SM_OPEN_SESSION:
+ case PAM_SM_CLOSE_SESSION:
+ chain = pamh->chains[PAM_SESSION];
+ break;
+ case PAM_SM_CHAUTHTOK:
+ chain = pamh->chains[PAM_PASSWORD];
+ break;
+ default:
+ RETURNC(PAM_SYSTEM_ERR);
+ }
+
+ /* execute */
+ for (err = fail = 0; chain != NULL; chain = chain->next) {
+ if (chain->module->func[primitive] == NULL) {
+ openpam_log(PAM_LOG_ERROR, "%s: no %s()",
+ chain->module->path, pam_sm_func_name[primitive]);
+ r = PAM_SYSTEM_ERR;
+ } else {
+ pamh->primitive = primitive;
+ pamh->current = chain;
+ debug = (openpam_get_option(pamh, "debug") != NULL);
+ if (debug)
+ ++openpam_debug;
+ openpam_log(PAM_LOG_DEBUG, "calling %s() in %s",
+ pam_sm_func_name[primitive], chain->module->path);
+ r = (chain->module->func[primitive])(pamh, flags,
+ chain->optc, (const char **)chain->optv);
+ pamh->current = NULL;
+ openpam_log(PAM_LOG_DEBUG, "%s: %s(): %s",
+ chain->module->path, pam_sm_func_name[primitive],
+ pam_strerror(pamh, r));
+ if (debug)
+ --openpam_debug;
+ }
+
+ if (r == PAM_IGNORE)
+ continue;
+ if (r == PAM_SUCCESS) {
+ /*
+ * For pam_setcred() and pam_chauthtok() with the
+ * PAM_PRELIM_CHECK flag, treat "sufficient" as
+ * "optional".
+ */
+ if ((chain->flag == PAM_SUFFICIENT ||
+ chain->flag == PAM_BINDING) && !fail &&
+ primitive != PAM_SM_SETCRED &&
+ !(primitive == PAM_SM_CHAUTHTOK &&
+ (flags & PAM_PRELIM_CHECK)))
+ break;
+ continue;
+ }
+
+ openpam_check_error_code(primitive, r);
+
+ /*
+ * Record the return code from the first module to
+ * fail. If a required module fails, record the
+ * return code from the first required module to fail.
+ */
+ if (err == 0)
+ err = r;
+ if ((chain->flag == PAM_REQUIRED ||
+ chain->flag == PAM_BINDING) && !fail) {
+ openpam_log(PAM_LOG_DEBUG, "required module failed");
+ fail = 1;
+ err = r;
+ }
+
+ /*
+ * If a requisite module fails, terminate the chain
+ * immediately.
+ */
+ if (chain->flag == PAM_REQUISITE) {
+ openpam_log(PAM_LOG_DEBUG, "requisite module failed");
+ fail = 1;
+ break;
+ }
+ }
+
+ if (!fail && err != PAM_NEW_AUTHTOK_REQD)
+ err = PAM_SUCCESS;
+ RETURNC(err);
+}
+
+#if !defined(OPENPAM_RELAX_CHECKS)
+static void
+openpam_check_error_code(int primitive, int r)
+{
+ /* common error codes */
+ if (r == PAM_SUCCESS ||
+ r == PAM_SERVICE_ERR ||
+ r == PAM_BUF_ERR ||
+ r == PAM_CONV_ERR ||
+ r == PAM_PERM_DENIED ||
+ r == PAM_ABORT)
+ return;
+
+ /* specific error codes */
+ switch (primitive) {
+ case PAM_SM_AUTHENTICATE:
+ if (r == PAM_AUTH_ERR ||
+ r == PAM_CRED_INSUFFICIENT ||
+ r == PAM_AUTHINFO_UNAVAIL ||
+ r == PAM_USER_UNKNOWN ||
+ r == PAM_MAXTRIES)
+ return;
+ break;
+ case PAM_SM_SETCRED:
+ if (r == PAM_CRED_UNAVAIL ||
+ r == PAM_CRED_EXPIRED ||
+ r == PAM_USER_UNKNOWN ||
+ r == PAM_CRED_ERR)
+ return;
+ break;
+ case PAM_SM_ACCT_MGMT:
+ if (r == PAM_USER_UNKNOWN ||
+ r == PAM_AUTH_ERR ||
+ r == PAM_NEW_AUTHTOK_REQD ||
+ r == PAM_ACCT_EXPIRED)
+ return;
+ break;
+ case PAM_SM_OPEN_SESSION:
+ case PAM_SM_CLOSE_SESSION:
+ if (r == PAM_SESSION_ERR)
+ return;
+ break;
+ case PAM_SM_CHAUTHTOK:
+ if (r == PAM_PERM_DENIED ||
+ r == PAM_AUTHTOK_ERR ||
+ r == PAM_AUTHTOK_RECOVERY_ERR ||
+ r == PAM_AUTHTOK_LOCK_BUSY ||
+ r == PAM_AUTHTOK_DISABLE_AGING ||
+ r == PAM_TRY_AGAIN)
+ return;
+ break;
+ }
+
+ openpam_log(PAM_LOG_ERROR, "%s(): unexpected return value %d",
+ pam_sm_func_name[primitive], r);
+}
+#endif /* !defined(OPENPAM_RELAX_CHECKS) */
+
+/*
+ * NODOC
+ *
+ * Error codes:
+ */
diff --git a/lib/libpam/openpam_dynamic.c b/lib/libpam/openpam_dynamic.c
new file mode 100644
index 0000000..1dfc1ac
--- /dev/null
+++ b/lib/libpam/openpam_dynamic.c
@@ -0,0 +1,188 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_dynamic.c 607 2012-04-20 11:09:37Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <dlfcn.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#ifndef RTLD_NOW
+#define RTLD_NOW RTLD_LAZY
+#endif
+
+/*
+ * OpenPAM internal
+ *
+ * Perform sanity checks and attempt to load a module
+ */
+
+#ifdef HAVE_FDLOPEN
+static void *
+try_dlopen(const char *modfn)
+{
+ void *dlh;
+ int fd;
+
+ if ((fd = open(modfn, O_RDONLY)) < 0)
+ return (NULL);
+ if (OPENPAM_FEATURE(VERIFY_MODULE_FILE) &&
+ openpam_check_desc_owner_perms(modfn, fd) != 0) {
+ close(fd);
+ return (NULL);
+ }
+ if ((dlh = fdlopen(fd, RTLD_NOW)) == NULL) {
+ openpam_log(PAM_LOG_ERROR, "%s: %s", modfn, dlerror());
+ close(fd);
+ errno = 0;
+ return (NULL);
+ }
+ close(fd);
+ return (dlh);
+}
+#else
+static void *
+try_dlopen(const char *modfn)
+{
+ int check_module_file;
+ void *dlh;
+
+ openpam_get_feature(OPENPAM_VERIFY_MODULE_FILE,
+ &check_module_file);
+ if (check_module_file &&
+ openpam_check_path_owner_perms(modfn) != 0)
+ return (NULL);
+ if ((dlh = dlopen(modfn, RTLD_NOW)) == NULL) {
+ openpam_log(PAM_LOG_ERROR, "%s: %s", modfn, dlerror());
+ errno = 0;
+ return (NULL);
+ }
+ return (dlh);
+}
+#endif
+
+/*
+ * OpenPAM internal
+ *
+ * Locate a dynamically linked module
+ */
+
+pam_module_t *
+openpam_dynamic(const char *path)
+{
+ const pam_module_t *dlmodule;
+ pam_module_t *module;
+ const char *prefix;
+ char *vpath;
+ void *dlh;
+ int i, serrno;
+
+ dlh = NULL;
+
+ /* Prepend the standard prefix if not an absolute pathname. */
+ if (path[0] != '/')
+ prefix = OPENPAM_MODULES_DIR;
+ else
+ prefix = "";
+
+ /* try versioned module first, then unversioned module */
+ if (asprintf(&vpath, "%s%s.%d", prefix, path, LIB_MAJ) < 0)
+ goto err;
+ if ((dlh = try_dlopen(vpath)) == NULL && errno == ENOENT) {
+ *strrchr(vpath, '.') = '\0';
+ dlh = try_dlopen(vpath);
+ }
+ if (dlh == NULL)
+ goto err;
+ if ((module = calloc(1, sizeof *module)) == NULL)
+ goto buf_err;
+ if ((module->path = strdup(path)) == NULL)
+ goto buf_err;
+ module->dlh = dlh;
+ dlmodule = dlsym(dlh, "_pam_module");
+ for (i = 0; i < PAM_NUM_PRIMITIVES; ++i) {
+ if (dlmodule) {
+ module->func[i] = dlmodule->func[i];
+ } else {
+ module->func[i] =
+ (pam_func_t)dlsym(dlh, pam_sm_func_name[i]);
+ /*
+ * This openpam_log() call is a major source of
+ * log spam, and the cases that matter are caught
+ * and logged in openpam_dispatch(). This would
+ * be less problematic if dlerror() returned an
+ * error code so we could log an error only when
+ * dlsym() failed for a reason other than "no such
+ * symbol".
+ */
+#if 0
+ if (module->func[i] == NULL)
+ openpam_log(PAM_LOG_DEBUG, "%s: %s(): %s",
+ path, pam_sm_func_name[i], dlerror());
+#endif
+ }
+ }
+ FREE(vpath);
+ return (module);
+buf_err:
+ serrno = errno;
+ if (dlh != NULL)
+ dlclose(dlh);
+ FREE(module);
+ errno = serrno;
+err:
+ serrno = errno;
+ if (errno != 0)
+ openpam_log(PAM_LOG_ERROR, "%s: %m", vpath);
+ FREE(vpath);
+ errno = serrno;
+ return (NULL);
+}
+
+/*
+ * NOPARSE
+ */
diff --git a/lib/libpam/openpam_features.c b/lib/libpam/openpam_features.c
new file mode 100644
index 0000000..586fc2a
--- /dev/null
+++ b/lib/libpam/openpam_features.c
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2012 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_features.c 608 2012-05-17 16:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#define STRUCT_OPENPAM_FEATURE(name, descr, dflt) \
+ [OPENPAM_##name] = { \
+ "OPENPAM_" #name, \
+ descr, \
+ dflt \
+ }
+
+struct openpam_feature openpam_features[OPENPAM_NUM_FEATURES] = {
+ STRUCT_OPENPAM_FEATURE(
+ RESTRICT_SERVICE_NAME,
+ "Disallow path separators in service names",
+ 1
+ ),
+ STRUCT_OPENPAM_FEATURE(
+ VERIFY_POLICY_FILE,
+ "Verify ownership and permissions of policy files",
+ 1
+ ),
+ STRUCT_OPENPAM_FEATURE(
+ RESTRICT_MODULE_NAME,
+ "Disallow path separators in module names",
+ 0
+ ),
+ STRUCT_OPENPAM_FEATURE(
+ VERIFY_MODULE_FILE,
+ "Verify ownership and permissions of module files",
+ 1
+ ),
+};
diff --git a/lib/libpam/openpam_features.h b/lib/libpam/openpam_features.h
new file mode 100644
index 0000000..227b1a9
--- /dev/null
+++ b/lib/libpam/openpam_features.h
@@ -0,0 +1,48 @@
+/*-
+ * Copyright (c) 2012 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id$
+ */
+
+#ifndef OPENPAM_FEATURES_H_INCLUDED
+#define OPENPAM_FEATURES_H_INCLUDED
+
+struct openpam_feature {
+ const char *name;
+ const char *desc;
+ int onoff;
+};
+
+extern struct openpam_feature openpam_features[OPENPAM_NUM_FEATURES];
+
+/* shortcut for internal use */
+#define OPENPAM_FEATURE(f) \
+ openpam_features[OPENPAM_##f].onoff
+
+#endif
diff --git a/lib/libpam/openpam_findenv.c b/lib/libpam/openpam_findenv.c
new file mode 100644
index 0000000..b833ec9
--- /dev/null
+++ b/lib/libpam/openpam_findenv.c
@@ -0,0 +1,73 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_findenv.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM internal
+ *
+ * Locate an environment variable
+ */
+
+int
+openpam_findenv(pam_handle_t *pamh,
+ const char *name,
+ size_t len)
+{
+ int i;
+
+ ENTER();
+ if (pamh == NULL)
+ RETURNN(-1);
+ for (i = 0; i < pamh->env_count; ++i)
+ if (strncmp(pamh->env[i], name, len) == 0 &&
+ pamh->env[i][len] == '=')
+ RETURNN(i);
+ RETURNN(-1);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/openpam_free_data.c b/lib/libpam/openpam_free_data.c
new file mode 100644
index 0000000..561687c
--- /dev/null
+++ b/lib/libpam/openpam_free_data.c
@@ -0,0 +1,76 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_free_data.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Generic cleanup function
+ */
+
+void
+openpam_free_data(pam_handle_t *pamh,
+ void *data,
+ int status)
+{
+
+ ENTER();
+ (void)pamh;
+ (void)status;
+ FREE(data);
+ RETURNV();
+}
+
+/*
+ * Error codes:
+ */
+
+/**
+ * The =openpam_free_data function is a cleanup function suitable for
+ * passing to =pam_set_data.
+ * It simply releases the data by passing its =data argument to =free.
+ */
diff --git a/lib/libpam/openpam_free_envlist.c b/lib/libpam/openpam_free_envlist.c
new file mode 100644
index 0000000..14754dc
--- /dev/null
+++ b/lib/libpam/openpam_free_envlist.c
@@ -0,0 +1,72 @@
+/*-
+ * Copyright (c) 2005-2011 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * 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.
+ *
+ * $Id: openpam_free_envlist.c 447 2011-10-22 02:47:36Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Free an environment list
+ */
+
+void
+openpam_free_envlist(char **envlist)
+{
+ char **env;
+
+ ENTER();
+ if (envlist == NULL)
+ RETURNV();
+ for (env = envlist; *env != NULL; ++env)
+ FREE(*env);
+ FREE(envlist);
+ RETURNV();
+}
+
+/*
+ * Error codes:
+ */
+
+/**
+ * The =openpam_free_envlist function is a convenience function which
+ * frees all the environment variables in an environment list, and the
+ * list itself.
+ * It is suitable for freeing the return value from =pam_getenvlist.
+ *
+ * AUTHOR DES
+ */
diff --git a/lib/libpam/openpam_get_feature.c b/lib/libpam/openpam_get_feature.c
new file mode 100644
index 0000000..b552357
--- /dev/null
+++ b/lib/libpam/openpam_get_feature.c
@@ -0,0 +1,99 @@
+/*-
+ * Copyright (c) 2012 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_get_feature.c 608 2012-05-17 16:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Query the state of an optional feature.
+ */
+
+int
+openpam_get_feature(int feature, int *onoff)
+{
+
+ ENTERF(feature);
+ if (feature < 0 || feature >= OPENPAM_NUM_FEATURES)
+ RETURNC(PAM_SYMBOL_ERR);
+ *onoff = openpam_features[feature].onoff;
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYMBOL_ERR
+ */
+
+/**
+ * EXPERIMENTAL
+ *
+ * The =openpam_get_feature function stores the current state of the
+ * specified feature in the variable pointed to by its =onoff argument.
+ *
+ * The following features are recognized:
+ *
+ * =OPENPAM_RESTRICT_SERVICE_NAME:
+ * Disallow path separators in service names.
+ * This feature is enabled by default.
+ * Disabling it allows the application to specify the path to
+ * the desired policy file directly.
+ *
+ * =OPENPAM_VERIFY_POLICY_FILE:
+ * Verify the ownership and permissions of the policy file
+ * and the path leading up to it.
+ * This feature is enabled by default.
+ *
+ * =OPENPAM_RESTRICT_MODULE_NAME:
+ * Disallow path separators in module names.
+ * This feature is disabled by default.
+ * Enabling it prevents the use of modules in non-standard
+ * locations.
+ *
+ * =OPENPAM_VERIFY_MODULE_FILE:
+ * Verify the ownership and permissions of each loadable
+ * module and the path leading up to it.
+ * This feature is enabled by default.
+ *
+ *
+ * >openpam_set_feature
+ *
+ * AUTHOR DES
+ */
diff --git a/lib/libpam/openpam_get_option.c b/lib/libpam/openpam_get_option.c
new file mode 100644
index 0000000..1f62d21
--- /dev/null
+++ b/lib/libpam/openpam_get_option.c
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_get_option.c 531 2012-03-31 14:24:37Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Returns the value of a module option
+ */
+
+const char *
+openpam_get_option(pam_handle_t *pamh,
+ const char *option)
+{
+ pam_chain_t *cur;
+ size_t len;
+ int i;
+
+ ENTERS(option);
+ if (pamh == NULL || pamh->current == NULL || option == NULL)
+ RETURNS(NULL);
+ cur = pamh->current;
+ len = strlen(option);
+ for (i = 0; i < cur->optc; ++i) {
+ if (strncmp(cur->optv[i], option, len) == 0) {
+ if (cur->optv[i][len] == '\0')
+ RETURNS(&cur->optv[i][len]);
+ else if (cur->optv[i][len] == '=')
+ RETURNS(&cur->optv[i][len + 1]);
+ }
+ }
+ RETURNS(NULL);
+}
+
+/**
+ * The =openpam_get_option function returns the value of the specified
+ * option in the context of the currently executing service module, or
+ * =NULL if the option is not set or no module is currently executing.
+ *
+ * >openpam_set_option
+ */
diff --git a/lib/libpam/openpam_impl.h b/lib/libpam/openpam_impl.h
new file mode 100644
index 0000000..9e8b45f
--- /dev/null
+++ b/lib/libpam/openpam_impl.h
@@ -0,0 +1,179 @@
+/*-
+ * Copyright (c) 2001-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_impl.h 594 2012-04-14 14:18:41Z des $
+ */
+
+#ifndef OPENPAM_IMPL_H_INCLUDED
+#define OPENPAM_IMPL_H_INCLUDED
+
+#include <security/openpam.h>
+
+extern int openpam_debug;
+
+/*
+ * Control flags
+ */
+typedef enum {
+ PAM_BINDING,
+ PAM_REQUIRED,
+ PAM_REQUISITE,
+ PAM_SUFFICIENT,
+ PAM_OPTIONAL,
+ PAM_NUM_CONTROL_FLAGS
+} pam_control_t;
+
+/*
+ * Facilities
+ */
+typedef enum {
+ PAM_FACILITY_ANY = -1,
+ PAM_AUTH = 0,
+ PAM_ACCOUNT,
+ PAM_SESSION,
+ PAM_PASSWORD,
+ PAM_NUM_FACILITIES
+} pam_facility_t;
+
+/*
+ * Module chains
+ */
+typedef struct pam_chain pam_chain_t;
+struct pam_chain {
+ pam_module_t *module;
+ int flag;
+ int optc;
+ char **optv;
+ pam_chain_t *next;
+};
+
+/*
+ * Service policies
+ */
+#if defined(OPENPAM_EMBEDDED)
+typedef struct pam_policy pam_policy_t;
+struct pam_policy {
+ const char *service;
+ pam_chain_t *chains[PAM_NUM_FACILITIES];
+};
+extern pam_policy_t *pam_embedded_policies[];
+#endif
+
+/*
+ * Module-specific data
+ */
+typedef struct pam_data pam_data_t;
+struct pam_data {
+ char *name;
+ void *data;
+ void (*cleanup)(pam_handle_t *, void *, int);
+ pam_data_t *next;
+};
+
+/*
+ * PAM context
+ */
+struct pam_handle {
+ char *service;
+
+ /* chains */
+ pam_chain_t *chains[PAM_NUM_FACILITIES];
+ pam_chain_t *current;
+ int primitive;
+
+ /* items and data */
+ void *item[PAM_NUM_ITEMS];
+ pam_data_t *module_data;
+
+ /* environment list */
+ char **env;
+ int env_count;
+ int env_size;
+};
+
+#ifdef NGROUPS_MAX
+/*
+ * Saved credentials
+ */
+#define PAM_SAVED_CRED "pam_saved_cred"
+struct pam_saved_cred {
+ uid_t euid;
+ gid_t egid;
+ gid_t groups[NGROUPS_MAX];
+ int ngroups;
+};
+#endif
+
+/*
+ * Default policy
+ */
+#define PAM_OTHER "other"
+
+/*
+ * Internal functions
+ */
+int openpam_configure(pam_handle_t *, const char *);
+int openpam_dispatch(pam_handle_t *, int, int);
+int openpam_findenv(pam_handle_t *, const char *, size_t);
+pam_module_t *openpam_load_module(const char *);
+void openpam_clear_chains(pam_chain_t **);
+
+int openpam_check_desc_owner_perms(const char *, int);
+int openpam_check_path_owner_perms(const char *);
+
+#ifdef OPENPAM_STATIC_MODULES
+pam_module_t *openpam_static(const char *);
+#endif
+pam_module_t *openpam_dynamic(const char *);
+
+#define FREE(p) \
+ do { \
+ free(p); \
+ (p) = NULL; \
+ } while (0)
+
+#define FREEV(c, v) \
+ do { \
+ while (c) { \
+ --(c); \
+ FREE((v)[(c)]); \
+ } \
+ FREE(v); \
+ } while (0)
+
+#include "openpam_constants.h"
+#include "openpam_debug.h"
+#include "openpam_features.h"
+
+#endif
diff --git a/lib/libpam/openpam_load.c b/lib/libpam/openpam_load.c
new file mode 100644
index 0000000..871d1a8
--- /dev/null
+++ b/lib/libpam/openpam_load.c
@@ -0,0 +1,135 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_load.c 547 2012-04-01 15:01:21Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <dlfcn.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * Locate a matching dynamic or static module.
+ */
+
+pam_module_t *
+openpam_load_module(const char *path)
+{
+ pam_module_t *module;
+
+ module = openpam_dynamic(path);
+ openpam_log(PAM_LOG_DEBUG, "%s dynamic %s",
+ (module == NULL) ? "no" : "using", path);
+
+#ifdef OPENPAM_STATIC_MODULES
+ /* look for a static module */
+ if (module == NULL && strchr(path, '/') == NULL) {
+ module = openpam_static(path);
+ openpam_log(PAM_LOG_DEBUG, "%s static %s",
+ (module == NULL) ? "no" : "using", path);
+ }
+#endif
+ if (module == NULL) {
+ openpam_log(PAM_LOG_ERROR, "no %s found", path);
+ return (NULL);
+ }
+ return (module);
+}
+
+
+/*
+ * Release a module.
+ * XXX highly thread-unsafe
+ */
+
+static void
+openpam_release_module(pam_module_t *module)
+{
+ if (module == NULL)
+ return;
+ if (module->dlh == NULL)
+ /* static module */
+ return;
+ dlclose(module->dlh);
+ openpam_log(PAM_LOG_DEBUG, "releasing %s", module->path);
+ FREE(module->path);
+ FREE(module);
+}
+
+
+/*
+ * Destroy a chain, freeing all its links and releasing the modules
+ * they point to.
+ */
+
+static void
+openpam_destroy_chain(pam_chain_t *chain)
+{
+ if (chain == NULL)
+ return;
+ openpam_destroy_chain(chain->next);
+ chain->next = NULL;
+ FREEV(chain->optc, chain->optv);
+ openpam_release_module(chain->module);
+ chain->module = NULL;
+ FREE(chain);
+}
+
+
+/*
+ * Clear the chains and release the modules
+ */
+
+void
+openpam_clear_chains(pam_chain_t *policy[])
+{
+ int i;
+
+ for (i = 0; i < PAM_NUM_FACILITIES; ++i) {
+ openpam_destroy_chain(policy[i]);
+ policy[i] = NULL;
+ }
+}
+
+/*
+ * NOPARSE
+ */
diff --git a/lib/libpam/openpam_log.c b/lib/libpam/openpam_log.c
new file mode 100644
index 0000000..2b89f6c
--- /dev/null
+++ b/lib/libpam/openpam_log.c
@@ -0,0 +1,170 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_log.c 544 2012-03-31 22:47:15Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#ifdef OPENPAM_DEBUG
+int openpam_debug = 1;
+#else
+int openpam_debug = 0;
+#endif
+
+#if !defined(openpam_log)
+
+/*
+ * OpenPAM extension
+ *
+ * Log a message through syslog
+ */
+
+void
+openpam_log(int level, const char *fmt, ...)
+{
+ va_list ap;
+ int priority;
+
+ switch (level) {
+ case PAM_LOG_LIBDEBUG:
+ case PAM_LOG_DEBUG:
+ if (!openpam_debug)
+ return;
+ priority = LOG_DEBUG;
+ break;
+ case PAM_LOG_VERBOSE:
+ priority = LOG_INFO;
+ break;
+ case PAM_LOG_NOTICE:
+ priority = LOG_NOTICE;
+ break;
+ case PAM_LOG_ERROR:
+ default:
+ priority = LOG_ERR;
+ break;
+ }
+ va_start(ap, fmt);
+ vsyslog(priority, fmt, ap);
+ va_end(ap);
+}
+
+#else
+
+void
+_openpam_log(int level, const char *func, const char *fmt, ...)
+{
+ va_list ap;
+ char *format;
+ int priority;
+ int serrno;
+
+ switch (level) {
+ case PAM_LOG_LIBDEBUG:
+ case PAM_LOG_DEBUG:
+ if (!openpam_debug)
+ return;
+ priority = LOG_DEBUG;
+ break;
+ case PAM_LOG_VERBOSE:
+ priority = LOG_INFO;
+ break;
+ case PAM_LOG_NOTICE:
+ priority = LOG_NOTICE;
+ break;
+ case PAM_LOG_ERROR:
+ default:
+ priority = LOG_ERR;
+ break;
+ }
+ va_start(ap, fmt);
+ serrno = errno;
+ if (asprintf(&format, "in %s(): %s", func, fmt) > 0) {
+ errno = serrno;
+ vsyslog(priority, format, ap);
+ FREE(format);
+ } else {
+ errno = serrno;
+ vsyslog(priority, fmt, ap);
+ }
+ va_end(ap);
+}
+
+#endif
+
+/**
+ * The =openpam_log function logs messages using =syslog.
+ * It is primarily intended for internal use by the library and modules.
+ *
+ * The =level argument indicates the importance of the message.
+ * The following levels are defined:
+ *
+ * =PAM_LOG_LIBDEBUG:
+ * Debugging messages.
+ * For internal use only.
+ * =PAM_LOG_DEBUG:
+ * Debugging messages.
+ * These messages are normally not logged unless the global
+ * integer variable :openpam_debug is set to a non-zero
+ * value, in which case they are logged with a =syslog
+ * priority of =LOG_DEBUG.
+ * =PAM_LOG_VERBOSE:
+ * Information about the progress of the authentication
+ * process, or other non-essential messages.
+ * These messages are logged with a =syslog priority of
+ * =LOG_INFO.
+ * =PAM_LOG_NOTICE:
+ * Messages relating to non-fatal errors.
+ * These messages are logged with a =syslog priority of
+ * =LOG_NOTICE.
+ * =PAM_LOG_ERROR:
+ * Messages relating to serious errors.
+ * These messages are logged with a =syslog priority of
+ * =LOG_ERR.
+ *
+ * The remaining arguments are a =printf format string and the
+ * corresponding arguments.
+ */
diff --git a/lib/libpam/openpam_nullconv.c b/lib/libpam/openpam_nullconv.c
new file mode 100644
index 0000000..a95b1e0
--- /dev/null
+++ b/lib/libpam/openpam_nullconv.c
@@ -0,0 +1,90 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_nullconv.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Null conversation function
+ */
+
+int
+openpam_nullconv(int n,
+ const struct pam_message **msg,
+ struct pam_response **resp,
+ void *data)
+{
+
+ ENTER();
+ (void)n;
+ (void)msg;
+ (void)resp;
+ (void)data;
+ RETURNC(PAM_CONV_ERR);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_CONV_ERR
+ */
+
+/**
+ * The =openpam_nullconv function is a null conversation function suitable
+ * for applications that want to use PAM but don't support interactive
+ * dialog with the user.
+ * Such applications should set =PAM_AUTHTOK to whatever authentication
+ * token they've obtained on their own before calling =pam_authenticate
+ * and / or =pam_chauthtok, and their PAM configuration should specify the
+ * ;use_first_pass option for all modules that require access to the
+ * authentication token, to make sure they use =PAM_AUTHTOK rather than
+ * try to query the user.
+ *
+ * >openpam_ttyconv
+ * >pam_prompt
+ * >pam_set_item
+ * >pam_vprompt
+ */
diff --git a/lib/libpam/openpam_readline.c b/lib/libpam/openpam_readline.c
new file mode 100644
index 0000000..047ab8369
--- /dev/null
+++ b/lib/libpam/openpam_readline.c
@@ -0,0 +1,138 @@
+/*-
+ * Copyright (c) 2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_readline.c 596 2012-04-14 14:52:40Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#define MIN_LINE_LENGTH 128
+
+/*
+ * OpenPAM extension
+ *
+ * Read a line from a file.
+ */
+
+char *
+openpam_readline(FILE *f, int *lineno, size_t *lenp)
+{
+ char *line;
+ size_t len, size;
+ int ch;
+
+ line = NULL;
+ if (openpam_straddch(&line, &size, &len, 0) != 0)
+ return (NULL);
+ for (;;) {
+ ch = fgetc(f);
+ /* strip comment */
+ if (ch == '#') {
+ do {
+ ch = fgetc(f);
+ } while (ch != EOF && ch != '\n');
+ }
+ /* eof */
+ if (ch == EOF) {
+ /* done */
+ break;
+ }
+ /* eol */
+ if (ch == '\n') {
+ if (lineno != NULL)
+ ++*lineno;
+ /* skip blank lines */
+ if (len == 0)
+ continue;
+ /* continuation */
+ if (line[len - 1] == '\\') {
+ line[--len] = '\0';
+ continue;
+ }
+ /* done */
+ break;
+ }
+ /* anything else */
+ if (openpam_straddch(&line, &size, &len, ch) != 0)
+ goto fail;
+ }
+ if (len == 0)
+ goto fail;
+ if (lenp != NULL)
+ *lenp = len;
+ openpam_log(PAM_LOG_LIBDEBUG, "returning '%s'", line);
+ return (line);
+fail:
+ FREE(line);
+ return (NULL);
+}
+
+/**
+ * DEPRECATED openpam_readlinev
+ *
+ * The =openpam_readline function reads a line from a file, and returns it
+ * in a NUL-terminated buffer allocated with =!malloc.
+ *
+ * The =openpam_readline function performs a certain amount of processing
+ * on the data it reads:
+ *
+ * - Comments (introduced by a hash sign) are stripped.
+ *
+ * - Blank lines are ignored.
+ *
+ * - If a line ends in a backslash, the backslash is stripped and the
+ * next line is appended.
+ *
+ * If =lineno is not =NULL, the integer variable it points to is
+ * incremented every time a newline character is read.
+ *
+ * If =lenp is not =NULL, the length of the line (not including the
+ * terminating NUL character) is stored in the variable it points to.
+ *
+ * The caller is responsible for releasing the returned buffer by passing
+ * it to =!free.
+ *
+ * >openpam_readlinev
+ * >openpam_readword
+ */
diff --git a/lib/libpam/openpam_readlinev.c b/lib/libpam/openpam_readlinev.c
new file mode 100644
index 0000000..5a43b61
--- /dev/null
+++ b/lib/libpam/openpam_readlinev.c
@@ -0,0 +1,156 @@
+/*-
+ * Copyright (c) 2012 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_readlinev.c 588 2012-04-08 11:52:25Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#define MIN_WORDV_SIZE 32
+
+/*
+ * OpenPAM extension
+ *
+ * Read a line from a file and split it into words.
+ */
+
+char **
+openpam_readlinev(FILE *f, int *lineno, int *lenp)
+{
+ char *word, **wordv, **tmp;
+ size_t wordlen, wordvsize;
+ int ch, serrno, wordvlen;
+
+ wordvsize = MIN_WORDV_SIZE;
+ wordvlen = 0;
+ if ((wordv = malloc(wordvsize * sizeof *wordv)) == NULL) {
+ openpam_log(PAM_LOG_ERROR, "malloc(): %m");
+ errno = ENOMEM;
+ return (NULL);
+ }
+ wordv[wordvlen] = NULL;
+ while ((word = openpam_readword(f, lineno, &wordlen)) != NULL) {
+ if ((unsigned int)wordvlen + 1 >= wordvsize) {
+ /* need to expand the array */
+ wordvsize *= 2;
+ tmp = realloc(wordv, wordvsize * sizeof *wordv);
+ if (tmp == NULL) {
+ openpam_log(PAM_LOG_ERROR, "malloc(): %m");
+ errno = ENOMEM;
+ break;
+ }
+ wordv = tmp;
+ }
+ /* insert our word */
+ wordv[wordvlen++] = word;
+ wordv[wordvlen] = NULL;
+ }
+ if (errno != 0) {
+ /* I/O error or out of memory */
+ serrno = errno;
+ while (wordvlen--)
+ free(wordv[wordvlen]);
+ free(wordv);
+ errno = serrno;
+ return (NULL);
+ }
+ /* assert(!ferror(f)) */
+ ch = fgetc(f);
+ /* assert(ch == EOF || ch == '\n') */
+ if (ch == EOF && wordvlen == 0) {
+ free(wordv);
+ return (NULL);
+ }
+ if (ch == '\n' && lineno != NULL)
+ ++*lineno;
+ if (lenp != NULL)
+ *lenp = wordvlen;
+ return (wordv);
+}
+
+/**
+ * The =openpam_readlinev function reads a line from a file, splits it
+ * into words according to the rules described in the =openpam_readword
+ * manual page, and returns a list of those words.
+ *
+ * If =lineno is not =NULL, the integer variable it points to is
+ * incremented every time a newline character is read.
+ * This includes quoted or escaped newline characters and the newline
+ * character at the end of the line.
+ *
+ * If =lenp is not =NULL, the number of words on the line is stored in the
+ * variable to which it points.
+ *
+ * RETURN VALUES
+ *
+ * If successful, the =openpam_readlinev function returns a pointer to a
+ * dynamically allocated array of pointers to individual dynamically
+ * allocated NUL-terminated strings, each containing a single word, in the
+ * order in which they were encountered on the line.
+ * The array is terminated by a =NULL pointer.
+ *
+ * The caller is responsible for freeing both the array and the individual
+ * strings by passing each of them to =!free.
+ *
+ * If the end of the line was reached before any words were read,
+ * =openpam_readlinev returns a pointer to a dynamically allocated array
+ * containing a single =NULL pointer.
+ *
+ * The =openpam_readlinev function can fail and return =NULL for one of
+ * four reasons:
+ *
+ * - The end of the file was reached before any words were read; :errno is
+ * zero, =!ferror returns zero, and =!feof returns a non-zero value.
+ *
+ * - The end of the file was reached while a quote or backslash escape
+ * was in effect; :errno is set to =EINVAL, =!ferror returns zero, and
+ * =!feof returns a non-zero value.
+ *
+ * - An error occurred while reading from the file; :errno is non-zero,
+ * =!ferror returns a non-zero value and =!feof returns zero.
+ *
+ * - A =!malloc or =!realloc call failed; :errno is set to =ENOMEM,
+ * =!ferror returns a non-zero value, and =!feof may or may not return
+ * a non-zero value.
+ *
+ * >openpam_readline
+ * >openpam_readword
+ *
+ * AUTHOR DES
+ */
diff --git a/lib/libpam/openpam_readword.c b/lib/libpam/openpam_readword.c
new file mode 100644
index 0000000..1c0e9b6
--- /dev/null
+++ b/lib/libpam/openpam_readword.c
@@ -0,0 +1,202 @@
+/*-
+ * Copyright (c) 2012 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_readword.c 588 2012-04-08 11:52:25Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+#include "openpam_ctype.h"
+
+#define MIN_WORD_SIZE 32
+
+/*
+ * OpenPAM extension
+ *
+ * Read a word from a file, respecting shell quoting rules.
+ */
+
+char *
+openpam_readword(FILE *f, int *lineno, size_t *lenp)
+{
+ char *word;
+ size_t size, len;
+ int ch, comment, escape, quote;
+ int serrno;
+
+ errno = 0;
+
+ /* skip initial whitespace */
+ comment = 0;
+ while ((ch = getc(f)) != EOF && ch != '\n') {
+ if (ch == '#')
+ comment = 1;
+ if (!is_lws(ch) && !comment)
+ break;
+ }
+ if (ch == EOF)
+ return (NULL);
+ ungetc(ch, f);
+ if (ch == '\n')
+ return (NULL);
+
+ word = NULL;
+ size = len = 0;
+ escape = quote = 0;
+ while ((ch = fgetc(f)) != EOF && (!is_ws(ch) || quote || escape)) {
+ if (ch == '\\' && !escape && quote != '\'') {
+ /* escape next character */
+ escape = ch;
+ } else if ((ch == '\'' || ch == '"') && !quote && !escape) {
+ /* begin quote */
+ quote = ch;
+ /* edge case: empty quoted string */
+ if (openpam_straddch(&word, &size, &len, 0) != 0)
+ return (NULL);
+ } else if (ch == quote && !escape) {
+ /* end quote */
+ quote = 0;
+ } else if (ch == '\n' && escape && quote != '\'') {
+ /* line continuation */
+ escape = 0;
+ } else {
+ if (escape && quote && ch != '\\' && ch != quote &&
+ openpam_straddch(&word, &size, &len, '\\') != 0) {
+ free(word);
+ errno = ENOMEM;
+ return (NULL);
+ }
+ if (openpam_straddch(&word, &size, &len, ch) != 0) {
+ free(word);
+ errno = ENOMEM;
+ return (NULL);
+ }
+ escape = 0;
+ }
+ if (lineno != NULL && ch == '\n')
+ ++*lineno;
+ }
+ if (ch == EOF && ferror(f)) {
+ serrno = errno;
+ free(word);
+ errno = serrno;
+ return (NULL);
+ }
+ if (ch == EOF && (escape || quote)) {
+ /* Missing escaped character or closing quote. */
+ openpam_log(PAM_LOG_ERROR, "unexpected end of file");
+ free(word);
+ errno = EINVAL;
+ return (NULL);
+ }
+ ungetc(ch, f);
+ if (lenp != NULL)
+ *lenp = len;
+ return (word);
+}
+
+/**
+ * The =openpam_readword function reads the next word from a file, and
+ * returns it in a NUL-terminated buffer allocated with =!malloc.
+ *
+ * A word is a sequence of non-whitespace characters.
+ * However, whitespace characters can be included in a word if quoted or
+ * escaped according to the following rules:
+ *
+ * - An unescaped single or double quote introduces a quoted string,
+ * which ends when the same quote character is encountered a second
+ * time.
+ * The quotes themselves are stripped.
+ *
+ * - Within a single- or double-quoted string, all whitespace characters,
+ * including the newline character, are preserved as-is.
+ *
+ * - Outside a quoted string, a backslash escapes the next character,
+ * which is preserved as-is, unless that character is a newline, in
+ * which case it is discarded and reading continues at the beginning of
+ * the next line as if the backslash and newline had not been there.
+ * In all cases, the backslash itself is discarded.
+ *
+ * - Within a single-quoted string, double quotes and backslashes are
+ * preserved as-is.
+ *
+ * - Within a double-quoted string, a single quote is preserved as-is,
+ * and a backslash is preserved as-is unless used to escape a double
+ * quote.
+ *
+ * In addition, if the first non-whitespace character on the line is a
+ * hash character (#), the rest of the line is discarded.
+ * If a hash character occurs within a word, however, it is preserved
+ * as-is.
+ * A backslash at the end of a comment does cause line continuation.
+ *
+ * If =lineno is not =NULL, the integer variable it points to is
+ * incremented every time a quoted or escaped newline character is read.
+ *
+ * If =lenp is not =NULL, the length of the word (after quotes and
+ * backslashes have been removed) is stored in the variable it points to.
+ *
+ * RETURN VALUES
+ *
+ * If successful, the =openpam_readword function returns a pointer to a
+ * dynamically allocated NUL-terminated string containing the first word
+ * encountered on the line.
+ *
+ * The caller is responsible for releasing the returned buffer by passing
+ * it to =!free.
+ *
+ * If =openpam_readword reaches the end of the line or file before any
+ * characters are copied to the word, it returns =NULL. In the former
+ * case, the newline is pushed back to the file.
+ *
+ * If =openpam_readword reaches the end of the file while a quote or
+ * backslash escape is in effect, it sets :errno to =EINVAL and returns
+ * =NULL.
+ *
+ * IMPLEMENTATION NOTES
+ *
+ * The parsing rules are intended to be equivalent to the normal POSIX
+ * shell quoting rules.
+ * Any discrepancy is a bug and should be reported to the author along
+ * with sample input that can be used to reproduce the error.
+ *
+ * >openpam_readline
+ * >openpam_readlinev
+ *
+ * AUTHOR DES
+ */
diff --git a/lib/libpam/openpam_restore_cred.c b/lib/libpam/openpam_restore_cred.c
new file mode 100644
index 0000000..41d44d0
--- /dev/null
+++ b/lib/libpam/openpam_restore_cred.c
@@ -0,0 +1,98 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_restore_cred.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <grp.h>
+#include <limits.h>
+#include <pwd.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Restore credentials
+ */
+
+int
+openpam_restore_cred(pam_handle_t *pamh)
+{
+ const struct pam_saved_cred *scred;
+ const void *scredp;
+ int r;
+
+ ENTER();
+ r = pam_get_data(pamh, PAM_SAVED_CRED, &scredp);
+ if (r != PAM_SUCCESS)
+ RETURNC(r);
+ if (scredp == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ scred = scredp;
+ if (scred->euid != geteuid()) {
+ if (seteuid(scred->euid) < 0 ||
+ setgroups(scred->ngroups, scred->groups) < 0 ||
+ setegid(scred->egid) < 0)
+ RETURNC(PAM_SYSTEM_ERR);
+ }
+ pam_set_data(pamh, PAM_SAVED_CRED, NULL, NULL);
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * =pam_get_data
+ * PAM_SYSTEM_ERR
+ */
+
+/**
+ * The =openpam_restore_cred function restores the credentials saved by
+ * =openpam_borrow_cred.
+ *
+ * >setegid 2
+ * >seteuid 2
+ * >setgroups 2
+ */
diff --git a/lib/libpam/openpam_set_feature.c b/lib/libpam/openpam_set_feature.c
new file mode 100644
index 0000000..4f6a4a5
--- /dev/null
+++ b/lib/libpam/openpam_set_feature.c
@@ -0,0 +1,75 @@
+/*-
+ * Copyright (c) 2012 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_set_feature.c 608 2012-05-17 16:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Enable or disable an optional feature.
+ */
+
+int
+openpam_set_feature(int feature, int onoff)
+{
+
+ ENTERF(feature);
+ if (feature < 0 || feature >= OPENPAM_NUM_FEATURES)
+ RETURNC(PAM_SYMBOL_ERR);
+ openpam_features[feature].onoff = onoff;
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYMBOL_ERR
+ */
+
+/**
+ * EXPERIMENTAL
+ *
+ * The =openpam_set_feature function sets the state of the specified
+ * feature to the value specified by the =onoff argument.
+ * See =openpam_get_feature for a list of recognized features.
+ *
+ * >openpam_get_feature
+ *
+ * AUTHOR DES
+ */
diff --git a/lib/libpam/openpam_set_option.c b/lib/libpam/openpam_set_option.c
new file mode 100644
index 0000000..1712a71
--- /dev/null
+++ b/lib/libpam/openpam_set_option.c
@@ -0,0 +1,122 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_set_option.c 532 2012-03-31 14:24:53Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Sets the value of a module option
+ */
+
+int
+openpam_set_option(pam_handle_t *pamh,
+ const char *option,
+ const char *value)
+{
+ pam_chain_t *cur;
+ char *opt, **optv;
+ size_t len;
+ int i;
+
+ ENTERS(option);
+ if (pamh == NULL || pamh->current == NULL || option == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ cur = pamh->current;
+ for (len = 0; option[len] != '\0'; ++len)
+ if (option[len] == '=')
+ break;
+ for (i = 0; i < cur->optc; ++i) {
+ if (strncmp(cur->optv[i], option, len) == 0 &&
+ (cur->optv[i][len] == '\0' || cur->optv[i][len] == '='))
+ break;
+ }
+ if (value == NULL) {
+ /* remove */
+ if (i == cur->optc)
+ RETURNC(PAM_SUCCESS);
+ for (free(cur->optv[i]); i < cur->optc; ++i)
+ cur->optv[i] = cur->optv[i + 1];
+ cur->optv[i] = NULL;
+ RETURNC(PAM_SUCCESS);
+ }
+ if (asprintf(&opt, "%.*s=%s", (int)len, option, value) < 0)
+ RETURNC(PAM_BUF_ERR);
+ if (i == cur->optc) {
+ /* add */
+ optv = realloc(cur->optv, sizeof(char *) * (cur->optc + 2));
+ if (optv == NULL) {
+ FREE(opt);
+ RETURNC(PAM_BUF_ERR);
+ }
+ optv[i] = opt;
+ optv[i + 1] = NULL;
+ cur->optv = optv;
+ ++cur->optc;
+ } else {
+ /* replace */
+ FREE(cur->optv[i]);
+ cur->optv[i] = opt;
+ }
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ */
+
+/**
+ * The =openpam_set_option function sets the specified option in the
+ * context of the currently executing service module.
+ *
+ * >openpam_get_option
+ */
diff --git a/lib/libpam/openpam_static.c b/lib/libpam/openpam_static.c
new file mode 100644
index 0000000..40b807c
--- /dev/null
+++ b/lib/libpam/openpam_static.c
@@ -0,0 +1,74 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_static.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#ifdef OPENPAM_STATIC_MODULES
+
+SET_DECLARE(openpam_static_modules, pam_module_t);
+
+/*
+ * OpenPAM internal
+ *
+ * Locate a statically linked module
+ */
+
+pam_module_t *
+openpam_static(const char *path)
+{
+ pam_module_t **module;
+
+ SET_FOREACH(module, openpam_static_modules) {
+ if (strcmp((*module)->path, path) == 0)
+ return (*module);
+ }
+ return (NULL);
+}
+
+#endif
+
+/*
+ * NOPARSE
+ */
diff --git a/lib/libpam/openpam_straddch.c b/lib/libpam/openpam_straddch.c
new file mode 100644
index 0000000..9845cc6
--- /dev/null
+++ b/lib/libpam/openpam_straddch.c
@@ -0,0 +1,111 @@
+/*-
+ * Copyright (c) 2012 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_straddch.c 568 2012-04-05 14:35:53Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#define MIN_STR_SIZE 32
+
+/*
+ * OpenPAM extension
+ *
+ * Add a character to a string, expanding the buffer if needed.
+ */
+
+int
+openpam_straddch(char **str, size_t *size, size_t *len, int ch)
+{
+ size_t tmpsize;
+ char *tmpstr;
+
+ if (*str == NULL) {
+ /* initial allocation */
+ tmpsize = MIN_STR_SIZE;
+ if ((tmpstr = malloc(tmpsize)) == NULL) {
+ openpam_log(PAM_LOG_ERROR, "malloc(): %m");
+ errno = ENOMEM;
+ return (-1);
+ }
+ *str = tmpstr;
+ *size = tmpsize;
+ *len = 0;
+ } else if (*len + 1 >= *size) {
+ /* additional space required */
+ tmpsize = *size * 2;
+ if ((tmpstr = realloc(*str, tmpsize)) == NULL) {
+ openpam_log(PAM_LOG_ERROR, "realloc(): %m");
+ errno = ENOMEM;
+ return (-1);
+ }
+ *size = tmpsize;
+ *str = tmpstr;
+ }
+ (*str)[*len] = ch;
+ ++*len;
+ (*str)[*len] = '\0';
+ return (0);
+}
+
+/**
+ * The =openpam_straddch function appends a character to a dynamically
+ * allocated NUL-terminated buffer, reallocating the buffer as needed.
+ *
+ * The =str argument points to a variable containing either a pointer to
+ * an existing buffer or =NULL.
+ * If the value of the variable pointed to by =str is =NULL, a new buffer
+ * is allocated.
+ *
+ * The =size and =len argument point to variables used to hold the size
+ * of the buffer and the length of the string it contains, respectively.
+ *
+ * If a new buffer is allocated or an existing buffer is reallocated to
+ * make room for the additional character, =str and =size are updated
+ * accordingly.
+ *
+ * The =openpam_straddch function ensures that the buffer is always
+ * NUL-terminated.
+ *
+ * If the =openpam_straddch function is successful, it increments the
+ * integer variable pointed to by =len and returns 0.
+ * Otherwise, it leaves the variables pointed to by =str, =size and =len
+ * unmodified, sets :errno to =ENOMEM and returns -1.
+ *
+ * AUTHOR DES
+ */
diff --git a/lib/libpam/openpam_strlcat.h b/lib/libpam/openpam_strlcat.h
new file mode 100644
index 0000000..1f26693
--- /dev/null
+++ b/lib/libpam/openpam_strlcat.h
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 2011 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_strlcat.h 578 2012-04-06 00:45:59Z des $
+ */
+
+#ifndef OPENPAM_STRLCAT_H_INCLUDED
+#define OPENPAM_STRLCAT_H_INCLUDED
+
+#ifndef HAVE_STRLCAT
+/* like strcat(3), but always NUL-terminates; returns strlen(src) */
+static size_t
+strlcat(char *dst, const char *src, size_t size)
+{
+ size_t len;
+
+ for (len = 0; *dst && size > 1; ++len, --size)
+ dst++;
+ for (; *src && size > 1; ++len, --size)
+ *dst++ = *src++;
+ *dst = '\0';
+ while (*src)
+ ++len, ++src;
+ return (len);
+}
+#endif
+
+#endif
diff --git a/lib/libpam/openpam_strlcmp.h b/lib/libpam/openpam_strlcmp.h
new file mode 100644
index 0000000..2a78e0f
--- /dev/null
+++ b/lib/libpam/openpam_strlcmp.h
@@ -0,0 +1,49 @@
+/*-
+ * Copyright (c) 2011 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_strlcmp.h 578 2012-04-06 00:45:59Z des $
+ */
+
+#ifndef OPENPAM_STRLCMP_H_INCLUDED
+#define OPENPAM_STRLCMP_H_INCLUDED
+
+#ifndef HAVE_STRLCMP
+/* like strcmp(3), but verifies that the entirety of s1 was matched */
+static int
+strlcmp(const char *s1, const char *s2, size_t len)
+{
+
+ for (; len && *s1 && *s2; --len, ++s1, ++s2)
+ if (*s1 != *s2)
+ return ((unsigned char)*s1 - (unsigned char)*s2);
+ return ((unsigned char)*s1);
+}
+#endif
+
+#endif
diff --git a/lib/libpam/openpam_strlcpy.h b/lib/libpam/openpam_strlcpy.h
new file mode 100644
index 0000000..9c65548
--- /dev/null
+++ b/lib/libpam/openpam_strlcpy.h
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 2011 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_strlcpy.h 578 2012-04-06 00:45:59Z des $
+ */
+
+#ifndef OPENPAM_STRLCPY_H_INCLUDED
+#define OPENPAM_STRLCPY_H_INCLUDED
+
+#ifndef HAVE_STRLCPY
+/* like strcpy(3), but always NUL-terminates; returns strlen(src) */
+static size_t
+strlcpy(char *dst, const char *src, size_t size)
+{
+ size_t len;
+
+ for (len = 0; *src && size > 1; ++len, --size)
+ *dst++ = *src++;
+ *dst = '\0';
+ while (*src)
+ ++len, ++src;
+ return (len);
+}
+#endif
+
+#endif
diff --git a/lib/libpam/openpam_subst.c b/lib/libpam/openpam_subst.c
new file mode 100644
index 0000000..bab7a78
--- /dev/null
+++ b/lib/libpam/openpam_subst.c
@@ -0,0 +1,171 @@
+/*-
+ * Copyright (c) 2011 Dag-Erling Smørgrav
+ * 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
+ * in this position and unchanged.
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_subst.c 543 2012-03-31 22:11:34Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+#define subst_char(ch) do { \
+ int ch_ = (ch); \
+ if (buf && len < *bufsize) \
+ *buf++ = ch_; \
+ ++len; \
+} while (0)
+
+#define subst_string(s) do { \
+ const char *s_ = (s); \
+ while (*s_) \
+ subst_char(*s_++); \
+} while (0)
+
+#define subst_item(i) do { \
+ int i_ = (i); \
+ const void *p_; \
+ ret = pam_get_item(pamh, i_, &p_); \
+ if (ret == PAM_SUCCESS && p_ != NULL) \
+ subst_string(p_); \
+} while (0)
+
+/*
+ * OpenPAM internal
+ *
+ * Substitute PAM item values in a string
+ */
+
+int
+openpam_subst(const pam_handle_t *pamh,
+ char *buf, size_t *bufsize, const char *template)
+{
+ size_t len;
+ int ret;
+
+ ENTERS(template);
+ if (template == NULL)
+ template = "(null)";
+
+ len = 1; /* initialize to 1 for terminating NUL */
+ ret = PAM_SUCCESS;
+ while (*template && ret == PAM_SUCCESS) {
+ if (template[0] == '%') {
+ ++template;
+ switch (*template) {
+ case 's':
+ subst_item(PAM_SERVICE);
+ break;
+ case 't':
+ subst_item(PAM_TTY);
+ break;
+ case 'h':
+ subst_item(PAM_HOST);
+ break;
+ case 'u':
+ subst_item(PAM_USER);
+ break;
+ case 'H':
+ subst_item(PAM_RHOST);
+ break;
+ case 'U':
+ subst_item(PAM_RUSER);
+ break;
+ case '\0':
+ subst_char('%');
+ break;
+ default:
+ subst_char('%');
+ subst_char(*template);
+ }
+ ++template;
+ } else {
+ subst_char(*template++);
+ }
+ }
+ if (buf)
+ *buf = '\0';
+ if (ret == PAM_SUCCESS) {
+ if (len > *bufsize)
+ ret = PAM_TRY_AGAIN;
+ *bufsize = len;
+ }
+ RETURNC(ret);
+}
+
+/*
+ * Error codes:
+ *
+ * =pam_get_item
+ * !PAM_SYMBOL_ERR
+ * PAM_TRY_AGAIN
+ */
+
+/**
+ * The =openpam_subst function expands a string, substituting PAM item
+ * values for all occurrences of specific substitution codes.
+ * The =template argument points to the initial string.
+ * The result is stored in the buffer pointed to by the =buf argument; the
+ * =bufsize argument specifies the size of that buffer.
+ * The actual size of the resulting string, including the terminating NUL
+ * character, is stored in the location pointed to by the =bufsize
+ * argument.
+ *
+ * If =buf is NULL, or if the buffer is too small to hold the expanded
+ * string, =bufsize is updated to reflect the amount of space required to
+ * hold the entire string, and =openpam_subst returns =PAM_TRY_AGAIN.
+ *
+ * If =openpam_subst fails for any other reason, the =bufsize argument is
+ * untouched, but part of the buffer may still have been overwritten.
+ *
+ * Substitution codes are introduced by a percent character and correspond
+ * to PAM items:
+ *
+ * %H:
+ * Replaced by the current value of the =PAM_RHOST item.
+ * %h:
+ * Replaced by the current value of the =PAM_HOST item.
+ * %s:
+ * Replaced by the current value of the =PAM_SERVICE item.
+ * %t:
+ * Replaced by the current value of the =PAM_TTY item.
+ * %U:
+ * Replaced by the current value of the =PAM_RUSER item.
+ * %u:
+ * Replaced by the current value of the =PAM_USER item.
+ *
+ * >pam_get_authtok
+ * >pam_get_item
+ * >pam_get_user
+ *
+ * AUTHOR DES
+ */
diff --git a/lib/libpam/openpam_ttyconv.c b/lib/libpam/openpam_ttyconv.c
new file mode 100644
index 0000000..14a324d
--- /dev/null
+++ b/lib/libpam/openpam_ttyconv.c
@@ -0,0 +1,252 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: openpam_ttyconv.c 527 2012-02-26 03:23:59Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+int openpam_ttyconv_timeout = 0;
+
+static void
+timeout(int sig)
+{
+
+ (void)sig;
+}
+
+static char *
+prompt(const char *msg)
+{
+ char buf[PAM_MAX_RESP_SIZE];
+ struct sigaction action, saved_action;
+ sigset_t saved_sigset, the_sigset;
+ unsigned int saved_alarm;
+ int eof, error, fd;
+ size_t len;
+ char *retval;
+ char ch;
+
+ sigemptyset(&the_sigset);
+ sigaddset(&the_sigset, SIGINT);
+ sigaddset(&the_sigset, SIGTSTP);
+ sigprocmask(SIG_SETMASK, &the_sigset, &saved_sigset);
+ action.sa_handler = &timeout;
+ action.sa_flags = 0;
+ sigemptyset(&action.sa_mask);
+ sigaction(SIGALRM, &action, &saved_action);
+ fputs(msg, stdout);
+ fflush(stdout);
+#ifdef HAVE_FPURGE
+ fpurge(stdin);
+#endif
+ fd = fileno(stdin);
+ buf[0] = '\0';
+ eof = error = 0;
+ saved_alarm = 0;
+ if (openpam_ttyconv_timeout >= 0)
+ saved_alarm = alarm(openpam_ttyconv_timeout);
+ ch = '\0';
+ for (len = 0; ch != '\n' && !eof && !error; ++len) {
+ switch (read(fd, &ch, 1)) {
+ case 1:
+ if (len < PAM_MAX_RESP_SIZE - 1) {
+ buf[len + 1] = '\0';
+ buf[len] = ch;
+ }
+ break;
+ case 0:
+ eof = 1;
+ break;
+ default:
+ error = errno;
+ break;
+ }
+ }
+ if (openpam_ttyconv_timeout >= 0)
+ alarm(0);
+ sigaction(SIGALRM, &saved_action, NULL);
+ sigprocmask(SIG_SETMASK, &saved_sigset, NULL);
+ if (saved_alarm > 0)
+ alarm(saved_alarm);
+ if (error == EINTR)
+ fputs(" timeout!", stderr);
+ if (error || eof) {
+ fputs("\n", stderr);
+ memset(buf, 0, sizeof(buf));
+ return (NULL);
+ }
+ /* trim trailing whitespace */
+ for (len = strlen(buf); len > 0; --len)
+ if (buf[len - 1] != '\r' && buf[len - 1] != '\n')
+ break;
+ buf[len] = '\0';
+ retval = strdup(buf);
+ memset(buf, 0, sizeof(buf));
+ return (retval);
+}
+
+static char *
+prompt_echo_off(const char *msg)
+{
+ struct termios tattr;
+ tcflag_t lflag;
+ char *ret;
+ int fd;
+
+ fd = fileno(stdin);
+ if (tcgetattr(fd, &tattr) != 0) {
+ openpam_log(PAM_LOG_ERROR, "tcgetattr(): %m");
+ return (NULL);
+ }
+ lflag = tattr.c_lflag;
+ tattr.c_lflag &= ~ECHO;
+ if (tcsetattr(fd, TCSAFLUSH, &tattr) != 0) {
+ openpam_log(PAM_LOG_ERROR, "tcsetattr(): %m");
+ return (NULL);
+ }
+ ret = prompt(msg);
+ tattr.c_lflag = lflag;
+ (void)tcsetattr(fd, TCSANOW, &tattr);
+ if (ret != NULL)
+ fputs("\n", stdout);
+ return (ret);
+}
+
+/*
+ * OpenPAM extension
+ *
+ * Simple tty-based conversation function
+ */
+
+int
+openpam_ttyconv(int n,
+ const struct pam_message **msg,
+ struct pam_response **resp,
+ void *data)
+{
+ struct pam_response *aresp;
+ int i;
+
+ ENTER();
+ (void)data;
+ if (n <= 0 || n > PAM_MAX_NUM_MSG)
+ RETURNC(PAM_CONV_ERR);
+ if ((aresp = calloc(n, sizeof *aresp)) == NULL)
+ RETURNC(PAM_BUF_ERR);
+ for (i = 0; i < n; ++i) {
+ aresp[i].resp_retcode = 0;
+ aresp[i].resp = NULL;
+ switch (msg[i]->msg_style) {
+ case PAM_PROMPT_ECHO_OFF:
+ aresp[i].resp = prompt_echo_off(msg[i]->msg);
+ if (aresp[i].resp == NULL)
+ goto fail;
+ break;
+ case PAM_PROMPT_ECHO_ON:
+ aresp[i].resp = prompt(msg[i]->msg);
+ if (aresp[i].resp == NULL)
+ goto fail;
+ break;
+ case PAM_ERROR_MSG:
+ fputs(msg[i]->msg, stderr);
+ if (strlen(msg[i]->msg) > 0 &&
+ msg[i]->msg[strlen(msg[i]->msg) - 1] != '\n')
+ fputc('\n', stderr);
+ break;
+ case PAM_TEXT_INFO:
+ fputs(msg[i]->msg, stdout);
+ if (strlen(msg[i]->msg) > 0 &&
+ msg[i]->msg[strlen(msg[i]->msg) - 1] != '\n')
+ fputc('\n', stdout);
+ break;
+ default:
+ goto fail;
+ }
+ }
+ *resp = aresp;
+ RETURNC(PAM_SUCCESS);
+fail:
+ for (i = 0; i < n; ++i) {
+ if (aresp[i].resp != NULL) {
+ memset(aresp[i].resp, 0, strlen(aresp[i].resp));
+ FREE(aresp[i].resp);
+ }
+ }
+ memset(aresp, 0, n * sizeof *aresp);
+ FREE(aresp);
+ *resp = NULL;
+ RETURNC(PAM_CONV_ERR);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ */
+
+/**
+ * The =openpam_ttyconv function is a standard conversation function
+ * suitable for use on TTY devices.
+ * It should be adequate for the needs of most text-based interactive
+ * programs.
+ *
+ * The =openpam_ttyconv function allows the application to specify a
+ * timeout for user input by setting the global integer variable
+ * :openpam_ttyconv_timeout to the length of the timeout in seconds.
+ *
+ * >openpam_nullconv
+ * >pam_prompt
+ * >pam_vprompt
+ */
diff --git a/lib/libpam/pam_acct_mgmt.c b/lib/libpam/pam_acct_mgmt.c
new file mode 100644
index 0000000..49c34ab
--- /dev/null
+++ b/lib/libpam/pam_acct_mgmt.c
@@ -0,0 +1,88 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_acct_mgmt.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 32
+ *
+ * Perform PAM account validation procedures
+ */
+
+int
+pam_acct_mgmt(pam_handle_t *pamh,
+ int flags)
+{
+ int r;
+
+ ENTER();
+ r = openpam_dispatch(pamh, PAM_SM_ACCT_MGMT, flags);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =openpam_dispatch
+ * =pam_sm_acct_mgmt
+ * !PAM_IGNORE
+ */
+
+/**
+ * The =pam_acct_mgmt function verifies and enforces account restrictions
+ * after the user has been authenticated.
+ *
+ * The =flags argument is the binary or of zero or more of the following
+ * values:
+ *
+ * =PAM_SILENT:
+ * Do not emit any messages.
+ * =PAM_DISALLOW_NULL_AUTHTOK:
+ * Fail if the user's authentication token is null.
+ *
+ * If any other bits are set, =pam_acct_mgmt will return
+ * =PAM_SYMBOL_ERR.
+ */
diff --git a/lib/libpam/pam_authenticate.c b/lib/libpam/pam_authenticate.c
new file mode 100644
index 0000000..fc6c20f
--- /dev/null
+++ b/lib/libpam/pam_authenticate.c
@@ -0,0 +1,96 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_authenticate.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 34
+ *
+ * Perform authentication within the PAM framework
+ */
+
+int
+pam_authenticate(pam_handle_t *pamh,
+ int flags)
+{
+ int r;
+
+ ENTER();
+ if (flags & ~(PAM_SILENT|PAM_DISALLOW_NULL_AUTHTOK))
+ RETURNC(PAM_SYMBOL_ERR);
+ r = openpam_dispatch(pamh, PAM_SM_AUTHENTICATE, flags);
+ pam_set_item(pamh, PAM_AUTHTOK, NULL);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =openpam_dispatch
+ * =pam_sm_authenticate
+ * !PAM_IGNORE
+ * PAM_SYMBOL_ERR
+ */
+
+/**
+ * The =pam_authenticate function attempts to authenticate the user
+ * associated with the pam context specified by the =pamh argument.
+ *
+ * The application is free to call =pam_authenticate as many times as it
+ * wishes, but some modules may maintain an internal retry counter and
+ * return =PAM_MAXTRIES when it exceeds some preset or hardcoded limit.
+ *
+ * The =flags argument is the binary or of zero or more of the following
+ * values:
+ *
+ * =PAM_SILENT:
+ * Do not emit any messages.
+ * =PAM_DISALLOW_NULL_AUTHTOK:
+ * Fail if the user's authentication token is null.
+ *
+ * If any other bits are set, =pam_authenticate will return
+ * =PAM_SYMBOL_ERR.
+ */
diff --git a/lib/libpam/pam_authenticate_secondary.c b/lib/libpam/pam_authenticate_secondary.c
new file mode 100644
index 0000000..1a57313
--- /dev/null
+++ b/lib/libpam/pam_authenticate_secondary.c
@@ -0,0 +1,67 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_authenticate_secondary.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 36
+ *
+ * Perform authentication to a secondary domain within the PAM framework
+ */
+
+int
+pam_authenticate_secondary(pam_handle_t *pamh,
+ char *target_username,
+ char *target_module_type,
+ char *target_authn_domain,
+ char *target_supp_data,
+ char *target_module_authtok,
+ int flags)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_chauthtok.c b/lib/libpam/pam_chauthtok.c
new file mode 100644
index 0000000..1750b0f
--- /dev/null
+++ b/lib/libpam/pam_chauthtok.c
@@ -0,0 +1,97 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_chauthtok.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 38
+ *
+ * Perform password related functions within the PAM framework
+ */
+
+int
+pam_chauthtok(pam_handle_t *pamh,
+ int flags)
+{
+ int r;
+
+ ENTER();
+ if (flags & ~(PAM_SILENT|PAM_CHANGE_EXPIRED_AUTHTOK))
+ RETURNC(PAM_SYMBOL_ERR);
+ r = openpam_dispatch(pamh, PAM_SM_CHAUTHTOK,
+ flags | PAM_PRELIM_CHECK);
+ if (r == PAM_SUCCESS)
+ r = openpam_dispatch(pamh, PAM_SM_CHAUTHTOK,
+ flags | PAM_UPDATE_AUTHTOK);
+ pam_set_item(pamh, PAM_OLDAUTHTOK, NULL);
+ pam_set_item(pamh, PAM_AUTHTOK, NULL);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =openpam_dispatch
+ * =pam_sm_chauthtok
+ * !PAM_IGNORE
+ * PAM_SYMBOL_ERR
+ */
+
+/**
+ * The =pam_chauthtok function attempts to change the authentication token
+ * for the user associated with the pam context specified by the =pamh
+ * argument.
+ *
+ * The =flags argument is the binary or of zero or more of the following
+ * values:
+ *
+ * =PAM_SILENT:
+ * Do not emit any messages.
+ * =PAM_CHANGE_EXPIRED_AUTHTOK:
+ * Change only those authentication tokens that have expired.
+ *
+ * If any other bits are set, =pam_chauthtok will return =PAM_SYMBOL_ERR.
+ */
diff --git a/lib/libpam/pam_close_session.c b/lib/libpam/pam_close_session.c
new file mode 100644
index 0000000..9e63a1d
--- /dev/null
+++ b/lib/libpam/pam_close_session.c
@@ -0,0 +1,89 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_close_session.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 40
+ *
+ * Close an existing user session
+ */
+
+int
+pam_close_session(pam_handle_t *pamh,
+ int flags)
+{
+ int r;
+
+ ENTER();
+ if (flags & ~(PAM_SILENT))
+ RETURNC(PAM_SYMBOL_ERR);
+ r = openpam_dispatch(pamh, PAM_SM_CLOSE_SESSION, flags);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =openpam_dispatch
+ * =pam_sm_close_session
+ * !PAM_IGNORE
+ * PAM_SYMBOL_ERR
+ */
+
+/**
+ * The =pam_close_session function tears down the user session previously
+ * set up by =pam_open_session.
+ *
+ * The =flags argument is the binary or of zero or more of the following
+ * values:
+ *
+ * =PAM_SILENT:
+ * Do not emit any messages.
+ *
+ * If any other bits are set, =pam_close_session will return
+ * =PAM_SYMBOL_ERR.
+ */
diff --git a/lib/libpam/pam_end.c b/lib/libpam/pam_end.c
new file mode 100644
index 0000000..09cde35
--- /dev/null
+++ b/lib/libpam/pam_end.c
@@ -0,0 +1,106 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_end.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 42
+ *
+ * Terminate the PAM transaction
+ */
+
+int
+pam_end(pam_handle_t *pamh,
+ int status)
+{
+ pam_data_t *dp;
+ int i;
+
+ ENTER();
+ if (pamh == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+
+ /* clear module data */
+ while ((dp = pamh->module_data) != NULL) {
+ if (dp->cleanup)
+ (dp->cleanup)(pamh, dp->data, status);
+ pamh->module_data = dp->next;
+ FREE(dp->name);
+ FREE(dp);
+ }
+
+ /* clear environment */
+ while (pamh->env_count) {
+ --pamh->env_count;
+ FREE(pamh->env[pamh->env_count]);
+ }
+ FREE(pamh->env);
+
+ /* clear chains */
+ openpam_clear_chains(pamh->chains);
+
+ /* clear items */
+ for (i = 0; i < PAM_NUM_ITEMS; ++i)
+ pam_set_item(pamh, i, NULL);
+
+ FREE(pamh);
+
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYSTEM_ERR
+ */
+
+/**
+ * The =pam_end function terminates a PAM transaction and destroys the
+ * corresponding PAM context, releasing all resources allocated to it.
+ *
+ * The =status argument should be set to the error code returned by the
+ * last API call before the call to =pam_end.
+ */
diff --git a/lib/libpam/pam_error.c b/lib/libpam/pam_error.c
new file mode 100644
index 0000000..1e0de5b
--- /dev/null
+++ b/lib/libpam/pam_error.c
@@ -0,0 +1,89 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_error.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Display an error message
+ */
+
+int
+pam_error(const pam_handle_t *pamh,
+ const char *fmt,
+ ...)
+{
+ va_list ap;
+ char *rsp;
+ int r;
+
+ va_start(ap, fmt);
+ r = pam_vprompt(pamh, PAM_ERROR_MSG, &rsp, fmt, ap);
+ va_end(ap);
+ FREE(rsp); /* ignore response */
+ return (r);
+}
+
+/*
+ * Error codes:
+ *
+ * !PAM_SYMBOL_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ */
+
+/**
+ * The =pam_error function displays an error message through the
+ * intermediary of the given PAM context's conversation function.
+ *
+ * >pam_info
+ * >pam_prompt
+ * >pam_verror
+ */
diff --git a/lib/libpam/pam_get_authtok.c b/lib/libpam/pam_get_authtok.c
new file mode 100644
index 0000000..1a3aebc
--- /dev/null
+++ b/lib/libpam/pam_get_authtok.c
@@ -0,0 +1,205 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_get_authtok.c 510 2011-12-31 13:14:23Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+#include "openpam_impl.h"
+
+static const char authtok_prompt[] = "Password:";
+static const char authtok_prompt_remote[] = "Password for %u@%h:";
+static const char oldauthtok_prompt[] = "Old Password:";
+static const char newauthtok_prompt[] = "New Password:";
+
+/*
+ * OpenPAM extension
+ *
+ * Retrieve authentication token
+ */
+
+int
+pam_get_authtok(pam_handle_t *pamh,
+ int item,
+ const char **authtok,
+ const char *prompt)
+{
+ char prompt_buf[1024];
+ size_t prompt_size;
+ const void *oldauthtok, *prevauthtok, *promptp;
+ const char *prompt_option, *default_prompt;
+ const void *lhost, *rhost;
+ char *resp, *resp2;
+ int pitem, r, style, twice;
+
+ ENTER();
+ if (pamh == NULL || authtok == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ *authtok = NULL;
+ twice = 0;
+ switch (item) {
+ case PAM_AUTHTOK:
+ pitem = PAM_AUTHTOK_PROMPT;
+ prompt_option = "authtok_prompt";
+ default_prompt = authtok_prompt;
+ r = pam_get_item(pamh, PAM_RHOST, &rhost);
+ if (r == PAM_SUCCESS && rhost != NULL) {
+ r = pam_get_item(pamh, PAM_HOST, &lhost);
+ if (r == PAM_SUCCESS && lhost != NULL) {
+ if (strcmp(rhost, lhost) != 0)
+ default_prompt = authtok_prompt_remote;
+ }
+ }
+ r = pam_get_item(pamh, PAM_OLDAUTHTOK, &oldauthtok);
+ if (r == PAM_SUCCESS && oldauthtok != NULL) {
+ default_prompt = newauthtok_prompt;
+ twice = 1;
+ }
+ break;
+ case PAM_OLDAUTHTOK:
+ pitem = PAM_OLDAUTHTOK_PROMPT;
+ prompt_option = "oldauthtok_prompt";
+ default_prompt = oldauthtok_prompt;
+ twice = 0;
+ break;
+ default:
+ RETURNC(PAM_SYMBOL_ERR);
+ }
+ if (openpam_get_option(pamh, "try_first_pass") ||
+ openpam_get_option(pamh, "use_first_pass")) {
+ r = pam_get_item(pamh, item, &prevauthtok);
+ if (r == PAM_SUCCESS && prevauthtok != NULL) {
+ *authtok = prevauthtok;
+ RETURNC(PAM_SUCCESS);
+ }
+ else if (openpam_get_option(pamh, "use_first_pass"))
+ RETURNC(r == PAM_SUCCESS ? PAM_AUTH_ERR : r);
+ }
+ /* pam policy overrides the module's choice */
+ if ((promptp = openpam_get_option(pamh, prompt_option)) != NULL)
+ prompt = promptp;
+ /* no prompt provided, see if there is one tucked away somewhere */
+ if (prompt == NULL)
+ if (pam_get_item(pamh, pitem, &promptp) && promptp != NULL)
+ prompt = promptp;
+ /* fall back to hardcoded default */
+ if (prompt == NULL)
+ prompt = default_prompt;
+ /* expand */
+ prompt_size = sizeof prompt_buf;
+ r = openpam_subst(pamh, prompt_buf, &prompt_size, prompt);
+ if (r == PAM_SUCCESS && prompt_size <= sizeof prompt_buf)
+ prompt = prompt_buf;
+ style = openpam_get_option(pamh, "echo_pass") ?
+ PAM_PROMPT_ECHO_ON : PAM_PROMPT_ECHO_OFF;
+ r = pam_prompt(pamh, style, &resp, "%s", prompt);
+ if (r != PAM_SUCCESS)
+ RETURNC(r);
+ if (twice) {
+ r = pam_prompt(pamh, style, &resp2, "Retype %s", prompt);
+ if (r != PAM_SUCCESS) {
+ FREE(resp);
+ RETURNC(r);
+ }
+ if (strcmp(resp, resp2) != 0)
+ FREE(resp);
+ FREE(resp2);
+ }
+ if (resp == NULL)
+ RETURNC(PAM_TRY_AGAIN);
+ r = pam_set_item(pamh, item, resp);
+ FREE(resp);
+ if (r != PAM_SUCCESS)
+ RETURNC(r);
+ r = pam_get_item(pamh, item, (const void **)authtok);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =pam_get_item
+ * =pam_prompt
+ * =pam_set_item
+ * !PAM_SYMBOL_ERR
+ * PAM_TRY_AGAIN
+ */
+
+/**
+ * The =pam_get_authtok function returns the cached authentication token,
+ * or prompts the user if no token is currently cached.
+ * Either way, a pointer to the authentication token is stored in the
+ * location pointed to by the =authtok argument.
+ *
+ * The =item argument must have one of the following values:
+ *
+ * =PAM_AUTHTOK:
+ * Returns the current authentication token, or the new token
+ * when changing authentication tokens.
+ * =PAM_OLDAUTHTOK:
+ * Returns the previous authentication token when changing
+ * authentication tokens.
+ *
+ * The =prompt argument specifies a prompt to use if no token is cached.
+ * If it is =NULL, the =PAM_AUTHTOK_PROMPT or =PAM_OLDAUTHTOK_PROMPT item,
+ * as appropriate, will be used.
+ * If that item is also =NULL, a hardcoded default prompt will be used.
+ * Either way, the prompt is expanded using =openpam_subst before it is
+ * passed to the conversation function.
+ *
+ * If =pam_get_authtok is called from a module and the ;authtok_prompt /
+ * ;oldauthtok_prompt option is set in the policy file, the value of that
+ * option takes precedence over both the =prompt argument and the
+ * =PAM_AUTHTOK_PROMPT / =PAM_OLDAUTHTOK_PROMPT item.
+ *
+ * If =item is set to =PAM_AUTHTOK and there is a non-null =PAM_OLDAUTHTOK
+ * item, =pam_get_authtok will ask the user to confirm the new token by
+ * retyping it.
+ * If there is a mismatch, =pam_get_authtok will return =PAM_TRY_AGAIN.
+ *
+ * >pam_get_item
+ * >pam_get_user
+ * >openpam_subst
+ */
diff --git a/lib/libpam/pam_get_data.c b/lib/libpam/pam_get_data.c
new file mode 100644
index 0000000..1a8ba1d
--- /dev/null
+++ b/lib/libpam/pam_get_data.c
@@ -0,0 +1,91 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_get_data.c 444 2011-10-22 01:03:23Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 43
+ *
+ * Get module information
+ */
+
+int
+pam_get_data(const pam_handle_t *pamh,
+ const char *module_data_name,
+ const void **data)
+{
+ pam_data_t *dp;
+
+ ENTERS(module_data_name);
+ if (pamh == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ for (dp = pamh->module_data; dp != NULL; dp = dp->next) {
+ if (strcmp(dp->name, module_data_name) == 0) {
+ *data = (void *)dp->data;
+ RETURNC(PAM_SUCCESS);
+ }
+ }
+ RETURNC(PAM_NO_MODULE_DATA);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYSTEM_ERR
+ * PAM_NO_MODULE_DATA
+ */
+
+/**
+ * The =pam_get_data function looks up the opaque object associated with
+ * the string specified by the =module_data_name argument, in the PAM
+ * context specified by the =pamh argument.
+ * A pointer to the object is stored in the location pointed to by the
+ * =data argument.
+ * If =pam_get_data fails, the =data argument is untouched.
+ *
+ * This function and its counterpart =pam_set_data are useful for managing
+ * data that are meaningful only to a particular service module.
+ */
diff --git a/lib/libpam/pam_get_item.c b/lib/libpam/pam_get_item.c
new file mode 100644
index 0000000..95b9df6
--- /dev/null
+++ b/lib/libpam/pam_get_item.c
@@ -0,0 +1,135 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_get_item.c 491 2011-11-12 00:12:32Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 46
+ *
+ * Get PAM information
+ */
+
+int
+pam_get_item(const pam_handle_t *pamh,
+ int item_type,
+ const void **item)
+{
+
+ ENTERI(item_type);
+ if (pamh == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ switch (item_type) {
+ case PAM_SERVICE:
+ case PAM_USER:
+ case PAM_AUTHTOK:
+ case PAM_OLDAUTHTOK:
+ case PAM_TTY:
+ case PAM_RHOST:
+ case PAM_RUSER:
+ case PAM_CONV:
+ case PAM_USER_PROMPT:
+ case PAM_REPOSITORY:
+ case PAM_AUTHTOK_PROMPT:
+ case PAM_OLDAUTHTOK_PROMPT:
+ case PAM_HOST:
+ *item = pamh->item[item_type];
+ RETURNC(PAM_SUCCESS);
+ default:
+ RETURNC(PAM_SYMBOL_ERR);
+ }
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYMBOL_ERR
+ * PAM_SYSTEM_ERR
+ */
+
+/**
+ * The =pam_get_item function stores a pointer to the item specified by
+ * the =item_type argument in the location pointed to by the =item
+ * argument.
+ * The item is retrieved from the PAM context specified by the =pamh
+ * argument.
+ * If =pam_get_item fails, the =item argument is untouched.
+ *
+ * The following item types are recognized:
+ *
+ * =PAM_SERVICE:
+ * The name of the requesting service.
+ * =PAM_USER:
+ * The name of the user the application is trying to
+ * authenticate.
+ * =PAM_TTY:
+ * The name of the current terminal.
+ * =PAM_RHOST:
+ * The name of the applicant's host.
+ * =PAM_CONV:
+ * A =struct pam_conv describing the current conversation
+ * function.
+ * =PAM_AUTHTOK:
+ * The current authentication token.
+ * =PAM_OLDAUTHTOK:
+ * The expired authentication token.
+ * =PAM_RUSER:
+ * The name of the applicant.
+ * =PAM_USER_PROMPT:
+ * The prompt to use when asking the applicant for a user
+ * name to authenticate as.
+ * =PAM_AUTHTOK_PROMPT:
+ * The prompt to use when asking the applicant for an
+ * authentication token.
+ * =PAM_OLDAUTHTOK_PROMPT:
+ * The prompt to use when asking the applicant for an
+ * expired authentication token prior to changing it.
+ * =PAM_HOST:
+ * The name of the host the application runs on.
+ *
+ * See =pam_start for a description of =struct pam_conv.
+ *
+ * >pam_set_item
+ */
diff --git a/lib/libpam/pam_get_mapped_authtok.c b/lib/libpam/pam_get_mapped_authtok.c
new file mode 100644
index 0000000..54ff6c3
--- /dev/null
+++ b/lib/libpam/pam_get_mapped_authtok.c
@@ -0,0 +1,66 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_get_mapped_authtok.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 48
+ *
+ * Get mapped password for the user
+ */
+
+int
+pam_get_mapped_authtok(pam_handle_t *pamh,
+ const char *target_module_username,
+ const char *target_module_type,
+ const char *target_authn_domain,
+ size_t *target_authtok_len,
+ unsigned char **target_module_authtok)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_get_mapped_username.c b/lib/libpam/pam_get_mapped_username.c
new file mode 100644
index 0000000..4f8ac17
--- /dev/null
+++ b/lib/libpam/pam_get_mapped_username.c
@@ -0,0 +1,67 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_get_mapped_username.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 50
+ *
+ * Get valid matched identity in new domain
+ */
+
+int
+pam_get_mapped_username(pam_handle_t *pamh,
+ const char *src_username,
+ const char *src_module_type,
+ const char *src_authn_domain,
+ const char *target_module_type,
+ const char *target_authn_domain,
+ char **target_module_username)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_get_user.c b/lib/libpam/pam_get_user.c
new file mode 100644
index 0000000..53245b9
--- /dev/null
+++ b/lib/libpam/pam_get_user.c
@@ -0,0 +1,135 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_get_user.c 455 2011-10-29 18:31:11Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+#include "openpam_impl.h"
+
+static const char user_prompt[] = "Login:";
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 52
+ *
+ * Retrieve user name
+ */
+
+int
+pam_get_user(pam_handle_t *pamh,
+ const char **user,
+ const char *prompt)
+{
+ char prompt_buf[1024];
+ size_t prompt_size;
+ const void *promptp;
+ char *resp;
+ int r;
+
+ ENTER();
+ if (pamh == NULL || user == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ r = pam_get_item(pamh, PAM_USER, (const void **)user);
+ if (r == PAM_SUCCESS && *user != NULL)
+ RETURNC(PAM_SUCCESS);
+ /* pam policy overrides the module's choice */
+ if ((promptp = openpam_get_option(pamh, "user_prompt")) != NULL)
+ prompt = promptp;
+ /* no prompt provided, see if there is one tucked away somewhere */
+ if (prompt == NULL)
+ if (pam_get_item(pamh, PAM_USER_PROMPT, &promptp) &&
+ promptp != NULL)
+ prompt = promptp;
+ /* fall back to hardcoded default */
+ if (prompt == NULL)
+ prompt = user_prompt;
+ /* expand */
+ prompt_size = sizeof prompt_buf;
+ r = openpam_subst(pamh, prompt_buf, &prompt_size, prompt);
+ if (r == PAM_SUCCESS && prompt_size <= sizeof prompt_buf)
+ prompt = prompt_buf;
+ r = pam_prompt(pamh, PAM_PROMPT_ECHO_ON, &resp, "%s", prompt);
+ if (r != PAM_SUCCESS)
+ RETURNC(r);
+ r = pam_set_item(pamh, PAM_USER, resp);
+ FREE(resp);
+ if (r != PAM_SUCCESS)
+ RETURNC(r);
+ r = pam_get_item(pamh, PAM_USER, (const void **)user);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =pam_get_item
+ * =pam_prompt
+ * =pam_set_item
+ * !PAM_SYMBOL_ERR
+ */
+
+/**
+ * The =pam_get_user function returns the name of the target user, as
+ * specified to =pam_start.
+ * If no user was specified, nor set using =pam_set_item, =pam_get_user
+ * will prompt for a user name.
+ * Either way, a pointer to the user name is stored in the location
+ * pointed to by the =user argument.
+ *
+ * The =prompt argument specifies a prompt to use if no user name is
+ * cached.
+ * If it is =NULL, the =PAM_USER_PROMPT item will be used.
+ * If that item is also =NULL, a hardcoded default prompt will be used.
+ * Either way, the prompt is expanded using =openpam_subst before it is
+ * passed to the conversation function.
+ *
+ * If =pam_get_user is called from a module and the ;user_prompt option is
+ * set in the policy file, the value of that option takes precedence over
+ * both the =prompt argument and the =PAM_USER_PROMPT item.
+ *
+ * >pam_get_item
+ * >pam_get_authtok
+ * >openpam_subst
+ */
diff --git a/lib/libpam/pam_getenv.c b/lib/libpam/pam_getenv.c
new file mode 100644
index 0000000..e2ebf57
--- /dev/null
+++ b/lib/libpam/pam_getenv.c
@@ -0,0 +1,87 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_getenv.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 44
+ *
+ * Retrieve the value of a PAM environment variable
+ */
+
+const char *
+pam_getenv(pam_handle_t *pamh,
+ const char *name)
+{
+ char *str;
+ int i;
+
+ ENTERS(name);
+ if (pamh == NULL)
+ RETURNS(NULL);
+ if (name == NULL || strchr(name, '=') != NULL)
+ RETURNS(NULL);
+ if ((i = openpam_findenv(pamh, name, strlen(name))) < 0)
+ RETURNS(NULL);
+ for (str = pamh->env[i]; *str != '\0'; ++str) {
+ if (*str == '=') {
+ ++str;
+ break;
+ }
+ }
+ RETURNS(str);
+}
+
+/**
+ * The =pam_getenv function returns the value of an environment variable.
+ * Its semantics are similar to those of =getenv, but it accesses the PAM
+ * context's environment list instead of the application's.
+ *
+ * >pam_getenvlist
+ * >pam_putenv
+ * >pam_setenv
+ */
diff --git a/lib/libpam/pam_getenvlist.c b/lib/libpam/pam_getenvlist.c
new file mode 100644
index 0000000..06c003f
--- /dev/null
+++ b/lib/libpam/pam_getenvlist.c
@@ -0,0 +1,110 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_getenvlist.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 45
+ *
+ * Returns a list of all the PAM environment variables
+ */
+
+char **
+pam_getenvlist(pam_handle_t *pamh)
+{
+ char **envlist;
+ int i;
+
+ ENTER();
+ if (pamh == NULL)
+ RETURNP(NULL);
+ envlist = malloc(sizeof(char *) * (pamh->env_count + 1));
+ if (envlist == NULL) {
+ openpam_log(PAM_LOG_ERROR, "%s",
+ pam_strerror(pamh, PAM_BUF_ERR));
+ RETURNP(NULL);
+ }
+ for (i = 0; i < pamh->env_count; ++i) {
+ if ((envlist[i] = strdup(pamh->env[i])) == NULL) {
+ while (i) {
+ --i;
+ FREE(envlist[i]);
+ }
+ FREE(envlist);
+ openpam_log(PAM_LOG_ERROR, "%s",
+ pam_strerror(pamh, PAM_BUF_ERR));
+ RETURNP(NULL);
+ }
+ }
+ envlist[i] = NULL;
+ RETURNP(envlist);
+}
+
+/**
+ * The =pam_getenvlist function returns a copy of the given PAM context's
+ * environment list as a pointer to an array of strings.
+ * The last element in the array is =NULL.
+ * The pointer is suitable for assignment to {Va environ}.
+ *
+ * The array and the strings it lists are allocated using =malloc, and
+ * should be released using =free after use:
+ *
+ * char **envlist, **env;
+ *
+ * envlist = environ;
+ * environ = pam_getenvlist(pamh);
+ * \/\* do something nifty \*\/
+ * for (env = environ; *env != NULL; env++)
+ * free(*env);
+ * free(environ);
+ * environ = envlist;
+ *
+ * >environ 7
+ * >pam_getenv
+ * >pam_putenv
+ * >pam_setenv
+ */
diff --git a/lib/libpam/pam_info.c b/lib/libpam/pam_info.c
new file mode 100644
index 0000000..7e51dbf
--- /dev/null
+++ b/lib/libpam/pam_info.c
@@ -0,0 +1,89 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_info.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Display an information message
+ */
+
+int
+pam_info(const pam_handle_t *pamh,
+ const char *fmt,
+ ...)
+{
+ va_list ap;
+ char *rsp;
+ int r;
+
+ va_start(ap, fmt);
+ r = pam_vprompt(pamh, PAM_TEXT_INFO, &rsp, fmt, ap);
+ va_end(ap);
+ FREE(rsp); /* ignore response */
+ return (r);
+}
+
+/*
+ * Error codes:
+ *
+ * !PAM_SYMBOL_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ */
+
+/**
+ * The =pam_info function displays an informational message through the
+ * intermediary of the given PAM context's conversation function.
+ *
+ * >pam_error
+ * >pam_prompt
+ * >pam_vinfo
+ */
diff --git a/lib/libpam/pam_open_session.c b/lib/libpam/pam_open_session.c
new file mode 100644
index 0000000..36c59b0
--- /dev/null
+++ b/lib/libpam/pam_open_session.c
@@ -0,0 +1,90 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_open_session.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 54
+ *
+ * Open a user session
+ */
+
+int
+pam_open_session(pam_handle_t *pamh,
+ int flags)
+{
+ int r;
+
+ ENTER();
+ if (flags & ~(PAM_SILENT))
+ RETURNC(PAM_SYMBOL_ERR);
+ r = openpam_dispatch(pamh, PAM_SM_OPEN_SESSION, flags);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =openpam_dispatch
+ * =pam_sm_open_session
+ * !PAM_IGNORE
+ * PAM_SYMBOL_ERR
+ */
+
+/**
+ * The =pam_open_session sets up a user session for a previously
+ * authenticated user.
+ * The session should later be torn down by a call to =pam_close_session.
+ *
+ * The =flags argument is the binary or of zero or more of the following
+ * values:
+ *
+ * =PAM_SILENT:
+ * Do not emit any messages.
+ *
+ * If any other bits are set, =pam_open_session will return
+ * =PAM_SYMBOL_ERR.
+ */
diff --git a/lib/libpam/pam_prompt.c b/lib/libpam/pam_prompt.c
new file mode 100644
index 0000000..194e765
--- /dev/null
+++ b/lib/libpam/pam_prompt.c
@@ -0,0 +1,94 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_prompt.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#include <stdarg.h>
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+/*
+ * OpenPAM extension
+ *
+ * Call the conversation function
+ */
+
+int
+pam_prompt(const pam_handle_t *pamh,
+ int style,
+ char **resp,
+ const char *fmt,
+ ...)
+{
+ va_list ap;
+ int r;
+
+ va_start(ap, fmt);
+ r = pam_vprompt(pamh, style, resp, fmt, ap);
+ va_end(ap);
+ return (r);
+}
+
+/*
+ * Error codes:
+ *
+ * !PAM_SYMBOL_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ */
+
+/**
+ * The =pam_prompt function constructs a message from the specified format
+ * string and arguments and passes it to the given PAM context's
+ * conversation function.
+ *
+ * A pointer to the response, or =NULL if the conversation function did
+ * not return one, is stored in the location pointed to by the =resp
+ * argument.
+ *
+ * See =pam_vprompt for further details.
+ *
+ * >pam_error
+ * >pam_info
+ * >pam_vprompt
+ */
diff --git a/lib/libpam/pam_putenv.c b/lib/libpam/pam_putenv.c
new file mode 100644
index 0000000..e1f0bc3
--- /dev/null
+++ b/lib/libpam/pam_putenv.c
@@ -0,0 +1,112 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_putenv.c 539 2012-03-31 20:53:22Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 56
+ *
+ * Set the value of an environment variable
+ */
+
+int
+pam_putenv(pam_handle_t *pamh,
+ const char *namevalue)
+{
+ char **env, *p;
+ int i;
+
+ ENTER();
+ if (pamh == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+
+ /* sanity checks */
+ if (namevalue == NULL || (p = strchr(namevalue, '=')) == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+
+ /* see if the variable is already in the environment */
+ if ((i = openpam_findenv(pamh, namevalue, p - namevalue)) >= 0) {
+ if ((p = strdup(namevalue)) == NULL)
+ RETURNC(PAM_BUF_ERR);
+ FREE(pamh->env[i]);
+ pamh->env[i] = p;
+ RETURNC(PAM_SUCCESS);
+ }
+
+ /* grow the environment list if necessary */
+ if (pamh->env_count == pamh->env_size) {
+ env = realloc(pamh->env,
+ sizeof(char *) * (pamh->env_size * 2 + 1));
+ if (env == NULL)
+ RETURNC(PAM_BUF_ERR);
+ pamh->env = env;
+ pamh->env_size = pamh->env_size * 2 + 1;
+ }
+
+ /* add the variable at the end */
+ if ((pamh->env[pamh->env_count] = strdup(namevalue)) == NULL)
+ RETURNC(PAM_BUF_ERR);
+ ++pamh->env_count;
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ */
+
+/**
+ * The =pam_putenv function sets an environment variable.
+ * Its semantics are similar to those of =putenv, but it modifies the PAM
+ * context's environment list instead of the application's.
+ *
+ * >pam_getenv
+ * >pam_getenvlist
+ * >pam_setenv
+ */
diff --git a/lib/libpam/pam_set_data.c b/lib/libpam/pam_set_data.c
new file mode 100644
index 0000000..a8de632
--- /dev/null
+++ b/lib/libpam/pam_set_data.c
@@ -0,0 +1,108 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_set_data.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 59
+ *
+ * Set module information
+ */
+
+int
+pam_set_data(pam_handle_t *pamh,
+ const char *module_data_name,
+ void *data,
+ void (*cleanup)(pam_handle_t *pamh,
+ void *data,
+ int pam_end_status))
+{
+ pam_data_t *dp;
+
+ ENTERS(module_data_name);
+ if (pamh == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ for (dp = pamh->module_data; dp != NULL; dp = dp->next) {
+ if (strcmp(dp->name, module_data_name) == 0) {
+ if (dp->cleanup)
+ (dp->cleanup)(pamh, dp->data, PAM_SUCCESS);
+ dp->data = data;
+ dp->cleanup = cleanup;
+ RETURNC(PAM_SUCCESS);
+ }
+ }
+ if ((dp = malloc(sizeof *dp)) == NULL)
+ RETURNC(PAM_BUF_ERR);
+ if ((dp->name = strdup(module_data_name)) == NULL) {
+ FREE(dp);
+ RETURNC(PAM_BUF_ERR);
+ }
+ dp->data = data;
+ dp->cleanup = cleanup;
+ dp->next = pamh->module_data;
+ pamh->module_data = dp;
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ */
+
+/**
+ * The =pam_set_data function associates a pointer to an opaque object
+ * with an arbitrary string specified by the =module_data_name argument,
+ * in the PAM context specified by the =pamh argument.
+ *
+ * If not =NULL, the =cleanup argument should point to a function
+ * responsible for releasing the resources associated with the object.
+ *
+ * This function and its counterpart =pam_get_data are useful for managing
+ * data that are meaningful only to a particular service module.
+ */
diff --git a/lib/libpam/pam_set_item.c b/lib/libpam/pam_set_item.c
new file mode 100644
index 0000000..05d538f
--- /dev/null
+++ b/lib/libpam/pam_set_item.c
@@ -0,0 +1,129 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_set_item.c 496 2011-11-21 16:20:45Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 60
+ *
+ * Set authentication information
+ */
+
+int
+pam_set_item(pam_handle_t *pamh,
+ int item_type,
+ const void *item)
+{
+ void **slot, *tmp;
+ size_t nsize, osize;
+
+ ENTERI(item_type);
+ if (pamh == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ slot = &pamh->item[item_type];
+ osize = nsize = 0;
+ switch (item_type) {
+ case PAM_SERVICE:
+ /* set once only, by pam_start() */
+ if (*slot != NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+ /* fall through */
+ case PAM_USER:
+ case PAM_AUTHTOK:
+ case PAM_OLDAUTHTOK:
+ case PAM_TTY:
+ case PAM_RHOST:
+ case PAM_RUSER:
+ case PAM_USER_PROMPT:
+ case PAM_AUTHTOK_PROMPT:
+ case PAM_OLDAUTHTOK_PROMPT:
+ case PAM_HOST:
+ if (*slot != NULL)
+ osize = strlen(*slot) + 1;
+ if (item != NULL)
+ nsize = strlen(item) + 1;
+ break;
+ case PAM_REPOSITORY:
+ osize = nsize = sizeof(struct pam_repository);
+ break;
+ case PAM_CONV:
+ osize = nsize = sizeof(struct pam_conv);
+ break;
+ default:
+ RETURNC(PAM_SYMBOL_ERR);
+ }
+ if (*slot != NULL) {
+ memset(*slot, 0xd0, osize);
+ FREE(*slot);
+ }
+ if (item != NULL) {
+ if ((tmp = malloc(nsize)) == NULL)
+ RETURNC(PAM_BUF_ERR);
+ memcpy(tmp, item, nsize);
+ } else {
+ tmp = NULL;
+ }
+ *slot = tmp;
+ RETURNC(PAM_SUCCESS);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SYMBOL_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ */
+
+/**
+ * The =pam_set_item function sets the item specified by the =item_type
+ * argument to a copy of the object pointed to by the =item argument.
+ * The item is stored in the PAM context specified by the =pamh argument.
+ * See =pam_get_item for a list of recognized item types.
+ */
diff --git a/lib/libpam/pam_set_mapped_authtok.c b/lib/libpam/pam_set_mapped_authtok.c
new file mode 100644
index 0000000..d8db84f
--- /dev/null
+++ b/lib/libpam/pam_set_mapped_authtok.c
@@ -0,0 +1,66 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_set_mapped_authtok.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 62
+ *
+ * Store the password for the username supplied
+ */
+
+int
+pam_set_mapped_authtok(pam_handle_t *pamh,
+ const char *target_module_username,
+ size_t target_authtok_len,
+ unsigned char *target_module_authtok,
+ const char *target_module_type,
+ const char *target_authn_domain)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_set_mapped_username.c b/lib/libpam/pam_set_mapped_username.c
new file mode 100644
index 0000000..4b8f815
--- /dev/null
+++ b/lib/libpam/pam_set_mapped_username.c
@@ -0,0 +1,67 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_set_mapped_username.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <security/pam_appl.h>
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 64
+ *
+ * Set a username
+ */
+
+int
+pam_set_mapped_username(pam_handle_t *pamh,
+ char *src_username,
+ char *src_module_type,
+ char *src_authn_domain,
+ char *target_module_username,
+ char *target_module_type,
+ char *target_authn_domain)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_setcred.c b/lib/libpam/pam_setcred.c
new file mode 100644
index 0000000..51fb081
--- /dev/null
+++ b/lib/libpam/pam_setcred.c
@@ -0,0 +1,99 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_setcred.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 57
+ *
+ * Modify / delete user credentials for an authentication service
+ */
+
+int
+pam_setcred(pam_handle_t *pamh,
+ int flags)
+{
+ int r;
+
+ ENTER();
+ if (flags & ~(PAM_SILENT|PAM_ESTABLISH_CRED|PAM_DELETE_CRED|
+ PAM_REINITIALIZE_CRED|PAM_REFRESH_CRED))
+ RETURNC(PAM_SYMBOL_ERR);
+ /* XXX enforce exclusivity */
+ r = openpam_dispatch(pamh, PAM_SM_SETCRED, flags);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =openpam_dispatch
+ * =pam_sm_setcred
+ * !PAM_IGNORE
+ * PAM_SYMBOL_ERR
+ */
+
+/**
+ * The =pam_setcred function manages the application's credentials.
+ *
+ * The =flags argument is the binary or of zero or more of the following
+ * values:
+ *
+ * =PAM_SILENT:
+ * Do not emit any messages.
+ * =PAM_ESTABLISH_CRED:
+ * Establish the credentials of the target user.
+ * =PAM_DELETE_CRED:
+ * Revoke all established credentials.
+ * =PAM_REINITIALIZE_CRED:
+ * Fully reinitialise credentials.
+ * =PAM_REFRESH_CRED:
+ * Refresh credentials.
+ *
+ * The latter four are mutually exclusive.
+ *
+ * If any other bits are set, =pam_setcred will return =PAM_SYMBOL_ERR.
+ */
diff --git a/lib/libpam/pam_setenv.c b/lib/libpam/pam_setenv.c
new file mode 100644
index 0000000..6fd4c10
--- /dev/null
+++ b/lib/libpam/pam_setenv.c
@@ -0,0 +1,102 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_setenv.c 539 2012-03-31 20:53:22Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Set the value of an environment variable
+ * Mirrors setenv(3)
+ */
+
+int
+pam_setenv(pam_handle_t *pamh,
+ const char *name,
+ const char *value,
+ int overwrite)
+{
+ char *env;
+ int r;
+
+ ENTER();
+ if (pamh == NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+
+ /* sanity checks */
+ if (name == NULL || value == NULL || strchr(name, '=') != NULL)
+ RETURNC(PAM_SYSTEM_ERR);
+
+ /* is it already there? */
+ if (!overwrite && openpam_findenv(pamh, name, strlen(name)) >= 0)
+ RETURNC(PAM_SUCCESS);
+
+ /* set it... */
+ if (asprintf(&env, "%s=%s", name, value) < 0)
+ RETURNC(PAM_BUF_ERR);
+ r = pam_putenv(pamh, env);
+ FREE(env);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =pam_putenv
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ */
+
+/**
+ * The =pam_setenv function sets an environment variable.
+ * Its semantics are similar to those of =setenv, but it modifies the PAM
+ * context's environment list instead of the application's.
+ *
+ * >pam_getenv
+ * >pam_getenvlist
+ * >pam_putenv
+ */
diff --git a/lib/libpam/pam_sm_acct_mgmt.c b/lib/libpam/pam_sm_acct_mgmt.c
new file mode 100644
index 0000000..f5c14cf
--- /dev/null
+++ b/lib/libpam/pam_sm_acct_mgmt.c
@@ -0,0 +1,85 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_acct_mgmt.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 66
+ *
+ * Service module implementation for pam_acct_mgmt
+ */
+
+int
+pam_sm_acct_mgmt(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SERVICE_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ * PAM_PERM_DENIED
+ * PAM_IGNORE
+ * PAM_ABORT
+ *
+ * PAM_USER_UNKNOWN
+ * PAM_AUTH_ERR
+ * PAM_NEW_AUTHTOK_REQD
+ * PAM_ACCT_EXPIRED
+ */
+
+/**
+ * The =pam_sm_acct_mgmt function is the service module's implementation
+ * of the =pam_acct_mgmt API function.
+ */
diff --git a/lib/libpam/pam_sm_authenticate.c b/lib/libpam/pam_sm_authenticate.c
new file mode 100644
index 0000000..97851af
--- /dev/null
+++ b/lib/libpam/pam_sm_authenticate.c
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_authenticate.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 68
+ *
+ * Service module implementation for pam_authenticate
+ */
+
+int
+pam_sm_authenticate(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SERVICE_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ * PAM_PERM_DENIED
+ * PAM_IGNORE
+ * PAM_ABORT
+ *
+ * PAM_AUTH_ERR
+ * PAM_CRED_INSUFFICIENT
+ * PAM_AUTHINFO_UNAVAIL
+ * PAM_USER_UNKNOWN
+ * PAM_MAXTRIES
+ */
+
+/**
+ * The =pam_sm_authenticate function is the service module's
+ * implementation of the =pam_authenticate API function.
+ */
diff --git a/lib/libpam/pam_sm_authenticate_secondary.c b/lib/libpam/pam_sm_authenticate_secondary.c
new file mode 100644
index 0000000..3f3f6bd
--- /dev/null
+++ b/lib/libpam/pam_sm_authenticate_secondary.c
@@ -0,0 +1,72 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_authenticate_secondary.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 70
+ *
+ * Service module implementation for pam_authenticate_secondary
+ */
+
+int
+pam_sm_authenticate_secondary(pam_handle_t *pamh,
+ char *target_username,
+ char *target_module_type,
+ char *target_authn_domain,
+ char *target_supp_data,
+ unsigned char *target_module_authtok,
+ int flags,
+ int argc,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_sm_chauthtok.c b/lib/libpam/pam_sm_chauthtok.c
new file mode 100644
index 0000000..593344c
--- /dev/null
+++ b/lib/libpam/pam_sm_chauthtok.c
@@ -0,0 +1,91 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_chauthtok.c 466 2011-11-02 23:33:43Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 72
+ *
+ * Service module implementation for pam_chauthtok
+ */
+
+int
+pam_sm_chauthtok(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SERVICE_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ * PAM_PERM_DENIED
+ * PAM_IGNORE
+ * PAM_ABORT
+ *
+ * PAM_PERM_DENIED
+ * PAM_AUTHTOK_ERR
+ * PAM_AUTHTOK_RECOVERY_ERR
+ * PAM_AUTHTOK_LOCK_BUSY
+ * PAM_AUTHTOK_DISABLE_AGING
+ * PAM_TRY_AGAIN
+ */
+
+/**
+ * The =pam_sm_chauthtok function is the service module's implementation
+ * of the =pam_chauthtok API function.
+ *
+ * When the application calls =pam_chauthtok, the service function is
+ * called twice, first with the =PAM_PRELIM_CHECK flag set and then again
+ * with the =PAM_UPDATE_AUTHTOK flag set.
+ */
diff --git a/lib/libpam/pam_sm_close_session.c b/lib/libpam/pam_sm_close_session.c
new file mode 100644
index 0000000..290f497
--- /dev/null
+++ b/lib/libpam/pam_sm_close_session.c
@@ -0,0 +1,82 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_close_session.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 75
+ *
+ * Service module implementation for pam_close_session
+ */
+
+int
+pam_sm_close_session(pam_handle_t *pamh,
+ int flags,
+ int args,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SERVICE_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ * PAM_PERM_DENIED
+ * PAM_IGNORE
+ * PAM_ABORT
+ *
+ * PAM_SESSION_ERR
+ */
+
+/**
+ * The =pam_sm_close_session function is the service module's
+ * implementation of the =pam_close_session API function.
+ */
diff --git a/lib/libpam/pam_sm_get_mapped_authtok.c b/lib/libpam/pam_sm_get_mapped_authtok.c
new file mode 100644
index 0000000..e86e6e5
--- /dev/null
+++ b/lib/libpam/pam_sm_get_mapped_authtok.c
@@ -0,0 +1,71 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_get_mapped_authtok.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 77
+ *
+ * Service module implementation for pam_get_mapped_authtok
+ */
+
+int
+pam_sm_get_mapped_authtok(pam_handle_t *pamh,
+ char *target_module_username,
+ char *target_module_type,
+ char *target_authn_domain,
+ size_t *target_authtok_len,
+ unsigned char **target_module_authtok,
+ int argc,
+ char *argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_sm_get_mapped_username.c b/lib/libpam/pam_sm_get_mapped_username.c
new file mode 100644
index 0000000..596ca6c
--- /dev/null
+++ b/lib/libpam/pam_sm_get_mapped_username.c
@@ -0,0 +1,72 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_get_mapped_username.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 79
+ *
+ * Service module implementation for pam_get_mapped_username
+ */
+
+int
+pam_sm_get_mapped_username(pam_handle_t *pamh,
+ char *src_username,
+ char *src_module_type,
+ char *src_authn_domain,
+ char *target_module_type,
+ char *target_authn_domain,
+ char **target_module_username,
+ int argc,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_sm_open_session.c b/lib/libpam/pam_sm_open_session.c
new file mode 100644
index 0000000..acb401a
--- /dev/null
+++ b/lib/libpam/pam_sm_open_session.c
@@ -0,0 +1,82 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_open_session.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 81
+ *
+ * Service module implementation for pam_open_session
+ */
+
+int
+pam_sm_open_session(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * Error codes:
+ *
+ * PAM_SERVICE_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ * PAM_PERM_DENIED
+ * PAM_IGNORE
+ * PAM_ABORT
+ *
+ * PAM_SESSION_ERR
+ */
+
+/**
+ * The =pam_sm_open_session function is the service module's
+ * implementation of the =pam_open_session API function.
+ */
diff --git a/lib/libpam/pam_sm_set_mapped_authtok.c b/lib/libpam/pam_sm_set_mapped_authtok.c
new file mode 100644
index 0000000..dab40fd
--- /dev/null
+++ b/lib/libpam/pam_sm_set_mapped_authtok.c
@@ -0,0 +1,71 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_set_mapped_authtok.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 83
+ *
+ * Service module implementation for pam_set_mapped_authtok
+ */
+
+int
+pam_sm_set_mapped_authtok(pam_handle_t *pamh,
+ char *target_module_username,
+ size_t target_authtok_len,
+ unsigned char *target_module_authtok,
+ char *target_module_type,
+ char *target_authn_domain,
+ int argc,
+ const char *argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_sm_set_mapped_username.c b/lib/libpam/pam_sm_set_mapped_username.c
new file mode 100644
index 0000000..3011016
--- /dev/null
+++ b/lib/libpam/pam_sm_set_mapped_username.c
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_set_mapped_username.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 85
+ *
+ * Service module implementation for pam_set_mapped_username
+ */
+
+int
+pam_sm_set_mapped_username(pam_handle_t *pamh,
+ char *target_module_username,
+ char *target_module_type,
+ char *target_authn_domain,
+ int argc,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+/*
+ * NODOC
+ */
diff --git a/lib/libpam/pam_sm_setcred.c b/lib/libpam/pam_sm_setcred.c
new file mode 100644
index 0000000..0d30683
--- /dev/null
+++ b/lib/libpam/pam_sm_setcred.c
@@ -0,0 +1,86 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_sm_setcred.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/*
+ * XSSO 4.2.2
+ * XSSO 6 page 87
+ *
+ * Service module implementation for pam_setcred
+ */
+
+int
+pam_sm_setcred(pam_handle_t *pamh,
+ int flags,
+ int argc,
+ const char **argv)
+{
+
+ ENTER();
+ RETURNC(PAM_SYSTEM_ERR);
+}
+
+
+/*
+ * Error codes:
+ *
+ * PAM_SERVICE_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ * PAM_PERM_DENIED
+ * PAM_IGNORE
+ * PAM_ABORT
+ *
+ * PAM_CRED_UNAVAIL
+ * PAM_CRED_EXPIRED
+ * PAM_USER_UNKNOWN
+ * PAM_CRED_ERR
+ */
+
+/**
+ * The =pam_sm_setcred function is the service module's implementation of
+ * the =pam_setcred API function.
+ */
diff --git a/lib/libpam/pam_start.c b/lib/libpam/pam_start.c
new file mode 100644
index 0000000..84e0085
--- /dev/null
+++ b/lib/libpam/pam_start.c
@@ -0,0 +1,122 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_start.c 503 2011-12-18 14:00:33Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+#include "openpam_strlcpy.h"
+
+#ifdef _SC_HOST_NAME_MAX
+#define HOST_NAME_MAX sysconf(_SC_HOST_NAME_MAX)
+#else
+#define HOST_NAME_MAX 1024
+#endif
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 89
+ *
+ * Initiate a PAM transaction
+ */
+
+int
+pam_start(const char *service,
+ const char *user,
+ const struct pam_conv *pam_conv,
+ pam_handle_t **pamh)
+{
+ char hostname[HOST_NAME_MAX + 1];
+ struct pam_handle *ph;
+ int r;
+
+ ENTER();
+ if ((ph = calloc(1, sizeof *ph)) == NULL)
+ RETURNC(PAM_BUF_ERR);
+ if ((r = pam_set_item(ph, PAM_SERVICE, service)) != PAM_SUCCESS)
+ goto fail;
+ if (gethostname(hostname, sizeof hostname) != 0)
+ strlcpy(hostname, "localhost", sizeof hostname);
+ if ((r = pam_set_item(ph, PAM_HOST, hostname)) != PAM_SUCCESS)
+ goto fail;
+ if ((r = pam_set_item(ph, PAM_USER, user)) != PAM_SUCCESS)
+ goto fail;
+ if ((r = pam_set_item(ph, PAM_CONV, pam_conv)) != PAM_SUCCESS)
+ goto fail;
+ if ((r = openpam_configure(ph, service)) != PAM_SUCCESS)
+ goto fail;
+ *pamh = ph;
+ openpam_log(PAM_LOG_DEBUG, "pam_start(\"%s\") succeeded", service);
+ RETURNC(PAM_SUCCESS);
+fail:
+ pam_end(ph, r);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * =openpam_configure
+ * =pam_set_item
+ * !PAM_SYMBOL_ERR
+ * PAM_BUF_ERR
+ */
+
+/**
+ * The =pam_start function creates and initializes a PAM context.
+ *
+ * The =service argument specifies the name of the policy to apply, and is
+ * stored in the =PAM_SERVICE item in the created context.
+ *
+ * The =user argument specifies the name of the target user - the user the
+ * created context will serve to authenticate.
+ * It is stored in the =PAM_USER item in the created context.
+ *
+ * The =pam_conv argument points to a =struct pam_conv describing the
+ * conversation function to use; see =pam_conv for details.
+ *
+ * >pam_get_item
+ * >pam_set_item
+ * >pam_end
+ */
diff --git a/lib/libpam/pam_strerror.c b/lib/libpam/pam_strerror.c
new file mode 100644
index 0000000..e29219d
--- /dev/null
+++ b/lib/libpam/pam_strerror.c
@@ -0,0 +1,137 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_strerror.c 491 2011-11-12 00:12:32Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * XSSO 4.2.1
+ * XSSO 6 page 92
+ *
+ * Get PAM standard error message string
+ */
+
+const char *
+pam_strerror(const pam_handle_t *pamh,
+ int error_number)
+{
+ static char unknown[16];
+
+ (void)pamh;
+
+ switch (error_number) {
+ case PAM_SUCCESS:
+ return ("success");
+ case PAM_OPEN_ERR:
+ return ("failed to load module");
+ case PAM_SYMBOL_ERR:
+ return ("invalid symbol");
+ case PAM_SERVICE_ERR:
+ return ("error in service module");
+ case PAM_SYSTEM_ERR:
+ return ("system error");
+ case PAM_BUF_ERR:
+ return ("memory buffer error");
+ case PAM_CONV_ERR:
+ return ("conversation failure");
+ case PAM_PERM_DENIED:
+ return ("permission denied");
+ case PAM_MAXTRIES:
+ return ("maximum number of tries exceeded");
+ case PAM_AUTH_ERR:
+ return ("authentication error");
+ case PAM_NEW_AUTHTOK_REQD:
+ return ("new authentication token required");
+ case PAM_CRED_INSUFFICIENT:
+ return ("insufficient credentials");
+ case PAM_AUTHINFO_UNAVAIL:
+ return ("authentication information is unavailable");
+ case PAM_USER_UNKNOWN:
+ return ("unknown user");
+ case PAM_CRED_UNAVAIL:
+ return ("failed to retrieve user credentials");
+ case PAM_CRED_EXPIRED:
+ return ("user credentials have expired");
+ case PAM_CRED_ERR:
+ return ("failed to set user credentials");
+ case PAM_ACCT_EXPIRED:
+ return ("user account has expired");
+ case PAM_AUTHTOK_EXPIRED:
+ return ("password has expired");
+ case PAM_SESSION_ERR:
+ return ("session failure");
+ case PAM_AUTHTOK_ERR:
+ return ("authentication token failure");
+ case PAM_AUTHTOK_RECOVERY_ERR:
+ return ("failed to recover old authentication token");
+ case PAM_AUTHTOK_LOCK_BUSY:
+ return ("authentication token lock busy");
+ case PAM_AUTHTOK_DISABLE_AGING:
+ return ("authentication token aging disabled");
+ case PAM_NO_MODULE_DATA:
+ return ("module data not found");
+ case PAM_IGNORE:
+ return ("ignore this module");
+ case PAM_ABORT:
+ return ("general failure");
+ case PAM_TRY_AGAIN:
+ return ("try again");
+ case PAM_MODULE_UNKNOWN:
+ return ("unknown module type");
+ case PAM_DOMAIN_UNKNOWN:
+ return ("unknown authentication domain");
+ default:
+ snprintf(unknown, sizeof unknown, "#%d", error_number);
+ return (unknown);
+ }
+}
+
+/**
+ * The =pam_strerror function returns a pointer to a string containing a
+ * textual description of the error indicated by the =error_number
+ * argument.
+ * The =pamh argument is ignored.
+ * For compatibility with other implementations, it should be either a
+ * valid PAM handle returned by a previous call to =pam_start, or =NULL.
+ */
diff --git a/lib/libpam/pam_verror.c b/lib/libpam/pam_verror.c
new file mode 100644
index 0000000..9ed85b6
--- /dev/null
+++ b/lib/libpam/pam_verror.c
@@ -0,0 +1,84 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_verror.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Display an error message
+ */
+
+int
+pam_verror(const pam_handle_t *pamh,
+ const char *fmt,
+ va_list ap)
+{
+ char *rsp;
+ int r;
+
+ r = pam_vprompt(pamh, PAM_ERROR_MSG, &rsp, fmt, ap);
+ FREE(rsp); /* ignore response */
+ return (r);
+}
+
+/*
+ * Error codes:
+ *
+ * !PAM_SYMBOL_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ */
+
+/**
+ * The =pam_verror function passes its arguments to =pam_vprompt with a
+ * style argument of =PAM_ERROR_MSG, and discards the response.
+ *
+ * >pam_error
+ * >pam_vinfo
+ */
diff --git a/lib/libpam/pam_vinfo.c b/lib/libpam/pam_vinfo.c
new file mode 100644
index 0000000..95f45f4
--- /dev/null
+++ b/lib/libpam/pam_vinfo.c
@@ -0,0 +1,84 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_vinfo.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+#include <security/openpam.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Display an information message
+ */
+
+int
+pam_vinfo(const pam_handle_t *pamh,
+ const char *fmt,
+ va_list ap)
+{
+ char *rsp;
+ int r;
+
+ r = pam_vprompt(pamh, PAM_TEXT_INFO, &rsp, fmt, ap);
+ FREE(rsp); /* ignore response */
+ return (r);
+}
+
+/*
+ * Error codes:
+ *
+ * !PAM_SYMBOL_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ */
+
+/**
+ * The =pam_vinfo function passes its arguments to =pam_vprompt with a
+ * style argument of =PAM_TEXT_INFO, and discards the response.
+ *
+ * >pam_info
+ * >pam_verror
+ */
diff --git a/lib/libpam/pam_vprompt.c b/lib/libpam/pam_vprompt.c
new file mode 100644
index 0000000..1e390e0
--- /dev/null
+++ b/lib/libpam/pam_vprompt.c
@@ -0,0 +1,133 @@
+/*-
+ * Copyright (c) 2002-2003 Networks Associates Technology, Inc.
+ * Copyright (c) 2004-2011 Dag-Erling Smørgrav
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by ThinkSec AS and
+ * Network Associates Laboratories, the Security Research Division of
+ * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
+ * ("CBOSS"), as part of the DARPA CHATS research program.
+ *
+ * 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.
+ * 3. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $Id: pam_vprompt.c 437 2011-09-13 12:00:13Z des $
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <security/pam_appl.h>
+
+#include "openpam_impl.h"
+
+/*
+ * OpenPAM extension
+ *
+ * Call the conversation function
+ */
+
+int
+pam_vprompt(const pam_handle_t *pamh,
+ int style,
+ char **resp,
+ const char *fmt,
+ va_list ap)
+{
+ char msgbuf[PAM_MAX_MSG_SIZE];
+ struct pam_message msg;
+ const struct pam_message *msgp;
+ struct pam_response *rsp;
+ const struct pam_conv *conv;
+ const void *convp;
+ int r;
+
+ ENTER();
+ r = pam_get_item(pamh, PAM_CONV, &convp);
+ if (r != PAM_SUCCESS)
+ RETURNC(r);
+ conv = convp;
+ if (conv == NULL || conv->conv == NULL) {
+ openpam_log(PAM_LOG_ERROR, "no conversation function");
+ RETURNC(PAM_SYSTEM_ERR);
+ }
+ vsnprintf(msgbuf, PAM_MAX_MSG_SIZE, fmt, ap);
+ msg.msg_style = style;
+ msg.msg = msgbuf;
+ msgp = &msg;
+ rsp = NULL;
+ r = (conv->conv)(1, &msgp, &rsp, conv->appdata_ptr);
+ *resp = rsp == NULL ? NULL : rsp->resp;
+ FREE(rsp);
+ RETURNC(r);
+}
+
+/*
+ * Error codes:
+ *
+ * !PAM_SYMBOL_ERR
+ * PAM_SYSTEM_ERR
+ * PAM_BUF_ERR
+ * PAM_CONV_ERR
+ */
+
+/**
+ * The =pam_vprompt function constructs a string from the =fmt and =ap
+ * arguments using =vsnprintf, and passes it to the given PAM context's
+ * conversation function.
+ *
+ * The =style argument specifies the type of interaction requested, and
+ * must be one of the following:
+ *
+ * =PAM_PROMPT_ECHO_OFF:
+ * Display the message and obtain the user's response without
+ * displaying it.
+ * =PAM_PROMPT_ECHO_ON:
+ * Display the message and obtain the user's response.
+ * =PAM_ERROR_MSG:
+ * Display the message as an error message, and do not wait
+ * for a response.
+ * =PAM_TEXT_INFO:
+ * Display the message as an informational message, and do
+ * not wait for a response.
+ *
+ * A pointer to the response, or =NULL if the conversation function did
+ * not return one, is stored in the location pointed to by the =resp
+ * argument.
+ *
+ * The message and response should not exceed =PAM_MAX_MSG_SIZE or
+ * =PAM_MAX_RESP_SIZE, respectively.
+ * If they do, they may be truncated.
+ *
+ * >pam_error
+ * >pam_info
+ * >pam_prompt
+ * >pam_verror
+ * >pam_vinfo
+ */
OpenPOWER on IntegriCloud