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 |
|