Patrick Monnerat 94d50ff
diff -Naur openca-ocspd-1.7.0.orig/src/hash-db.c openca-ocspd-1.7.0.new/src/hash-db.c
Patrick Monnerat 94d50ff
--- openca-ocspd-1.7.0.orig/src/hash-db.c	2013-02-20 14:08:37.959103608 +0100
Patrick Monnerat 94d50ff
+++ openca-ocspd-1.7.0.new/src/hash-db.c	2013-02-20 16:36:05.511726770 +0100
Patrick Monnerat 94d50ff
@@ -127,6 +127,8 @@
Patrick Monnerat 94d50ff
 	LDAP	*ld = NULL;
Patrick Monnerat 94d50ff
 	int	protocol = -1;
Patrick Monnerat 94d50ff
 	int	ret = 0;
Patrick Monnerat 94d50ff
+	char * cp = NULL;
Patrick Monnerat 94d50ff
+	struct berval bv;
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
 	
Patrick Monnerat 94d50ff
         (void) signal( SIGPIPE, SIG_IGN );
Patrick Monnerat 94d50ff
@@ -144,11 +146,23 @@
Patrick Monnerat 94d50ff
 	if(ocspd_conf->verbose)
Patrick Monnerat 94d50ff
 		syslog( LOG_INFO, "INFO::Connecting to LDAP (%s)", url->addr );
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
-	if (( ld = ldap_init( url->addr, url->port )) == NULL ) {
Patrick Monnerat 94d50ff
-		syslog( LOG_ERR, "ERROR::ldap_init failure!");
Patrick Monnerat 94d50ff
+	cp = malloc(strlen(url->addr) + 14);
Patrick Monnerat 94d50ff
+
Patrick Monnerat 94d50ff
+	if (!cp) {
Patrick Monnerat 94d50ff
+		syslog( LOG_ERR, "ERROR::No memory for LDAP url");
Patrick Monnerat 94d50ff
+		return NULL;
Patrick Monnerat 94d50ff
+	}
Patrick Monnerat 94d50ff
+
Patrick Monnerat 94d50ff
+	sprintf(cp, "ldap://%s:%d", url->addr, url->port);
Patrick Monnerat 94d50ff
+
Patrick Monnerat 94d50ff
+	if (ldap_initialize(&ld, cp) != LDAP_SUCCESS) {
Patrick Monnerat 94d50ff
+		free(cp);
Patrick Monnerat 94d50ff
+		syslog( LOG_ERR, "ERROR::ldap_initialize failure!");
Patrick Monnerat 94d50ff
 		return NULL;
Patrick Monnerat 94d50ff
 	}
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
+	free(cp);
Patrick Monnerat 94d50ff
+
Patrick Monnerat 94d50ff
 	if(ocspd_conf->verbose)
Patrick Monnerat 94d50ff
 		syslog( LOG_INFO, "INFO::Connection established (%s)",
Patrick Monnerat 94d50ff
 			url->addr );
Patrick Monnerat 94d50ff
@@ -159,13 +173,16 @@
Patrick Monnerat 94d50ff
 						!= LDAP_OPT_SUCCESS ) {
Patrick Monnerat 94d50ff
 		syslog( LOG_ERR, "ERROR::Could not set LDAP_OPT_PROTOCOL_VERSION %d\n",
Patrick Monnerat 94d50ff
                                  protocol );
Patrick Monnerat 94d50ff
-		ldap_unbind(ld);
Patrick Monnerat 94d50ff
+		ldap_unbind_ext(ld, NULL, NULL);
Patrick Monnerat 94d50ff
 		return(NULL);
Patrick Monnerat 94d50ff
 	}
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
-	if ( (ret = ldap_bind_s( ld, url->usr, url->pwd, LDAP_AUTH_SIMPLE )) 
Patrick Monnerat 94d50ff
-			!= LDAP_SUCCESS ) {
Patrick Monnerat 94d50ff
-		syslog( LOG_ERR, "ERROR::ldap_bind_s failure (%s:%d) [%d]",
Patrick Monnerat 94d50ff
+	bv.bv_len = strlen(url->pwd);
Patrick Monnerat 94d50ff
+	bv.bv_val = url->pwd;
Patrick Monnerat 94d50ff
+
Patrick Monnerat 94d50ff
+	if ((ret = ldap_sasl_bind_s(ld, url->usr, LDAP_SASL_SIMPLE, &bv,
Patrick Monnerat 94d50ff
+	    NULL, NULL, NULL)) != LDAP_SUCCESS) {
Patrick Monnerat 94d50ff
+		syslog( LOG_ERR, "ERROR::ldap_sasl_bind_s failure (%s:%d) [%d]",
Patrick Monnerat 94d50ff
 		     url->addr, url->port, ret );
Patrick Monnerat 94d50ff
 		return NULL;
Patrick Monnerat 94d50ff
 	}
Patrick Monnerat 94d50ff
@@ -199,9 +216,8 @@
Patrick Monnerat 94d50ff
 	}
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
 	/* We search for the exact match, so LDAP_SCOPE_BASE is used here */
Patrick Monnerat 94d50ff
-	if (( rc = ldap_search_s( ld, url->dn, LDAP_SCOPE_BASE,
Patrick Monnerat 94d50ff
-			filter, attrs, 0, &res )) != LDAP_SUCCESS ) {
Patrick Monnerat 94d50ff
-
Patrick Monnerat 94d50ff
+	if ((rc = ldap_search_ext_s(ld, url->dn, LDAP_SCOPE_BASE, filter,
Patrick Monnerat 94d50ff
+	    attrs, 0, NULL, NULL, NULL, LDAP_NO_LIMIT, &res)) != LDAP_SUCCESS) {
Patrick Monnerat 94d50ff
 		if ( rc != LDAP_NO_SUCH_OBJECT ) {
Patrick Monnerat 94d50ff
 			syslog( LOG_ERR, 
Patrick Monnerat 94d50ff
 				"LDAP: [%s] object not found", url->dn );
Patrick Monnerat 94d50ff
@@ -282,7 +298,7 @@
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
 end:
Patrick Monnerat 94d50ff
 	if(res) ldap_msgfree( res );
Patrick Monnerat 94d50ff
-	if(ld) ldap_unbind( ld );
Patrick Monnerat 94d50ff
+	if(ld) ldap_unbind_ext(ld, NULL, NULL);
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
 	if( ocspd_conf->verbose )
Patrick Monnerat 94d50ff
 		syslog( LOG_INFO, "INFO::LDAP::Successfully unbinded");
Patrick Monnerat 94d50ff
@@ -300,6 +316,7 @@
Patrick Monnerat 94d50ff
 	struct berval **vals = NULL;
Patrick Monnerat 94d50ff
 	LDAPMessage *res = NULL;
Patrick Monnerat 94d50ff
 	BIO	*membio = NULL;
Patrick Monnerat 94d50ff
+	struct berval bv;
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
 	X509_CRL *crl = NULL;
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
@@ -307,11 +324,14 @@
Patrick Monnerat 94d50ff
 		return NULL;
Patrick Monnerat 94d50ff
 	}
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
-	if ( (ret = ldap_bind_s( ld, url->usr, url->pwd, LDAP_AUTH_SIMPLE )) 
Patrick Monnerat 94d50ff
-			!= LDAP_SUCCESS ) {
Patrick Monnerat 94d50ff
-		syslog( LOG_ERR, "LDAP: ldap_bind_s failure (%s:%d) [%d]",
Patrick Monnerat 94d50ff
+	bv.bv_len = strlen(url->pwd);
Patrick Monnerat 94d50ff
+	bv.bv_val = url->pwd;
Patrick Monnerat 94d50ff
+
Patrick Monnerat 94d50ff
+	if ((ret = ldap_sasl_bind_s(ld, url->usr, LDAP_SASL_SIMPLE, &bv,
Patrick Monnerat 94d50ff
+	    NULL, NULL, NULL)) != LDAP_SUCCESS) {
Patrick Monnerat 94d50ff
+		syslog( LOG_ERR, "LDAP: ldap_sasl_bind_s failure (%s:%d) [%d]",
Patrick Monnerat 94d50ff
 		     url->addr, url->port, ret );
Patrick Monnerat 94d50ff
-		// ldap_perror( ld, "ldap_bind" );
Patrick Monnerat 94d50ff
+		// ldap_perror( ld, "ldap_sasl_bind_s" );
Patrick Monnerat 94d50ff
 		return NULL;
Patrick Monnerat 94d50ff
 	}
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
@@ -319,9 +339,8 @@
Patrick Monnerat 94d50ff
 		syslog( LOG_INFO, "INFO::LDAP::Successfully binded (%s)", url->dn);
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
 	/* We search for the exact match, so LDAP_SCOPE_BASE is used here */
Patrick Monnerat 94d50ff
-	if (( rc = ldap_search_s( ld, url->dn, LDAP_SCOPE_BASE,
Patrick Monnerat 94d50ff
-			filter, attrs, 0, &res )) != LDAP_SUCCESS ) {
Patrick Monnerat 94d50ff
-
Patrick Monnerat 94d50ff
+	if ((rc = ldap_search_ext_s(ld, url->dn, LDAP_SCOPE_BASE, filter,
Patrick Monnerat 94d50ff
+	    attrs, 0, NULL, NULL, NULL, LDAP_NO_LIMIT, &res)) != LDAP_SUCCESS) {
Patrick Monnerat 94d50ff
 		if ( rc != LDAP_NO_SUCH_OBJECT ) 
Patrick Monnerat 94d50ff
 			syslog( LOG_ERR, "ERROR::LDAP::[%s] NOT found", 
Patrick Monnerat 94d50ff
 				url->dn );
Patrick Monnerat 94d50ff
@@ -372,7 +391,7 @@
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
 end:
Patrick Monnerat 94d50ff
 	if(res) ldap_msgfree( res );
Patrick Monnerat 94d50ff
-	if(ld) ldap_unbind( ld );
Patrick Monnerat 94d50ff
+	if(ld) ldap_unbind_ext(ld, NULL, NULL);
Patrick Monnerat 94d50ff
 
Patrick Monnerat 94d50ff
 	if( ocspd_conf->verbose )
Patrick Monnerat 94d50ff
 		syslog( LOG_INFO, "INFO::LDAP::Successfully unbinded" );