svn commit: samba r12900 - in branches/SAMBA_3_0/source/nsswitch: .

gd at samba.org gd at samba.org
Fri Jan 13 11:11:23 GMT 2006


Author: gd
Date: 2006-01-13 11:11:23 +0000 (Fri, 13 Jan 2006)
New Revision: 12900

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12900

Log:
Merge from trunk:

Correctly handle the case where users logon with an expired password. 

In that case pam_sm_authenticate has to return PAM_SUCESS instead of
PAM_NEW_AUTHTOK_REQD or PAM_AUTHTOK_EXPIRED and pam_sm_acct_mgmt has to
take care of requesting an immediate password change. (see the Linux PAM
documentation).

Fixes Bugzilla #1524, #3205. Tested with login, sshd, kdm and gdm on
Linux.

Thanks to Scott Barker <Scott_Barker at mtechIT.com>.

Guenther

Modified:
   branches/SAMBA_3_0/source/nsswitch/pam_winbind.c
   branches/SAMBA_3_0/source/nsswitch/pam_winbind.h


Changeset:
Modified: branches/SAMBA_3_0/source/nsswitch/pam_winbind.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/pam_winbind.c	2006-01-13 10:37:14 UTC (rev 12899)
+++ branches/SAMBA_3_0/source/nsswitch/pam_winbind.c	2006-01-13 11:11:23 UTC (rev 12900)
@@ -57,6 +57,11 @@
 	return ctrl;
 }
 
+static void _pam_winbind_cleanup_func(pam_handle_t *pamh, void *data, int error_status)
+{
+	SAFE_FREE(data);
+}
+
 /* --- authentication management functions --- */
 
 /* Attempt a conversation */
@@ -508,7 +513,22 @@
      }
 
      /* Now use the username to look up password */
-     return winbind_auth_request(username, password, member, ctrl);
+     retval = winbind_auth_request(username, password, member, ctrl);
+     if (retval == PAM_NEW_AUTHTOK_REQD ||
+	 retval == PAM_AUTHTOK_EXPIRED) {
+	
+	char *buf;
+	                
+	if (!asprintf(&buf, "%d", retval)) {
+		return PAM_BUF_ERR;
+	}
+
+	pam_set_data( pamh, PAM_WINBIND_NEW_AUTHTOK_REQD, (void *)buf, _pam_winbind_cleanup_func);
+
+	return PAM_SUCCESS;
+     }
+     
+     return retval;
 }
 
 PAM_EXTERN
@@ -527,6 +547,8 @@
 		   int argc, const char **argv)
 {
     const char *username;
+    void *tmp = NULL;
+
     int retval = PAM_USER_UNKNOWN;
 
     /* parse arguments */
@@ -555,6 +577,26 @@
 		return PAM_IGNORE;
 	    return PAM_USER_UNKNOWN;
 	case 0:
+	    pam_get_data( pamh, PAM_WINBIND_NEW_AUTHTOK_REQD, (const void **)&tmp);
+
+	    if (tmp != NULL) {
+		retval = atoi(tmp);
+		switch (retval) {
+		case PAM_AUTHTOK_EXPIRED:
+		     /* fall through, since new token is required in this case */
+		case PAM_NEW_AUTHTOK_REQD:
+		     _pam_log(LOG_WARNING, "pam_sm_acct_mgmt success but %s is set",
+		              PAM_WINBIND_NEW_AUTHTOK_REQD);
+		     _pam_log(LOG_NOTICE, "user '%s' needs new password", username);
+		     /* PAM_AUTHTOKEN_REQD does not exist, but is documented in the manpage */
+		     return PAM_NEW_AUTHTOK_REQD;
+		default:
+		     _pam_log(LOG_WARNING, "pam_sm_acct_mgmt success");
+		     _pam_log(LOG_NOTICE, "user '%s' granted access", username);
+		     return PAM_SUCCESS;
+		}
+	    }
+
 	    /* Otherwise, the authentication looked good */
 	    _pam_log(LOG_NOTICE, "user '%s' granted access", username);
 	    return PAM_SUCCESS;

Modified: branches/SAMBA_3_0/source/nsswitch/pam_winbind.h
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/pam_winbind.h	2006-01-13 10:37:14 UTC (rev 12899)
+++ branches/SAMBA_3_0/source/nsswitch/pam_winbind.h	2006-01-13 11:11:23 UTC (rev 12900)
@@ -84,6 +84,8 @@
 #define WINBIND__OLD_PASSWORD (1<<5)
 #define WINBIND_REQUIRED_MEMBERSHIP (1<<6)
 
+#define PAM_WINBIND_NEW_AUTHTOK_REQD "PAM_WINBIND_NEW_AUTHTOK_REQD"
+
 /*
  * here is the string to inform the user that the new passwords they
  * typed were not the same.



More information about the samba-cvs mailing list