[Pkg-shadow-commits] r1548 - in upstream/trunk: . src
nekral-guest at alioth.debian.org
nekral-guest at alioth.debian.org
Sat Dec 29 10:42:26 UTC 2007
Author: nekral-guest
Date: 2007-12-29 10:42:25 +0000 (Sat, 29 Dec 2007)
New Revision: 1548
Modified:
upstream/trunk/ChangeLog
upstream/trunk/src/chage.c
Log:
chage cleanups
* src/chage.c: Before pam_end(), the return value of the previous
pam API was already checked. No need to validate it again.
* src/chage.c: main() split in new functions: process_flags(),
check_flags(), check_perms(), open_files(), and close_files().
Modified: upstream/trunk/ChangeLog
===================================================================
--- upstream/trunk/ChangeLog 2007-12-28 23:14:59 UTC (rev 1547)
+++ upstream/trunk/ChangeLog 2007-12-29 10:42:25 UTC (rev 1548)
@@ -1,3 +1,11 @@
+2007-12-29 Nicolas François <nicolas.francois at centraliens.net>
+
+ chage cleanups
+ * src/chage.c: Before pam_end(), the return value of the previous
+ pam API was already checked. No need to validate it again.
+ * src/chage.c: main() split in new functions: process_flags(),
+ check_flags(), check_perms(), open_files(), and close_files().
+
2007-12-28 Nicolas François <nicolas.francois at centraliens.net>
Same changes for chgpasswd:
Modified: upstream/trunk/src/chage.c
===================================================================
--- upstream/trunk/src/chage.c 2007-12-28 23:14:59 UTC (rev 1547)
+++ upstream/trunk/src/chage.c 2007-12-29 10:42:25 UTC (rev 1548)
@@ -65,9 +65,8 @@
mflg = 0, /* set minimum number of days before password change */
Mflg = 0, /* set maximim number of days before password change */
Wflg = 0; /* set expiration warning days */
+static int amroot = 0;
-static int locks;
-
static long mindays;
static long maxdays;
static long lastday;
@@ -83,6 +82,11 @@
static int new_fields (void);
static void print_date (time_t);
static void list_fields (void);
+static void process_flags (int argc, char **argv);
+static void check_flags (int argc, int opt_index);
+static void check_perms (void);
+static void open_files (int readonly);
+static void close_files (void);
/*
* isnum - determine whether or not a string is a number
@@ -296,135 +300,85 @@
warndays);
}
-/*
- * chage - change a user's password aging information
- *
- * This command controls the password aging information.
- *
- * The valid options are
- *
- * -d set last password change date (*)
- * -E set account expiration date (*)
- * -I set password inactive after expiration (*)
- * -l show account aging information
- * -M set maximim number of days before password change (*)
- * -m set minimum number of days before password change (*)
- * -W set expiration warning days (*)
- *
- * (*) requires root permission to execute.
- *
- * All of the time fields are entered in the internal format which is
- * either seconds or days.
- */
-
-int main (int argc, char **argv)
+static void process_flags (int argc, char **argv)
{
- const struct spwd *sp;
- struct spwd spwd;
- uid_t ruid;
- gid_t rgid;
- int amroot;
- const struct passwd *pw;
- struct passwd pwent;
- char name[BUFSIZ];
-
-#ifdef USE_PAM
- pam_handle_t *pamh = NULL;
- int retval;
-#endif
-
-#ifdef WITH_AUDIT
- audit_help_open ();
-#endif
- sanitize_env ();
- setlocale (LC_ALL, "");
- bindtextdomain (PACKAGE, LOCALEDIR);
- textdomain (PACKAGE);
-
- ruid = getuid ();
- rgid = getgid ();
- amroot = (ruid == 0);
-#ifdef WITH_SELINUX
- if (amroot && is_selinux_enabled () > 0)
- amroot = (selinux_check_passwd_access (PASSWD__ROOTOK) == 0);
-#endif
-
/*
- * Get the program name so that error messages can use it.
+ * Parse the command line options.
*/
- Prog = Basename (argv[0]);
+ int option_index = 0;
+ int c;
+ static struct option long_options[] = {
+ {"lastday", required_argument, NULL, 'd'},
+ {"expiredate", required_argument, NULL, 'E'},
+ {"help", no_argument, NULL, 'h'},
+ {"inactive", required_argument, NULL, 'I'},
+ {"list", no_argument, NULL, 'l'},
+ {"mindays", required_argument, NULL, 'm'},
+ {"maxdays", required_argument, NULL, 'M'},
+ {"warndays", required_argument, NULL, 'W'},
+ {NULL, 0, NULL, '\0'}
+ };
- {
- /*
- * Parse the command line options.
- */
- int option_index = 0;
- int c;
- static struct option long_options[] = {
- {"lastday", required_argument, NULL, 'd'},
- {"expiredate", required_argument, NULL, 'E'},
- {"help", no_argument, NULL, 'h'},
- {"inactive", required_argument, NULL, 'I'},
- {"list", no_argument, NULL, 'l'},
- {"mindays", required_argument, NULL, 'm'},
- {"maxdays", required_argument, NULL, 'M'},
- {"warndays", required_argument, NULL, 'W'},
- {NULL, 0, NULL, '\0'}
- };
-
- while ((c =
- getopt_long (argc, argv, "d:E:hI:lm:M:W:", long_options,
- &option_index)) != -1) {
- switch (c) {
- case 'd':
- dflg++;
- if (!isnum (optarg))
- lastday = strtoday (optarg);
- else
- lastday = strtol (optarg, 0, 10);
- break;
- case 'E':
- Eflg++;
- if (!isnum (optarg))
- expdays = strtoday (optarg);
- else
- expdays = strtol (optarg, 0, 10);
- break;
- case 'h':
- usage ();
- break;
- case 'I':
- Iflg++;
- inactdays = strtol (optarg, 0, 10);
- break;
- case 'l':
- lflg++;
- break;
- case 'm':
- mflg++;
- mindays = strtol (optarg, 0, 10);
- break;
- case 'M':
- Mflg++;
- maxdays = strtol (optarg, 0, 10);
- break;
- case 'W':
- Wflg++;
- warndays = strtol (optarg, 0, 10);
- break;
- default:
- usage ();
- }
+ while ((c =
+ getopt_long (argc, argv, "d:E:hI:lm:M:W:", long_options,
+ &option_index)) != -1) {
+ switch (c) {
+ case 'd':
+ dflg++;
+ if (!isnum (optarg))
+ lastday = strtoday (optarg);
+ else
+ lastday = strtol (optarg, 0, 10);
+ break;
+ case 'E':
+ Eflg++;
+ if (!isnum (optarg))
+ expdays = strtoday (optarg);
+ else
+ expdays = strtol (optarg, 0, 10);
+ break;
+ case 'h':
+ usage ();
+ break;
+ case 'I':
+ Iflg++;
+ inactdays = strtol (optarg, 0, 10);
+ break;
+ case 'l':
+ lflg++;
+ break;
+ case 'm':
+ mflg++;
+ mindays = strtol (optarg, 0, 10);
+ break;
+ case 'M':
+ Mflg++;
+ maxdays = strtol (optarg, 0, 10);
+ break;
+ case 'W':
+ Wflg++;
+ warndays = strtol (optarg, 0, 10);
+ break;
+ default:
+ usage ();
}
}
+ check_flags (argc, optind);
+}
+
+
+static void check_flags (int argc, int opt_index)
+{
+
/*
* Make certain the flags do not conflict and that there is a user
* name on the command line.
*/
- if (argc != optind + 1)
+ if (argc != opt_index + 1) {
usage ();
+ }
if (lflg && (mflg || Mflg || dflg || Wflg || Iflg || Eflg)) {
fprintf (stderr,
@@ -432,7 +386,16 @@
Prog);
usage ();
}
+}
+/* Additional check done later */
+static void check_perms (void)
+{
+#ifdef USE_PAM
+ pam_handle_t *pamh = NULL;
+ int retval;
+#endif
+
/*
* An unprivileged user can ask for their own aging information, but
* only root can change it, or list another user's aging
@@ -448,8 +411,6 @@
exit (E_NOPERM);
}
- OPENLOG ("chage");
-
#ifdef USE_PAM
retval = PAM_SUCCESS;
@@ -485,15 +446,12 @@
exit (E_NOPERM);
}
#endif /* USE_PAM */
+}
+static void open_files (int readonly)
+{
/*
- * We use locks for read-write accesses only (locks implies amroot,
- * but amroot doesn't imply locks).
- */
- locks = !lflg;
-
- /*
- * Lock and open the password file. This loads all of the password
+ * open the password file. This loads all of the password
* file entries into memory. Then we get a pointer to the password
* file entry for the requested user.
*/
@@ -503,32 +461,14 @@
closelog ();
exit (E_NOPERM);
}
- if (!(pw = pw_locate (argv[optind]))) {
- fprintf (stderr, _("%s: unknown user %s\n"), Prog,
- argv[optind]);
- closelog ();
- exit (E_NOPERM);
- }
- pwent = *pw;
- STRFCPY (name, pwent.pw_name);
-
- if (!spw_file_present ()) {
- fprintf (stderr,
- _("%s: the shadow password file is not present\n"),
- Prog);
- SYSLOG ((LOG_ERR, "can't find the shadow password file"));
- closelog ();
- exit (E_SHADOW_NOTFOUND);
- }
-
/*
* For shadow password files we have to lock the file and read in
* the entries as was done for the password file. The user entries
* does not have to exist in this case; a new entry will be created
* for this user if one does not exist already.
*/
- if (locks && !spw_lock ()) {
+ if (!readonly && !spw_lock ()) {
fprintf (stderr,
_("%s: can't lock shadow password file\n"), Prog);
SYSLOG ((LOG_ERR, "failed locking %s", SHADOW_FILE));
@@ -539,7 +479,7 @@
#endif
exit (E_NOPERM);
}
- if (!spw_open (locks ? O_RDWR : O_RDONLY)) {
+ if (!spw_open (readonly ? O_RDONLY: O_RDWR)) {
fprintf (stderr,
_("%s: can't open shadow password file\n"), Prog);
spw_unlock ();
@@ -551,7 +491,125 @@
#endif
exit (E_NOPERM);
}
+}
+static void close_files (void)
+{
+ /*
+ * Now close the shadow password file, which will cause all of the
+ * entries to be re-written.
+ */
+ if (!spw_close ()) {
+ fprintf (stderr,
+ _("%s: can't rewrite shadow password file\n"), Prog);
+ spw_unlock ();
+ SYSLOG ((LOG_ERR, "failed rewriting %s", SHADOW_FILE));
+ closelog ();
+#ifdef WITH_AUDIT
+ audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "change age",
+ pw->pw_name, getuid (), 0);
+#endif
+ exit (E_NOPERM);
+ }
+
+ /*
+ * Close the password file. If any entries were modified, the file
+ * will be re-written.
+ */
+ if (!pw_close ()) {
+ fprintf (stderr, _("%s: can't rewrite password file\n"), Prog);
+ spw_unlock ();
+ SYSLOG ((LOG_ERR, "failed rewriting %s", PASSWD_FILE));
+ closelog ();
+#ifdef WITH_AUDIT
+ audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "change age",
+ pw->pw_name, getuid (), 0);
+#endif
+ exit (E_NOPERM);
+ }
+ spw_unlock ();
+}
+
+/*
+ * chage - change a user's password aging information
+ *
+ * This command controls the password aging information.
+ *
+ * The valid options are
+ *
+ * -d set last password change date (*)
+ * -E set account expiration date (*)
+ * -I set password inactive after expiration (*)
+ * -l show account aging information
+ * -M set maximim number of days before password change (*)
+ * -m set minimum number of days before password change (*)
+ * -W set expiration warning days (*)
+ *
+ * (*) requires root permission to execute.
+ *
+ * All of the time fields are entered in the internal format which is
+ * either seconds or days.
+ */
+
+int main (int argc, char **argv)
+{
+ const struct spwd *sp;
+ struct spwd spwd;
+ uid_t ruid;
+ gid_t rgid;
+ const struct passwd *pw;
+ struct passwd pwent;
+ char name[BUFSIZ];
+
+#ifdef WITH_AUDIT
+ audit_help_open ();
+#endif
+ sanitize_env ();
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ ruid = getuid ();
+ rgid = getgid ();
+ amroot = (ruid == 0);
+#ifdef WITH_SELINUX
+ if (amroot && is_selinux_enabled () > 0)
+ amroot = (selinux_check_passwd_access (PASSWD__ROOTOK) == 0);
+#endif
+
+ /*
+ * Get the program name so that error messages can use it.
+ */
+ Prog = Basename (argv[0]);
+
+ process_flags (argc, argv);
+
+ OPENLOG ("chage");
+
+ check_perms ();
+
+ if (!spw_file_present ()) {
+ fprintf (stderr,
+ _("%s: the shadow password file is not present\n"),
+ Prog);
+ SYSLOG ((LOG_ERR, "can't find the shadow password file"));
+ closelog ();
+ exit (E_SHADOW_NOTFOUND);
+ }
+
+ open_files (lflg);
+
+ if (!(pw = pw_locate (argv[optind]))) {
+ fprintf (stderr, _("%s: unknown user %s\n"), Prog,
+ argv[optind]);
+ closelog ();
+ exit (E_NOPERM);
+ }
+
+ pwent = *pw;
+ STRFCPY (name, pwent.pw_name);
+
+ /* Drop privileges */
if (lflg && (setregid (rgid, rgid) || setreuid (ruid, ruid))) {
fprintf (stderr, _("%s: failed to drop privileges (%s)\n"),
Prog, strerror (errno));
@@ -730,46 +788,15 @@
exit (E_NOPERM);
}
- /*
- * Now close the shadow password file, which will cause all of the
- * entries to be re-written.
- */
- if (!spw_close ()) {
- fprintf (stderr,
- _("%s: can't rewrite shadow password file\n"), Prog);
- spw_unlock ();
- SYSLOG ((LOG_ERR, "failed rewriting %s", SHADOW_FILE));
- closelog ();
-#ifdef WITH_AUDIT
- audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "change age",
- pw->pw_name, getuid (), 0);
-#endif
- exit (E_NOPERM);
- }
+ close_files ();
- /*
- * Close the password file. If any entries were modified, the file
- * will be re-written.
- */
- if (!pw_close ()) {
- fprintf (stderr, _("%s: can't rewrite password file\n"), Prog);
- spw_unlock ();
- SYSLOG ((LOG_ERR, "failed rewriting %s", PASSWD_FILE));
- closelog ();
-#ifdef WITH_AUDIT
- audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "change age",
- pw->pw_name, getuid (), 0);
-#endif
- exit (E_NOPERM);
- }
- spw_unlock ();
SYSLOG ((LOG_INFO, "changed password expiry for %s", name));
#ifdef USE_PAM
- if (retval == PAM_SUCCESS)
- pam_end (pamh, PAM_SUCCESS);
+ pam_end (pamh, PAM_SUCCESS);
#endif /* USE_PAM */
closelog ();
exit (E_SUCCESS);
}
+
More information about the Pkg-shadow-commits
mailing list