Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Mar 2001 15:23:02 +0200
From:      Peter Pentchev <roam@orbitel.bg>
To:        arch@FreeBSD.org
Subject:   pw(8) patch: add -H encpass option to set the pw_passwd field
Message-ID:  <20010302152302.C2609@ringworld.oblivion.bg>

next in thread | raw e-mail | index | archive | help
Hi,

A post to -hackers got me thinking about adding a PAM authentication module,
which uses Blowfish encryption and authenticates against passwd(5).
The one major obstacle with this scheme (at least as far as I could see)
is that there would be no way to set or change the user passwords,
apart from frobbing the /etc/{s,}pwd.db files (which is impolite in
the extreme), or the /etc/{master.,}passwd files (which is basically
just as bad, not to mention having to invoke pwd_mkdb(8) afterwards).

So.. what would be so bad about the attached patch, which lets a program
or a script invoke pw(8) with a 'usermod -H new-encrypted-password'
and have pw(8) store that password as-is in the user's pw_passwd field?
The password is already encrypted, so there'd be no big security risks
of someone watching the process table or something.

G'luck,
Peter

-- 
This sentence is false.

Index: src/usr.sbin/pw/pw.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pw/pw.8,v
retrieving revision 1.21
diff -u -r1.21 pw.8
--- src/usr.sbin/pw/pw.8	2001/02/01 16:43:57	1.21
+++ src/usr.sbin/pw/pw.8	2001/03/02 13:15:37
@@ -101,6 +101,7 @@
 .Op Fl s Ar shell
 .Op Fl L Ar class
 .Op Fl h Ar fd
+.Op Fl H Ar encpass
 .Op Fl N
 .Op Fl P
 .Op Fl Y
@@ -456,6 +457,15 @@
 See
 .Xr passwd 5
 for details.
+.It Fl H Ar encpass
+Set the
+.Em passwd
+field in the user's passwd record.
+This option assumes that
+.Ar encpass
+is an already-encrypted password, providing a hook for adding new
+.Xr passwd 5
+encryption algorithms.
 .It Fl h Ar fd
 This option provides a special interface by which interactive scripts can
 set an account password using
Index: src/usr.sbin/pw/pw.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pw/pw.c,v
retrieving revision 1.23
diff -u -r1.23 pw.c
--- src/usr.sbin/pw/pw.c	2000/12/29 18:04:49	1.23
+++ src/usr.sbin/pw/pw.c	2001/03/02 13:15:37
@@ -106,18 +106,18 @@
 	static const char *opts[W_NUM][M_NUM] =
 	{
 		{ /* user */
-			"V:C:qn:u:c:d:e:p:g:G:mk:s:oL:i:w:h:Db:NPy:Y",
+			"V:C:qn:u:c:d:e:p:g:G:mk:s:oL:i:w:h:H:Db:NPy:Y",
 			"V:C:qn:u:rY",
-			"V:C:qn:u:c:d:e:p:g:G:ml:k:s:w:L:h:FNPY",
+			"V:C:qn:u:c:d:e:p:g:G:ml:k:s:w:L:h:H:FNPY",
 			"V:C:qn:u:FPa7",
 			"V:C:q",
 			"V:C:q",
 			"V:C:q"
 		},
 		{ /* grp  */
-			"V:C:qn:g:h:M:pNPY",
+			"V:C:qn:g:h:H:M:pNPY",
 			"V:C:qn:g:Y",
-			"V:C:qn:g:l:h:FM:m:NPY",
+			"V:C:qn:g:l:h:H:FM:m:NPY",
 			"V:C:qn:g:FPa",
 			"V:C:q"
 		 }
Index: src/usr.sbin/pw/pw_group.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pw/pw_group.c,v
retrieving revision 1.13
diff -u -r1.13 pw_group.c
--- src/usr.sbin/pw/pw_group.c	2000/06/22 16:48:41	1.13
+++ src/usr.sbin/pw/pw_group.c	2001/03/02 13:15:38
@@ -158,6 +158,12 @@
 	 * software.
 	 */
 
+	if ((getarg(args, 'h') != NULL) && (getarg(args, 'H') != NULL))
+		err(EX_DATAERR, "-h and -H cannot be used simultaneously");
+
+	if ((arg = getarg(args, 'H')) != NULL)
+		grp->gr_passwd = arg->val;
+	
 	if ((arg = getarg(args, 'h')) != NULL) {
 		if (strcmp(arg->val, "-") == 0)
 			grp->gr_passwd = "*";	/* No access */
Index: src/usr.sbin/pw/pw_user.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pw/pw_user.c,v
retrieving revision 1.44
diff -u -r1.44 pw_user.c
--- src/usr.sbin/pw/pw_user.c	2000/12/29 18:04:49	1.44
+++ src/usr.sbin/pw/pw_user.c	2001/03/02 13:15:39
@@ -602,6 +602,14 @@
 		}
 	}
 
+	if ((getarg(args, 'h') != NULL) && (getarg(args, 'H') != NULL))
+		errx(EX_DATAERR, "-h and -H cannot be used simultaneously");
+	
+	if ((arg = getarg(args, 'H')) != NULL) {
+		pwd->pw_passwd = arg->val;
+		edited = 1;
+	}
+	
 	if ((arg = getarg(args, 'h')) != NULL) {
 		if (strcmp(arg->val, "-") == 0) {
 			if (!pwd->pw_passwd || *pwd->pw_passwd != '*') {

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010302152302.C2609>