summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/passwd/pwd_gensalt.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/usr.bin/passwd/pwd_gensalt.c b/usr.bin/passwd/pwd_gensalt.c
index bd3f1985e16..526e914c4c6 100644
--- a/usr.bin/passwd/pwd_gensalt.c
+++ b/usr.bin/passwd/pwd_gensalt.c
@@ -1,3 +1,4 @@
+/* $OpenBSD: pwd_gensalt.c,v 1.7 1997/04/10 20:04:54 provos Exp $ */
/*
* Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
* All rights reserved.
@@ -29,10 +30,12 @@
*/
#include <sys/syslimits.h>
+#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>
+#include <grp.h>
#include <pwd.h>
#include <util.h>
#include <time.h>
@@ -49,18 +52,36 @@ pwd_gensalt(salt, max, pwd, type)
char *bcrypt_gensalt __P((u_int8_t));
char option[LINE_MAX];
char *next, *now;
+ char *cipher;
*salt = '\0';
switch (type) {
case 'y':
- pw_getconf(option, LINE_MAX, pwd->pw_name, "ypcipher");
+ cipher = "ypcipher";
break;
case 'l':
default:
- pw_getconf(option, LINE_MAX, pwd->pw_name, "localcipher");
+ cipher = "localcipher";
break;
}
+ pw_getconf(option, LINE_MAX, pwd->pw_name, cipher);
+
+ /* Try to find an entry for the group */
+ if (*option == 0) {
+ struct group *grp;
+ char grpkey[LINE_MAX];
+
+ grp = getgrgid(pwd->pw_gid);
+ if (grp != NULL) {
+ snprintf(grpkey, LINE_MAX-1, ".%s", grp->gr_name);
+ grpkey[LINE_MAX-1] = 0;
+ pw_getconf(option, LINE_MAX, grpkey, cipher);
+ }
+ if (*option == 0)
+ pw_getconf(option, LINE_MAX, "default", cipher);
+ }
+
next = option;
now = strsep(&next, ",");
if (!strcmp(now, "old")) {