View | Details | Raw Unified | Return to bug 223431 | Differences between
and this patch

Collapse All | Expand All

(-)usr.sbin/pw/psdate.c (-1 / +1 lines)
Lines 38-44 static const char rcsid[] = Link Here
38
#include "psdate.h"
38
#include "psdate.h"
39
39
40
40
41
static int
41
int
42
numerics(char const * str)
42
numerics(char const * str)
43
{
43
{
44
44
(-)usr.sbin/pw/psdate.h (+1 lines)
Lines 33-38 Link Here
33
#include <sys/cdefs.h>
33
#include <sys/cdefs.h>
34
34
35
__BEGIN_DECLS
35
__BEGIN_DECLS
36
int numerics(char const * str);
36
time_t parse_date(time_t dt, char const * str);
37
time_t parse_date(time_t dt, char const * str);
37
void print_date(char *buf, time_t t, int dotime);
38
void print_date(char *buf, time_t t, int dotime);
38
__END_DECLS
39
__END_DECLS
(-)usr.sbin/pw/pw_conf.c (-2 / +2 lines)
Lines 207-215 passwd_val(char const * str, int dflt) Link Here
207
		 * Special cases for defaultpassword
207
		 * Special cases for defaultpassword
208
		 */
208
		 */
209
		if (strcmp(str, "random") == 0)
209
		if (strcmp(str, "random") == 0)
210
			return -1;
210
			return 2;
211
		if (strcmp(str, "none") == 0)
211
		if (strcmp(str, "none") == 0)
212
			return -2;
212
			return 3;
213
213
214
		errx(1, "Invalid value for default password");
214
		errx(1, "Invalid value for default password");
215
	}
215
	}
(-)usr.sbin/pw/pw_user.c (-25 / +44 lines)
Lines 515-521 pw_password(struct userconf * cnf, char Link Here
515
	char            pwbuf[32];
515
	char            pwbuf[32];
516
516
517
	switch (cnf->default_password) {
517
	switch (cnf->default_password) {
518
	case -1:		/* Random password */
518
	case 0:		/* No login - default */
519
	default:
520
		return "*";
521
522
	case 1:		/* user's name */
523
		strlcpy(pwbuf, user, sizeof(pwbuf));
524
		break;
525
	case 2:			/* Random password */
519
		l = (arc4random() % 8 + 8);	/* 8 - 16 chars */
526
		l = (arc4random() % 8 + 8);	/* 8 - 16 chars */
520
		for (i = 0; i < l; i++)
527
		for (i = 0; i < l; i++)
521
			pwbuf[i] = chars[arc4random_uniform(sizeof(chars)-1)];
528
			pwbuf[i] = chars[arc4random_uniform(sizeof(chars)-1)];
Lines 532-547 pw_password(struct userconf * cnf, char Link Here
532
		}
539
		}
533
		break;
540
		break;
534
541
535
	case -2:		/* No password at all! */
542
	case 3:			/* No password at all! */
536
		return "";
543
		return "";
537
538
	case 0:		/* No login - default */
539
	default:
540
		return "*";
541
542
	case 1:		/* user's name */
543
		strlcpy(pwbuf, user, sizeof(pwbuf));
544
		break;
545
	}
544
	}
546
	return pw_pwcrypt(pwbuf);
545
	return pw_pwcrypt(pwbuf);
547
}
546
}
Lines 1122-1132 validate_mode(char *mode) Link Here
1122
	return (m);
1121
	return (m);
1123
}
1122
}
1124
1123
1124
static long
1125
validate_expire(char *str, int opt)
1126
{
1127
	if (!numerics(str))
1128
		errx(EX_DATAERR, "-%c argument must be numeric "
1129
		     "when setting defaults: %s", (char)opt, str);
1130
	return strtol(str, NULL, 0);
1131
}
1132
1125
static void
1133
static void
1126
mix_config(struct userconf *cmdcnf, struct userconf *cfg)
1134
mix_config(struct userconf *cmdcnf, struct userconf *cfg)
1127
{
1135
{
1128
1136
1129
	if (cmdcnf->default_password == 0)
1137
	if (cmdcnf->default_password < 0)
1130
		cmdcnf->default_password = cfg->default_password;
1138
		cmdcnf->default_password = cfg->default_password;
1131
	if (cmdcnf->reuse_uids == 0)
1139
	if (cmdcnf->reuse_uids == 0)
1132
		cmdcnf->reuse_uids = cfg->reuse_uids;
1140
		cmdcnf->reuse_uids = cfg->reuse_uids;
Lines 1164-1172 mix_config(struct userconf *cmdcnf, stru Link Here
1164
		cmdcnf->min_gid = cfg->min_gid;
1172
		cmdcnf->min_gid = cfg->min_gid;
1165
	if (cmdcnf->max_gid == 0)
1173
	if (cmdcnf->max_gid == 0)
1166
		cmdcnf->max_gid = cfg->max_gid;
1174
		cmdcnf->max_gid = cfg->max_gid;
1167
	if (cmdcnf->expire_days == 0)
1175
	if (cmdcnf->expire_days < 0)
1168
		cmdcnf->expire_days = cfg->expire_days;
1176
		cmdcnf->expire_days = cfg->expire_days;
1169
	if (cmdcnf->password_days == 0)
1177
	if (cmdcnf->password_days < 0)
1170
		cmdcnf->password_days = cfg->password_days;
1178
		cmdcnf->password_days = cfg->password_days;
1171
}
1179
}
1172
1180
Lines 1198-1203 pw_user_add(int argc, char **argv, char Link Here
1198
	if ((cmdcnf = calloc(1, sizeof(struct userconf))) == NULL)
1206
	if ((cmdcnf = calloc(1, sizeof(struct userconf))) == NULL)
1199
		err(EXIT_FAILURE, "calloc()");
1207
		err(EXIT_FAILURE, "calloc()");
1200
1208
1209
	cmdcnf->default_password = cmdcnf->expire_days = cmdcnf->password_days = -1; 
1210
	now = time(NULL);
1211
1201
	if (arg1 != NULL) {
1212
	if (arg1 != NULL) {
1202
		if (arg1[strspn(arg1, "0123456789")] == '\0')
1213
		if (arg1[strspn(arg1, "0123456789")] == '\0')
1203
			id = pw_checkid(arg1, UID_MAX);
1214
			id = pw_checkid(arg1, UID_MAX);
Lines 1226-1237 pw_user_add(int argc, char **argv, char Link Here
1226
			homedir = optarg;
1237
			homedir = optarg;
1227
			break;
1238
			break;
1228
		case 'e':
1239
		case 'e':
1229
			now = time(NULL);
1240
			if (genconf)
1230
			cmdcnf->expire_days = parse_date(now, optarg);
1241
			    cmdcnf->expire_days = validate_expire(optarg, ch);
1242
			else
1243
			    cmdcnf->expire_days = parse_date(now, optarg);
1231
			break;
1244
			break;
1232
		case 'p':
1245
		case 'p':
1233
			now = time(NULL);
1246
			if (genconf)
1234
			cmdcnf->password_days = parse_date(now, optarg);
1247
			    cmdcnf->password_days = validate_expire(optarg, ch);
1248
			else
1249
			    cmdcnf->password_days = parse_date(now, optarg);
1235
			break;
1250
			break;
1236
		case 'g':
1251
		case 'g':
1237
			validate_grname(cmdcnf, optarg);
1252
			validate_grname(cmdcnf, optarg);
Lines 1369-1376 pw_user_add(int argc, char **argv, char Link Here
1369
	pwd->pw_uid = pw_uidpolicy(cmdcnf, id);
1384
	pwd->pw_uid = pw_uidpolicy(cmdcnf, id);
1370
	pwd->pw_gid = pw_gidpolicy(cnf, grname, pwd->pw_name,
1385
	pwd->pw_gid = pw_gidpolicy(cnf, grname, pwd->pw_name,
1371
	    (gid_t) pwd->pw_uid, dryrun);
1386
	    (gid_t) pwd->pw_uid, dryrun);
1372
	pwd->pw_change = cmdcnf->password_days;
1387
	
1373
	pwd->pw_expire = cmdcnf->expire_days;
1388
	if (cmdcnf->password_days > 0)
1389
		pwd->pw_change = now + cmdcnf->password_days * 86400L;
1390
	if (cmdcnf->expire_days > 0)
1391
		pwd->pw_expire = now + cmdcnf->expire_days * 86400L;
1392
1374
	pwd->pw_dir = pw_homepolicy(cmdcnf, homedir, pwd->pw_name);
1393
	pwd->pw_dir = pw_homepolicy(cmdcnf, homedir, pwd->pw_name);
1375
	pwd->pw_shell = pw_shellpolicy(cmdcnf);
1394
	pwd->pw_shell = pw_shellpolicy(cmdcnf);
1376
	lc = login_getpwclass(pwd);
1395
	lc = login_getpwclass(pwd);
Lines 1511-1516 pw_user_mod(int argc, char **argv, char Link Here
1511
	class = nispasswd = NULL;
1530
	class = nispasswd = NULL;
1512
	quiet = createhome = pretty = dryrun = nis = precrypted = false;
1531
	quiet = createhome = pretty = dryrun = nis = precrypted = false;
1513
	edited = false;
1532
	edited = false;
1533
	now = time(NULL);
1514
1534
1515
	if (arg1 != NULL) {
1535
	if (arg1 != NULL) {
1516
		if (arg1[strspn(arg1, "0123456789")] == '\0')
1536
		if (arg1[strspn(arg1, "0123456789")] == '\0')
Lines 1540-1550 pw_user_mod(int argc, char **argv, char Link Here
1540
			homedir = optarg;
1560
			homedir = optarg;
1541
			break;
1561
			break;
1542
		case 'e':
1562
		case 'e':
1543
			now = time(NULL);
1544
			expire_days = parse_date(now, optarg);
1563
			expire_days = parse_date(now, optarg);
1545
			break;
1564
			break;
1546
		case 'p':
1565
		case 'p':
1547
			now = time(NULL);
1548
			password_days = parse_date(now, optarg);
1566
			password_days = parse_date(now, optarg);
1549
			break;
1567
			break;
1550
		case 'g':
1568
		case 'g':
Lines 1679-1691 pw_user_mod(int argc, char **argv, char Link Here
1679
		}
1697
		}
1680
	}
1698
	}
1681
1699
1682
	if (password_days >= 0 && pwd->pw_change != password_days) {
1700
1683
		pwd->pw_change = password_days;
1701
	if (password_days >= 0) {
1702
		pwd->pw_change = now + password_days * 86400L;
1684
		edited = true;
1703
		edited = true;
1685
	}
1704
	}
1686
1705
1687
	if (expire_days >= 0 && pwd->pw_expire != expire_days) {
1706
	if (expire_days >= 0) {
1688
		pwd->pw_expire = expire_days;
1707
		pwd->pw_expire = now + expire_days * 86400L;
1689
		edited = true;
1708
		edited = true;
1690
	}
1709
	}
1691
1710

Return to bug 223431