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;
+}
openSUSE Build Service is sponsored by