patch from Liam Foy to add a -F option to force a user to change her's/his

password at the next login.
This commit is contained in:
christos 2005-08-12 16:22:05 +00:00
parent 622690226a
commit 91b1a8d112
3 changed files with 45 additions and 20 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: user.c,v 1.86 2005/07/30 15:06:43 christos Exp $ */
/* $NetBSD: user.c,v 1.87 2005/08/12 16:22:05 christos Exp $ */
/*
* Copyright (c) 1999 Alistair G. Crooks. All rights reserved.
@ -35,7 +35,7 @@
#ifndef lint
__COPYRIGHT("@(#) Copyright (c) 1999 \
The NetBSD Foundation, Inc. All rights reserved.");
__RCSID("$NetBSD: user.c,v 1.86 2005/07/30 15:06:43 christos Exp $");
__RCSID("$NetBSD: user.c,v 1.87 2005/08/12 16:22:05 christos Exp $");
#endif
#include <sys/types.h>
@ -1002,18 +1002,23 @@ static int
scantime(time_t *tp, char *s)
{
struct tm tm;
char *ep;
*tp = 0;
if (s != NULL) {
(void)memset(&tm, 0, sizeof(tm));
if (strptime(s, "%c", &tm) != NULL) {
*tp = mktime(&tm);
return 1;
} else if (strptime(s, "%B %d %Y", &tm) != NULL) {
*tp = mktime(&tm);
} else if (isdigit((unsigned char) *s)) {
*tp = atoi(s);
return 1;
} else {
return 0;
*tp = strtol(s, &ep, 10);
if (*ep != '\0' || *tp < -1 || *tp > LONG_MAX) {
*tp = 0;
return 0;
}
}
}
return 1;
@ -1137,12 +1142,13 @@ adduser(char *login_name, user_t *up)
login_name);
}
if (!scantime(&inactive, up->u_inactive)) {
warnx("Warning: inactive time `%s' invalid, account expiry off",
warnx("Warning: inactive time `%s' invalid, password expiry off",
up->u_inactive);
}
if (!scantime(&expire, up->u_expire)) {
warnx("Warning: expire time `%s' invalid, password expiry off",
if (!scantime(&expire, up->u_expire) || expire == -1) {
warnx("Warning: expire time `%s' invalid, account expiry off",
up->u_expire);
expire = 0; /* Just in case. */
}
if (lstat(home, &st) < 0 && !(up->u_flags & F_MKDIR)) {
warnx("Warning: home directory `%s' doesn't exist, "
@ -1504,10 +1510,12 @@ moduser(char *login_name, char *newlogin, user_t *up, int allow_samba)
}
}
if (up->u_flags & F_EXPIRE) {
if (!scantime(&pwp->pw_expire, up->u_expire)) {
if (!scantime(&pwp->pw_expire, up->u_expire) ||
pwp->pw_expire == -1) {
warnx("Warning: expire time `%s' invalid, "
"password expiry off",
"account expiry off",
up->u_expire);
pwp->pw_expire = 0;
}
}
if (up->u_flags & F_COMMENT)
@ -1665,7 +1673,7 @@ void
usermgmt_usage(const char *prog)
{
if (strcmp(prog, "useradd") == 0) {
(void)fprintf(stderr, "usage: %s -D [-b basedir] [-e expiry] "
(void)fprintf(stderr, "usage: %s -DF [-b basedir] [-e expiry] "
"[-f inactive] [-g group]\n\t[-r lowuid..highuid] "
"[-s shell] [-L class]\n", prog);
(void)fprintf(stderr, "usage: %s [-G group] [-b basedir] "
@ -1674,7 +1682,7 @@ usermgmt_usage(const char *prog)
"\t[-r lowuid..highuid] [-s shell] [-u uid] [-v] user\n",
prog);
} else if (strcmp(prog, "usermod") == 0) {
(void)fprintf(stderr, "usage: %s [-G group] [-c comment] "
(void)fprintf(stderr, "usage: %s -F [-G group] [-c comment] "
"[-C yes/no] [-d homedir] [-e expire] \n\t[-f inactive] "
"[-g group] [-l newname] [-m] [-o] [-p password]\n"
"\t[-s shell] [-u uid] [-L class] [-v] user\n", prog);
@ -1727,12 +1735,21 @@ useradd(int argc, char **argv)
read_defaults(&u);
u.u_uid = -1;
defaultfield = bigD = 0;
while ((c = getopt(argc, argv, "DG:b:c:d:e:f:g:k:mou:s:"
while ((c = getopt(argc, argv, "DFG:b:c:d:e:f:g:k:mou:s:"
ADD_OPT_EXTENSIONS)) != -1) {
switch(c) {
case 'D':
bigD = 1;
break;
case 'F':
/*
* Setting -1 will force the new user to
* change their password as soon as they
* next login - passwd(5).
*/
defaultfield = 1;
memsave(&u.u_inactive, "-1", strlen("-1"));
break;
case 'G':
while ((u.u_groupv[u.u_groupc] = strsep(&optarg, ",")) != NULL &&
u.u_groupc < NGROUPS_MAX) {
@ -1869,7 +1886,7 @@ usermod(int argc, char **argv)
read_defaults(&u);
have_new_user = 0;
u.u_locked = -1;
while ((c = getopt(argc, argv, "G:C:c:d:e:f:g:l:mos:u:"
while ((c = getopt(argc, argv, "C:FG:c:d:e:f:g:l:mos:u:"
MOD_OPT_EXTENSIONS)) != -1) {
switch(c) {
case 'G':
@ -1905,6 +1922,10 @@ usermod(int argc, char **argv)
errx(1, "Please type 'yes' or 'no'");
break;
case 'F':
memsave(&u.u_inactive, "-1", strlen("-1"));
u.u_flags |= F_INACTIVE;
break;
case 'd':
memsave(&u.u_home, optarg, strlen(optarg));
u.u_flags |= F_HOMEDIR;

View File

@ -1,4 +1,4 @@
.\" $NetBSD: useradd.8,v 1.31 2005/08/08 21:53:17 christos Exp $ */
.\" $NetBSD: useradd.8,v 1.32 2005/08/12 16:22:05 christos Exp $ */
.\"
.\"
.\" Copyright (c) 1999 Alistair G. Crooks. All rights reserved.
@ -39,7 +39,7 @@
.Nd add a user to the system
.Sh SYNOPSIS
.Nm
.Fl D
.Fl DF
.Op Fl b Ar base-dir
.Op Fl e Ar expiry-time
.Op Fl f Ar inactive-time
@ -115,6 +115,8 @@ will set the default to be the new value.
See
.Xr usermgmt.conf 5
for more information.
.It Fl F
Force the user to change their password upon next login.
.It Fl b Ar base-dir
sets the default base directory.
This is the directory to which the

View File

@ -1,4 +1,4 @@
.\" $NetBSD: usermod.8,v 1.22 2005/07/28 20:23:31 wiz Exp $ */
.\" $NetBSD: usermod.8,v 1.23 2005/08/12 16:22:05 christos Exp $ */
.\"
.\"
.\" Copyright (c) 1999 Alistair G. Crooks. All rights reserved.
@ -39,7 +39,7 @@
.Nd modify user login information
.Sh SYNOPSIS
.Nm
.Op Fl moSv
.Op Fl FmoSv
.Op Fl C Ar yes/no
.Op Fl c Ar comment
.Op Fl d Ar home-dir
@ -89,7 +89,7 @@ without populating it; if the
option is specified, tries to move the old home directory to
.Ar home-directory .
.It Fl e Ar expiry-time
Set the time at which the current password expires.
Set the time at which the account expires.
This can be used to implement password aging.
It should be entered in the form
.Dq month day year ,
@ -106,10 +106,12 @@ See
.Xr usermgmt.conf 5
for more details.
.It Fl f Ar inactive-time
Set the time at which the account expires.
Set the time at which the password expires.
See the
.Fl e
option.
.It Fl F
Force the user to change their password upon next login.
.It Fl G Ar secondary-group
Specify a secondary group to which the user will be added in the
.Pa /etc/group