diff options
author | Cody Maloney | 2013-02-07 07:22:21 +0100 |
---|---|---|
committer | Karel Zak | 2013-02-13 09:39:12 +0100 |
commit | 8c24b6aa2c440bc24ada7cb89c89e4eae0c2550b (patch) | |
tree | 818fe99f398955efd3d030edc0aa6540c44d21c8 /login-utils | |
parent | chsh: Add libuser support (diff) | |
download | kernel-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')
-rw-r--r-- | login-utils/chfn.c | 27 |
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")); |