Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Jan 2002 20:13:55 +0300
From:      "Andrey A. Chernov" <ache@nagual.pp.ru>
To:        Dag-Erling Smorgrav <des@ofug.org>, mark@grondar.za
Cc:        cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   PAM pacthes we discuss
Message-ID:  <20020119171353.GA11472@nagual.pp.ru>
In-Reply-To: <xzp1ygm9vc8.fsf@flood.ping.uio.no>
References:  <200201190901.g0J91H641020@freefall.freebsd.org> <xzp1ygm9vc8.fsf@flood.ping.uio.no>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jan 19, 2002 at 17:08:55 +0100, Dag-Erling Smorgrav wrote:

> out and submit them to markm and myself for review, along with a

Here is the patch, similar /etc/pam.d/* changes are not included, 
login.c/ftpd.c PAM_CRED_ERR addition not included too (I not insist on 
exact that error code).


Index: pam_opie.c
===================================================================
RCS file: /home/ncvs/src/lib/libpam/modules/pam_opie/pam_opie.c,v
retrieving revision 1.7
retrieving revision 1.12
diff -u -r1.7 -r1.12
--- pam_opie.c	5 Dec 2001 16:06:27 -0000	1.7
+++ pam_opie.c	19 Jan 2002 10:09:05 -0000	1.12
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libpam/modules/pam_opie/pam_opie.c,v 1.7 2001/12/05 16:06:27 des Exp $");
+__FBSDID("$FreeBSD: src/lib/libpam/modules/pam_opie/pam_opie.c,v 1.12 2002/01/19 10:09:05 ache Exp $");
 
 #include <sys/types.h>
 #include <opie.h>
@@ -66,13 +66,12 @@
 	struct opie opie;
 	struct options options;
 	struct passwd *pwd;
-	int retval, i;
+	int retval, i, pwok;
 	char *(promptstr[]) = { "%s\nPassword: ", "%s\nPassword [echo on]: "};
 	char challenge[OPIE_CHALLENGE_MAX];
 	char prompt[OPIE_CHALLENGE_MAX+22];
 	char resp[OPIE_SECRET_MAX];
-	const char *user;
-	const char *response;
+	const char *user, *response, *rhost;
 
 	pam_std_option(&options, other_options, argc, argv);
 
@@ -89,13 +88,16 @@
 
 	user = NULL;
 	if (pam_test_option(&options, PAM_OPT_AUTH_AS_SELF, NULL)) {
-		pwd = getpwnam(getlogin());
+		if ((pwd = getpwnam(getlogin())) == NULL)
+			PAM_RETURN(PAM_AUTH_ERR);
 		user = pwd->pw_name;
 	}
 	else {
 		retval = pam_get_user(pamh, (const char **)&user, NULL);
 		if (retval != PAM_SUCCESS)
 			PAM_RETURN(retval);
+		if ((pwd = getpwnam(user)) == NULL)
+			PAM_RETURN(PAM_AUTH_ERR);
 	}
 
 	PAM_LOG("Got user: %s", user);
@@ -106,7 +108,14 @@
 	 */
 	opiedisableaeh();
 
-	opiechallenge(&opie, (char *)user, challenge);
+	if (opiechallenge(&opie, (char *)user, challenge) == 0) {
+		rhost = NULL;
+		(void) pam_get_item(pamh, PAM_RHOST, (const void **)&rhost);
+		pwok = (rhost != NULL) && (*rhost != '\0') &&
+		       opieaccessfile((char *)rhost) &&
+		       opiealways(pwd->pw_dir);
+	} else
+		PAM_RETURN(PAM_AUTH_ERR);
 	for (i = 0; i < 2; i++) {
 		snprintf(prompt, sizeof prompt, promptstr[i], challenge);
 		retval = pam_get_pass(pamh, &response, prompt, &options);
@@ -125,7 +134,7 @@
 	}
 
 	/* We have to copy the response, because opieverify mucks with it. */
-	snprintf(resp, sizeof resp, "%s", response);
+	strlcpy(resp, response, sizeof resp);
 
 	/*
 	 * Opieverify is supposed to return -1 only if an error occurs.
@@ -133,7 +142,10 @@
 	 * it expects.  Thus we can't log an error and can only check for
 	 * success or lack thereof.
 	 */
-	retval = opieverify(&opie, resp) == 0 ? PAM_SUCCESS : PAM_AUTH_ERR;
+	if (opieverify(&opie, resp) != 0)
+		retval = pwok ? PAM_AUTH_ERR : PAM_CRED_ERR;
+	else
+		retval = PAM_SUCCESS;
 	PAM_RETURN(retval);
 }
 
--- su.orig	Wed Dec  5 13:26:00 2001
+++ su	Sat Jan 19 02:31:32 2002
@@ -1,5 +1,5 @@
 #
-# $FreeBSD: src/etc/pam.d/su,v 1.2 2001/12/05 21:26:00 des Exp $
+# $FreeBSD: src/etc/pam.d/su,v 1.3 2002/01/19 10:31:32 ache Exp $
 #
 # PAM configuration for the "su" service
 #
@@ -9,8 +9,8 @@
 auth		requisite	pam_wheel.so	no_warn auth_as_self noroot_ok
 #auth		sufficient	pam_kerberosIV.so	no_warn
 #auth		sufficient	pam_krb5.so	no_warn try_first_pass auth_as_self
-#auth		required	pam_opie.so	no_warn
 #auth		required	pam_ssh.so	no_warn try_first_pass
+auth [default=ignore success=done cred_err=die]	pam_opie.so	no_warn
 auth		required	pam_unix.so	no_warn try_first_pass nullok
 #auth		sufficient	pam_rootok.so	no_warn
 ##auth		sufficient	pam_kerberosIV.so	no_warn

-- 
Andrey A. Chernov
http://ache.pp.ru/

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




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