File pwaccess.patch of Package shadow
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 6c68cfa1..1654d4fc 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -142,6 +142,7 @@ libshadow_la_SOURCES = \
port.h \
prefix_flag.c \
prototypes.h \
+ pwaccess-varlink.c \
pwauth.c \
pwauth.h \
pwio.c \
diff --git a/src/Makefile.am b/src/Makefile.am
index 69818150..4cc914ce 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -99,14 +99,14 @@ else
LIBCRYPT_NOPAM = $(LIBCRYPT)
endif
-chage_LDADD = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF) -ldl
+chage_LDADD = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF) -ldl -lpwaccess
newuidmap_LDADD = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBCAP) $(LIBECONF) -ldl
newgidmap_LDADD = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBCAP) $(LIBECONF) -ldl
chfn_LDADD = $(LDADD) $(LIBPAM) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD) $(LIBECONF)
chgpasswd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT) $(LIBECONF)
chsh_LDADD = $(LDADD) $(LIBPAM) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD) $(LIBECONF)
chpasswd_LDADD = $(LDADD) $(LIBPAM) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT) $(LIBECONF) -ldl
-expiry_LDADD = $(LDADD) $(LIBECONF)
+expiry_LDADD = $(LDADD) $(LIBECONF) -lpwaccess
gpasswd_LDADD = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT) $(LIBECONF)
groupadd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF) -ldl
groupdel_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF) -ldl
@@ -177,7 +177,8 @@ MISCLIBS = \
$(LIBMD) \
$(LIBECONF) \
$(LIBCRYPT) \
- $(LIBTCB)
+ $(LIBTCB) \
+ -lpwaccess
getsubids_LDADD = \
$(top_builddir)/lib/libshadow.la \
diff --git a/src/chage.c b/src/chage.c
index 3a9461ac..4634f58f 100644
--- a/src/chage.c
+++ b/src/chage.c
@@ -42,6 +42,7 @@
#include "tcbfuncs.h"
#endif
+#include "pwaccess.h"
/*
* Global variables
@@ -708,10 +709,10 @@ static void get_defaults (/*@null@*/const struct spwd *sp)
int main (int argc, char **argv)
{
- const struct spwd *sp;
+ const struct spwd *sp = NULL;
uid_t ruid;
gid_t rgid;
- const struct passwd *pw;
+ const struct passwd *pw = NULL;
sanitize_env ();
check_fds ();
@@ -744,6 +745,31 @@ int main (int argc, char **argv)
check_perms ();
+ if (lflg)
+ {
+ int r;
+ char *error = NULL;
+
+ r = pwaccess_get_user_record (-1, argv[optind], (struct passwd **)&pw, (struct spwd **)&sp, NULL, &error);
+ if (r < 0)
+ {
+ if (PWACCESS_IS_NOT_RUNNING(r))
+ goto fallback;
+
+ if (error)
+ {
+ fprintf (stderr, "%s\n", error);
+ free (error);
+ error = NULL;
+ }
+ else
+ fprintf (stderr, "%s\n", strerror (-r));
+ return -r; /* XXX fail_exit */
+ }
+ }
+ else
+ {
+ fallback:
if (!spw_file_present ()) {
fprintf (stderr,
_("%s: the shadow password file is not present\n"),
@@ -754,6 +780,7 @@ int main (int argc, char **argv)
}
open_files (lflg);
+ }
/* Drop privileges */
if (lflg && ( (setregid (rgid, rgid) != 0)
|| (setreuid (ruid, ruid) != 0))) {
@@ -762,7 +789,8 @@ int main (int argc, char **argv)
fail_exit (E_NOPERM);
}
- pw = pw_locate (argv[optind]);
+ if (!pw)
+ pw = pw_locate (argv[optind]);
if (NULL == pw) {
fprintf (stderr, _("%s: user '%s' does not exist in %s\n"),
Prog, argv[optind], pw_dbname ());
@@ -778,7 +806,8 @@ int main (int argc, char **argv)
#endif
user_uid = pw->pw_uid;
- sp = spw_locate (argv[optind]);
+ if (!sp)
+ sp = spw_locate (argv[optind]);
get_defaults (sp);
/*
@@ -856,4 +885,3 @@ int main (int argc, char **argv)
closelog ();
exit (E_SUCCESS);
}
-
diff --git a/src/expiry.c b/src/expiry.c
index 412e54d6..03a02e1f 100644
--- a/src/expiry.c
+++ b/src/expiry.c
@@ -24,6 +24,9 @@
#include "exitcodes.h"
#include "shadowlog.h"
+extern struct spwd *varlink_getspnam(const char *name);
+
+
/* Global variables */
static const char Prog[] = "expiry";
static bool cflg = false;
@@ -163,6 +166,8 @@ int main (int argc, char **argv)
exit (10);
}
spwd = getspnam (pwd->pw_name); /* !USE_PAM, No need for xgetspnam */
+ if (spwd == NULL)
+ spwd = varlink_getspnam(pwd->pw_name);
/*
* If checking accounts, use agecheck() function.
@@ -189,4 +194,3 @@ int main (int argc, char **argv)
return E_SUCCESS;
}
-
diff --git a/lib/pwaccess-varlink.c b/lib/pwaccess-varlink.c
new file mode 100644
index 00000000..f0a4ce1a
--- /dev/null
+++ b/lib/pwaccess-varlink.c
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: BSD-3-Clause
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <shadow.h>
+#include <stdbool.h>
+#include <pwaccess.h>
+
+struct spwd *
+varlink_getspnam(const char *name)
+{
+ char *error = NULL;
+ struct spwd *sp = NULL;
+ bool complete = false;
+ int r;
+
+ r = pwaccess_get_user_record(-1, name, NULL, &sp, &complete, &error);
+ if (r < 0)
+ {
+ fprintf(stderr, "get_user_record failed: %s\n", error ? error : strerror(-r));
+ free(error);
+ return NULL;
+ }
+
+ return sp;
+}