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

Collapse All | Expand All

(-)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
(-)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
(-)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
	}
(-)pw_user.c (-17 / +35 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
1201
	if (arg1 != NULL) {
1211
	if (arg1 != NULL) {
1202
		if (arg1[strspn(arg1, "0123456789")] == '\0')
1212
		if (arg1[strspn(arg1, "0123456789")] == '\0')
1203
			id = pw_checkid(arg1, UID_MAX);
1213
			id = pw_checkid(arg1, UID_MAX);
Lines 1226-1237 pw_user_add(int argc, char **argv, char Link Here
1226
			homedir = optarg;
1236
			homedir = optarg;
1227
			break;
1237
			break;
1228
		case 'e':
1238
		case 'e':
1229
			now = time(NULL);
1239
			if (genconf)
1230
			cmdcnf->expire_days = parse_date(now, optarg);
1240
			    cmdcnf->expire_days = validate_expire(optarg, ch);
1241
			else {
1242
			    now = time(NULL);
1243
			    cmdcnf->expire_days = parse_date(now, optarg);
1244
			}
1231
			break;
1245
			break;
1232
		case 'p':
1246
		case 'p':
1233
			now = time(NULL);
1247
			if (genconf)
1234
			cmdcnf->password_days = parse_date(now, optarg);
1248
			    cmdcnf->password_days = validate_expire(optarg, ch);
1249
			else {
1250
			    now = time(NULL);
1251
			    cmdcnf->password_days = parse_date(now, optarg);
1252
			}
1235
			break;
1253
			break;
1236
		case 'g':
1254
		case 'g':
1237
			validate_grname(cmdcnf, optarg);
1255
			validate_grname(cmdcnf, optarg);

Return to bug 223431