[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: LDAP / passwd



jerome_reinert@pc-kurios.de wrote:
Das stimmt, ich kann als root unbeachtet der cracklib die passwörter
ändern.
Der meckert zwar beim erstellen rum wenn er seine wörterbuchdateien
durchforstet, macht es aber dann trotzdem. ich habe Dir mal die
geschehnisse mit strace verfolgt und den relevanten Teil angehangen.

Bei mir gehts auch nur als root. Das kann ich tolerieren.

versionsnummer vom slapd = 2.1.30-3

Wie bei mir. Zwischen unseren configs bestehen keine interessanten
Unterschiede. Echt seltsam der Fehler. Ich gehe mal davon aus dass
es ein Konfigurationsproblem ist und mache keinen Bugreport auf.
Fürs Archiv hänge ich den patch an. Vielleicht Liegt es ja doch am
Modul...

Der patch ist gegen libpam-ldap-169-2 aus sarge

--
Mit freundlichen Gruessen
Bjoern Schmidt

--- /tmp/libpam-ldap-169/pam_ldap.c	2004-12-01 08:52:08.000000000 +0100
+++ libpam-ldap-169/pam_ldap.c	2004-12-01 10:07:40.000000000 +0100
@@ -2604,9 +2604,10 @@
 #ifdef LDAP_EXOP_MODIFY_PASSWD
   /* for OpenLDAP password change extended operation */
   BerElement *ber;
-  struct berval *bv;
-  char *retoid;
-  struct berval *retdata;
+  struct berval bv = {0, NULL};
+  int id, code = LDAP_OTHER;
+  int rc_pr = 0;
+  LDAPMessage *res;
 #endif /* LDAP_EXOP_MODIFY_PASSWD */
 
   if (session->info == NULL)
@@ -2783,41 +2784,43 @@
       ber_printf (ber, "ts", LDAP_TAG_EXOP_MODIFY_PASSWD_ID,
 		  session->info->userdn);
       /* this doesn't appear to be necessary anymore */
-      ber_printf (ber, "ts", LDAP_TAG_EXOP_MODIFY_PASSWD_OLD, old_password);
+//    ber_printf (ber, "ts", LDAP_TAG_EXOP_MODIFY_PASSWD_OLD, old_password);
       ber_printf (ber, "ts", LDAP_TAG_EXOP_MODIFY_PASSWD_NEW, new_password);
       ber_printf (ber, "N}");
 
-      rc = ber_flatten (ber, &bv);
+      rc = ber_flatten2(ber, &bv, 0 );
       if (rc < 0)
 	{
 	  ber_free (ber, 1);
 	  return PAM_BUF_ERR;
 	}
 
-      ber_free (ber, 1);
+	if (ldap_bind_s( session->ld, session->info->userdn,  
+            session->info->userpw, LDAP_AUTH_SIMPLE ) != LDAP_SUCCESS )
+	{
+		ldap_perror(session->ld, "ldap_bind" );
+	}
 
-      if (ldap_bind_s( session->ld, session->info->userdn,  
-                  session->info->userpw, LDAP_AUTH_SIMPLE ) != LDAP_SUCCESS )
-                    {
-                        ldap_perror(session->ld, "ldap_bind" );
-                          }
-
-      rc =
-	ldap_extended_operation_s (session->ld, LDAP_EXOP_MODIFY_PASSWD, bv,
-				   NULL, NULL, &retoid, &retdata);
-      ber_bvfree (bv);
+	rc = ldap_extended_operation (session->ld, LDAP_EXOP_MODIFY_PASSWD,
+	                              &bv, NULL, NULL, &id);
 
-      if (rc != LDAP_SUCCESS)
+	rc_pr = ldap_result(session->ld, LDAP_RES_ANY, LDAP_MSG_ALL, NULL, &res );
+        if ( rc_pr < 0 ) 
+        {
+                ldap_perror( session->ld, "ldap_result error" );
+        }
+
+	rc_pr = ldap_parse_result(session->ld, res, &code, NULL, NULL, NULL, NULL, 1 );
+	rc = code;
+
+	if( rc_pr != LDAP_SUCCESS ) 
 	{
-	  syslog (LOG_ERR, "pam_ldap: ldap_extended_operation_s %s",
-		  ldap_err2string (rc));
-	  rc = PAM_PERM_DENIED;
+		ldap_perror(session->ld, "ldap_parse_result error");
 	}
-      else
+
+	if( code != LDAP_SUCCESS ) 
 	{
-	  ber_bvfree (retdata);
-	  ber_memfree (retoid);
-	  rc = PAM_SUCCESS;
+		printf( "Result: %s (%d)\n", ldap_err2string( code ), code );
 	}
 #else
       rc = PAM_SERVICE_ERR;
@@ -3420,6 +3423,8 @@
   else
     {
       int errcode;
+      errcode = ldap_bind_s( session->ld, session->conf->binddn,
+      			     session->conf->bindpw, LDAP_AUTH_SIMPLE );
 
       /* update shadowLastChange; may fail if not shadowAccount */
       snprintf (buf, sizeof buf, "%ld", time (NULL) / (60 * 60 * 24));

Reply to: