summaryrefslogtreecommitdiffstats
path: root/login-utils/chfn.c
diff options
context:
space:
mode:
authorCody Maloney2013-02-07 07:22:21 +0100
committerKarel Zak2013-02-13 09:39:12 +0100
commit8c24b6aa2c440bc24ada7cb89c89e4eae0c2550b (patch)
tree818fe99f398955efd3d030edc0aa6540c44d21c8 /login-utils/chfn.c
parentchsh: Add libuser support (diff)
downloadkernel-qcow2-util-linux-8c24b6aa2c440bc24ada7cb89c89e4eae0c2550b.tar.gz
kernel-qcow2-util-linux-8c24b6aa2c440bc24ada7cb89c89e4eae0c2550b.tar.xz
kernel-qcow2-util-linux-8c24b6aa2c440bc24ada7cb89c89e4eae0c2550b.zip
chfn: Add libuser support
Signed-off-by: Cody Maloney <cmaloney@theoreticalchaos.com>
Diffstat (limited to 'login-utils/chfn.c')
-rw-r--r--login-utils/chfn.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/login-utils/chfn.c b/login-utils/chfn.c
index 7c9af8403..7ea3f3e3b 100644
--- a/login-utils/chfn.c
+++ b/login-utils/chfn.c
@@ -1,6 +1,7 @@
/*
* chfn.c -- change your finger information
* (c) 1994 by salvatore valente <svalente@athena.mit.edu>
+ * (c) 2012 by Cody Maloney <cmaloney@theoreticalchaos.com>
*
* this program is free software. you can redistribute it and
* modify it under the terms of the gnu general public license.
@@ -31,7 +32,6 @@
#include <sys/types.h>
#include <unistd.h>
-#include "auth.h"
#include "c.h"
#include "env.h"
#include "closestream.h"
@@ -47,6 +47,13 @@
# include "selinux_utils.h"
#endif
+#ifdef HAVE_LIBUSER
+# include <libuser/user.h>
+# include "libuser.h"
+#else
+# include "auth.h"
+#endif
+
static char buf[1024];
struct finfo {
@@ -149,17 +156,24 @@ int main(int argc, char **argv)
}
#endif
- /* Reality check */
- if (uid != 0 && uid != oldf.pw->pw_uid) {
+#ifdef HAVE_LIBUSER
+ /* If we're setuid and not really root, disallow the password change. */
+ if (geteuid() != getuid() && uid != pw->pw_uid) {
+#else
+ if (uid != 0 && uid != pw->pw_uid) {
+#endif
errno = EACCES;
- err(EXIT_FAILURE, NULL);
+ err(EXIT_FAILURE, _("running UID doesn't match UID of user we're "
+ "altering, change denied")););
}
printf(_("Changing finger information for %s.\n"), oldf.username);
+#ifndef HAVE_LIBUSER
if(!auth_pam("chfn", uid, oldf.username)) {
return EXIT_FAILURE;
}
+#endif
if (interactive)
ask_info(&oldf, &newf);
@@ -445,9 +459,14 @@ static int save_new_data(struct finfo *pinfo)
gecos[len] = 0;
}
+#ifdef HAVE_LIBUSER
+ if(set_value_libuser("chfn", pinfo->pw->pw_name, pinfo->pw->pw_uid,
+ LU_GECOS, gecos)) {
+#else /* HAVE_LIBUSER */
/* write the new struct passwd to the passwd file. */
pinfo->pw->pw_gecos = gecos;
if (setpwnam(pinfo->pw) < 0) {
+#endif
warn("setpwnam");
printf(_
("Finger information *NOT* changed. Try again later.\n"));