[dovecot-cvs] dovecot/src/auth db-ldap.c,1.11,1.12 db-ldap.h,1.8,1.9 passdb-ldap.c,1.6,1.7 userdb-ldap.c,1.9,1.10

cras at procontrol.fi cras at procontrol.fi
Thu Feb 20 01:55:42 EET 2003


Update of /home/cvs/dovecot/src/auth
In directory danu:/tmp/cvs-serv27451/auth

Modified Files:
	db-ldap.c db-ldap.h passdb-ldap.c userdb-ldap.c 
Log Message:
minor ldap fixes



Index: db-ldap.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/db-ldap.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- db-ldap.c	18 Feb 2003 19:11:26 -0000	1.11
+++ db-ldap.c	19 Feb 2003 23:55:40 -0000	1.12
@@ -86,7 +86,7 @@
 	i_fatal("LDAP: Unknown scope option '%s'", str);
 }
 
-static const char *get_ldap_error(struct ldap_connection *conn)
+const char *ldap_get_error(struct ldap_connection *conn)
 {
 	int ret, err;
 
@@ -116,7 +116,7 @@
 	msgid = ldap_search(conn->ld, base, scope, filter, attributes, 0);
 	if (msgid == -1) {
 		i_error("LDAP: ldap_search() failed (filter %s): %s",
-			filter, get_ldap_error(conn));
+			filter, ldap_get_error(conn));
 		request->callback(conn, request, NULL);
 		return;
 	}
@@ -132,7 +132,7 @@
 	LDAPMessage *res;
 	int ret, msgid;
 
-	for (;;) {
+	while (conn->ld != NULL) {
 		memset(&timeout, 0, sizeof(timeout));
 		ret = ldap_result(conn->ld, LDAP_RES_ANY, 1, &timeout, &res);
 #ifdef OPENLDAP_ASYNC_WORKAROUND
@@ -145,31 +145,22 @@
 		if (ret <= 0) {
 			if (ret < 0) {
 				i_error("LDAP: ldap_result() failed: %s",
-					get_ldap_error(conn));
+					ldap_get_error(conn));
 				/* reconnect */
 				ldap_conn_close(conn);
 			}
 			return;
 		}
 
-		ret = ldap_result2error(conn->ld, res, 0);
-		if (ret != LDAP_SUCCESS) {
-			i_error("LDAP: ldap_result() failed: %s",
-				ldap_err2string(ret));
+		msgid = ldap_msgid(res);
+		request = hash_lookup(conn->requests, POINTER_CAST(msgid));
+		if (request == NULL) {
+			i_error("LDAP: Reply with unknown msgid %d",
+				msgid);
 		} else {
-			msgid = ldap_msgid(res);
-
-			request = hash_lookup(conn->requests,
-					      POINTER_CAST(msgid));
-			if (request != NULL) {
-				request->callback(conn, request, res);
-				hash_remove(conn->requests,
-					    POINTER_CAST(msgid));
-				i_free(request);
-			} else {
-				i_error("LDAP: Reply with unknown msgid %d",
-					msgid);
-			}
+			hash_remove(conn->requests, POINTER_CAST(msgid));
+			request->callback(conn, request, res);
+			i_free(request);
 		}
 
 		ldap_msgfree(res);
@@ -200,14 +191,14 @@
 	/* NOTE: we use blocking connect, we couldn't do anything anyway
 	   until it's done. */
 	ret = ldap_simple_bind_s(conn->ld, conn->set.dn, conn->set.dnpass);
+	if (ret == LDAP_SERVER_DOWN) {
+		i_error("LDAP: Can't connect to server: %s", conn->set.hosts);
+		return FALSE;
+	}
 	if (ret != LDAP_SUCCESS) {
-		if (ret == LDAP_SERVER_DOWN) {
-			i_error("LDAP: Can't connect to server: %s",
-				conn->set.hosts);
-		} else {
-			i_error("LDAP: ldap_simple_bind_s() failed: %s",
-				ldap_err2string(ret));
-		}
+		i_error("LDAP: ldap_simple_bind_s() failed (dn %s): %s",
+			conn->set.dn == NULL ? "(none)" : conn->set.dn,
+			ldap_get_error(conn));
 		return FALSE;
 	}
 
@@ -227,11 +218,13 @@
 
 static void ldap_conn_close(struct ldap_connection *conn)
 {
-	if (conn->connected) {
+	hash_clear(conn->requests, FALSE);
+
+	conn->connected = FALSE;
+
+	if (conn->io != NULL) {
 		io_remove(conn->io);
 		conn->io = NULL;
-
-		conn->connected = FALSE;
 	}
 
 	if (conn->ld != NULL) {

Index: db-ldap.h
===================================================================
RCS file: /home/cvs/dovecot/src/auth/db-ldap.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- db-ldap.h	18 Feb 2003 19:11:26 -0000	1.8
+++ db-ldap.h	19 Feb 2003 23:55:40 -0000	1.9
@@ -61,5 +61,6 @@
 void db_ldap_unref(struct ldap_connection *conn);
 
 const char *ldap_escape(const char *str);
+const char *ldap_get_error(struct ldap_connection *conn);
 
 #endif

Index: passdb-ldap.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/passdb-ldap.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- passdb-ldap.c	18 Feb 2003 19:24:44 -0000	1.6
+++ passdb-ldap.c	19 Feb 2003 23:55:40 -0000	1.7
@@ -61,6 +61,15 @@
 	user = auth_request->user;
 	password = NULL;
 
+	if (res != NULL) {
+		ret = ldap_result2error(conn->ld, res, 0);
+		if (ret != LDAP_SUCCESS) {
+			i_error("ldap(%s): ldap_search() failed: %s",
+				user, ldap_err2string(ret));
+			res = NULL;
+		}
+	}
+
 	entry = res == NULL ? NULL : ldap_first_entry(conn->ld, res);
 	if (entry == NULL) {
 		if (res != NULL)

Index: userdb-ldap.c
===================================================================
RCS file: /home/cvs/dovecot/src/auth/userdb-ldap.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- userdb-ldap.c	18 Feb 2003 19:11:26 -0000	1.9
+++ userdb-ldap.c	19 Feb 2003 23:55:40 -0000	1.10
@@ -96,6 +96,15 @@
 	LDAPMessage *entry;
 	BerElement *ber;
 	char *attr, **vals;
+	int ret;
+
+	ret = ldap_result2error(conn->ld, res, 0);
+	if (ret != LDAP_SUCCESS) {
+		i_error("LDAP: ldap_search() failed: %s",
+			ldap_err2string(ret));
+		urequest->userdb_callback(NULL, request->context);
+		return;
+	}
 
 	entry = res == NULL ? NULL : ldap_first_entry(conn->ld, res);
 	if (entry == NULL) {




More information about the dovecot-cvs mailing list