talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 217aed967313f7463336265120e2b23b2adccf84
parent 26c5c0fcd5cbc68eb1bf4317632e5ae8ef0eeade
Author: Colin Leroy <colin@colino.net>
Date:   Fri, 17 Dec 2010 17:50:58 +0000

2010-12-17 [colin]	3.7.8cvs8

	* configure.ac
	* src/editldap.c
	* src/ldapquery.c
	* src/ldapserver.c
	* src/ldapupdate.c
	* src/ldaputil.c
	* src/ldaputil.h
		Better error logging. Disable LDAP SSL/TLS on
		Windows, it's crashy/non-worky.

Diffstat:
MChangeLog | 12++++++++++++
MPATCHSETS | 1+
Mconfigure.ac | 3+--
Msrc/editldap.c | 2+-
Msrc/ldapquery.c | 6+++---
Msrc/ldapserver.c | 30++++++++++++++++++------------
Msrc/ldapupdate.c | 16++++++++--------
Msrc/ldaputil.c | 19++++++++++++++++++-
Msrc/ldaputil.h | 1+
9 files changed, 63 insertions(+), 27 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,15 @@ +2010-12-17 [colin] 3.7.8cvs8 + + * configure.ac + * src/editldap.c + * src/ldapquery.c + * src/ldapserver.c + * src/ldapupdate.c + * src/ldaputil.c + * src/ldaputil.h + Better error logging. Disable LDAP SSL/TLS on + Windows, it's crashy/non-worky. + 2010-12-17 [colin] 3.7.8cvs7 * src/folder.c diff --git a/PATCHSETS b/PATCHSETS @@ -4081,3 +4081,4 @@ ( cvs diff -u -r 1.28.2.44 -r 1.28.2.45 src/addrindex.c; cvs diff -u -r 1.8.2.37 -r 1.8.2.38 src/editldap.c; cvs diff -u -r 1.2.2.21 -r 1.2.2.22 src/ldapctrl.c; cvs diff -u -r 1.3.2.34 -r 1.3.2.35 src/ldapquery.c; cvs diff -u -r 1.4.2.18 -r 1.4.2.19 src/ldapserver.c; cvs diff -u -r 1.2.2.11 -r 1.2.2.12 src/ldapserver.h; cvs diff -u -r 1.1.2.24 -r 1.1.2.25 src/ldapupdate.c; cvs diff -u -r 1.1.4.16 -r 1.1.4.17 src/ldaputil.c; ) > 3.7.8cvs5.patchset ( cvs diff -u -r 1.9.2.30 -r 1.9.2.31 src/addressadd.c; cvs diff -u -r 1.60.2.138 -r 1.60.2.139 src/addressbook.c; cvs diff -u -r 1.28.2.45 -r 1.28.2.46 src/addrindex.c; cvs diff -u -r 1.3.2.35 -r 1.3.2.36 src/ldapquery.c; cvs diff -u -r 1.4.2.13 -r 1.4.2.14 src/ldapquery.h; cvs diff -u -r 1.4.2.19 -r 1.4.2.20 src/ldapserver.c; cvs diff -u -r 1.2.2.12 -r 1.2.2.13 src/ldapserver.h; cvs diff -u -r 1.1.2.25 -r 1.1.2.26 src/ldapupdate.c; cvs diff -u -r 1.1.4.17 -r 1.1.4.18 src/ldaputil.c; cvs diff -u -r 1.1.4.9 -r 1.1.4.10 src/ldaputil.h; ) > 3.7.8cvs6.patchset ( cvs diff -u -r 1.213.2.197 -r 1.213.2.198 src/folder.c; ) > 3.7.8cvs7.patchset +( cvs diff -u -r 1.654.2.4156 -r 1.654.2.4157 configure.ac; cvs diff -u -r 1.8.2.38 -r 1.8.2.39 src/editldap.c; cvs diff -u -r 1.3.2.36 -r 1.3.2.37 src/ldapquery.c; cvs diff -u -r 1.4.2.20 -r 1.4.2.21 src/ldapserver.c; cvs diff -u -r 1.1.2.26 -r 1.1.2.27 src/ldapupdate.c; cvs diff -u -r 1.1.4.18 -r 1.1.4.19 src/ldaputil.c; cvs diff -u -r 1.1.4.10 -r 1.1.4.11 src/ldaputil.h; ) > 3.7.8cvs8.patchset diff --git a/configure.ac b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=7 MICRO_VERSION=8 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=7 +EXTRA_VERSION=8 EXTRA_RELEASE= EXTRA_GTK2_VERSION= @@ -669,7 +669,6 @@ elif test x"$ac_cv_enable_ldap" = xyes -a x"$ac_cv_enable_pthread" = xno; then elif test x"$platform_win32" = xyes; then AC_MSG_RESULT(yes) AC_DEFINE(USE_LDAP, 1, Define if you want LDAP support in addressbook.) - AC_DEFINE(USE_LDAP_TLS, 1, Define if you want LDAP TLS support in addressbook.) LDAP_LIBS="-lwldap32" AC_SUBST(LDAP_LIBS) else diff --git a/src/editldap.c b/src/editldap.c @@ -243,7 +243,7 @@ static void edit_ldap_server_check( void ) { debug_print("ldap server: %s\nport: %d\nssl: %d\ntls: %d\nbindDN: %s\n", sHost, iPort, ssl, tls, sBind); if( ldaputil_test_connect( sHost, iPort, ssl, tls, iTime ) ) { /* Attempt to read base DN */ - baseDN = ldaputil_read_basedn( sHost, iPort, sBind, sPass, iTime, ssl, tls ); + baseDN = ldaputil_read_basedn(sHost, iPort, sBind, sPass, iTime, ssl, tls); if( baseDN ) { GList *node = baseDN; while( node ) { diff --git a/src/ldapquery.c b/src/ldapquery.c @@ -794,7 +794,7 @@ static gint ldapqry_search_retrieve( LdapQuery *qry ) { rc = ldap_search_ext_s( ld, ctl->baseDN, LDAP_SCOPE_SUBTREE, criteria, attribs, 0, NULL, NULL, &timeout, 0, &result ); debug_print("LDAP Error: ldap_search_st: %d\n", rc); - debug_print("LDAP Error: ldap_search_st: %s\n", ldap_err2string(rc)); + debug_print("LDAP Error: ldap_search_st: %s\n", ldaputil_get_error(ld)); ldapctl_free_attribute_array( attribs ); g_free( criteria ); criteria = NULL; @@ -816,7 +816,7 @@ static gint ldapqry_search_retrieve( LdapQuery *qry ) { } else { debug_print("LDAP Error: ldap_search_st: %d\n", rc); - debug_print("LDAP Error: ldap_search_st: %s\n", ldap_err2string(rc)); + debug_print("LDAP Error: ldap_search_st: %s\n", ldaputil_get_error(ld)); return ADDRQUERY_RETVAL(qry); } ADDRQUERY_RETVAL(qry) = LDAPRC_STOP_FLAG; @@ -1209,7 +1209,7 @@ static gint ldapqry_locate_retrieve( LdapQuery *qry ) { } ADDRQUERY_RETVAL(qry) = LDAPRC_SEARCH; if( rc != LDAP_SUCCESS ) { - debug_print("LDAP Error: ldap_search_st: %s\n", ldap_err2string(rc)); + debug_print("LDAP Error: ldap_search_st: %s\n", ldaputil_get_error(ld)); return ADDRQUERY_RETVAL(qry); } diff --git a/src/ldapserver.c b/src/ldapserver.c @@ -724,13 +724,10 @@ void ldapsrv_set_options (gint secs, LDAP *ld) #ifdef G_OS_UNIX i = LDAP_OPT_X_TLS_ALLOW; rc = ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, &i); - debug_print("cert %s\n", ldap_err2string(rc)); + debug_print("cert %s\n", ldaputil_get_error(ld)); /* can crash old libldaps... */ rc = ldap_set_option(NULL, LDAP_OPT_NETWORK_TIMEOUT, &timeout); - debug_print("tm %s\n", ldap_err2string(rc)); -#else - rc = ldap_set_option(NULL, LDAP_OPT_TIMELIMIT, &secs); - debug_print("tm %s\n", ldap_err2string(rc)); + debug_print("tm %s\n", ldaputil_get_error(ld)); #endif } @@ -756,6 +753,14 @@ LDAP *ldapsvr_connect(LdapControl *ctl) { ldap_initialize(&ld, uri); #else ld = ldap_sslinit(ctl->hostName, ctl->port, ctl->enableSSL); + if (ctl->enableSSL) { + ldap_get_option(ld,LDAP_OPT_SSL,(void*)&rc); + if ((void *)rc != LDAP_OPT_ON) { + debug_print("Enabling SSL\n"); + if (ldap_set_option(ld,LDAP_OPT_SSL,LDAP_OPT_ON) != 0) + debug_print("Failed: %s\n", ldaputil_get_error(ld)); + } + } #endif g_free(uri); @@ -763,23 +768,24 @@ LDAP *ldapsvr_connect(LdapControl *ctl) { return NULL; - debug_print("connected to LDAP host %s on port %d\n", ctl->hostName, ctl->port); + debug_print("Got handle to LDAP host %s on port %d\n", ctl->hostName, ctl->port); -#ifdef USE_LDAP_TLS - /* Handle TLS */ version = LDAP_VERSION3; rc = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version); if (rc == LDAP_OPT_SUCCESS) { ctl->version = LDAP_VERSION3; - } - + } else + g_printerr("LDAP: Error %d (%s)\n", + rc, ldaputil_get_error(ld)); +#ifdef USE_LDAP_TLS + /* Handle TLS */ if (ctl->version == LDAP_VERSION3) { if (ctl->enableTLS && !ctl->enableSSL) { rc = ldap_start_tls_s(ld, NULL, NULL); if (rc != LDAP_SUCCESS) { g_printerr("LDAP Error(tls): ldap_simple_bind_s: %s\n", - ldap_err2string(rc)); + ldaputil_get_error(ld)); return NULL; } } @@ -794,7 +800,7 @@ LDAP *ldapsvr_connect(LdapControl *ctl) { if (rc != LDAP_SUCCESS) { g_printerr("bindDN: %s, bindPass xxx\n", ctl->bindDN); g_printerr("LDAP Error(bind): ldap_simple_bind_s: %s\n", - ldap_err2string(rc)); + ldaputil_get_error(ld)); g_free(pwd); return NULL; } diff --git a/src/ldapupdate.c b/src/ldapupdate.c @@ -663,7 +663,7 @@ void ldapsvr_compare_attr(LDAP *ld, gchar *dn, gint cnt, LDAPMod *mods[]) { #endif g_printerr("ldap_compare for (%s:%s)\" failed[0x%x]: %s\n", - mods[i]->mod_type, value, rc, ldap_err2string(rc)); + mods[i]->mod_type, value, rc, ldaputil_get_error(ld)); g_free(value); } } @@ -701,7 +701,7 @@ int ldapsvr_compare_manual_attr(LDAP *ld, LdapServer *server, gchar *dn, char *a rc = ldap_search_ext_s(ld, ctl->baseDN, LDAP_SCOPE_ONELEVEL, filter, NULL, 0, NULL, NULL, NULL, 0, &res); if (rc) { - g_printerr("ldap_search for attr=%s\" failed[0x%x]: %s\n",attr, rc, ldap_err2string(rc)); + g_printerr("ldap_search for attr=%s\" failed[0x%x]: %s\n",attr, rc, ldaputil_get_error(ld)); retVal = -2; } else { @@ -796,7 +796,7 @@ int ldapsvr_deside_operation(LDAP *ld, LdapServer *server, char *dn, char *attr, #endif debug_print("ldap_compare for (%s:%s)\" error_code[0x%x]: %s\n", - attr, value, rc, ldap_err2string(rc)); + attr, value, rc, ldaputil_get_error(ld)); switch (rc) { case LDAP_COMPARE_FALSE: if (dummy) @@ -938,7 +938,7 @@ void ldapsvr_handle_other_attributes(LDAP *ld, LdapServer *server, char *dn, GHa server->retVal = LDAPRC_ALREADY_EXIST; break; default: - g_printerr("ldap_modify for dn=%s\" failed[0x%x]: %s\n", dn, rc, ldap_err2string(rc)); + g_printerr("ldap_modify for dn=%s\" failed[0x%x]: %s\n", dn, rc, ldaputil_get_error(ld)); if (rc == 0x8) server->retVal = LDAPRC_STRONG_AUTH; else @@ -1081,7 +1081,7 @@ void ldapsvr_add_contact(LdapServer *server, GHashTable *contact) { break; default: g_printerr("ldap_modify for dn=%s\" failed[0x%x]: %s\n", - base_dn, rc, ldap_err2string(rc)); + base_dn, rc, ldaputil_get_error(ld)); if (rc == 0x8) server->retVal = LDAPRC_STRONG_AUTH; else @@ -1154,7 +1154,7 @@ void ldapsvr_update_contact(LdapServer *server, GHashTable *contact) { else { g_printerr("Current dn: %s\n", dn); g_printerr("new dn: %s\n", newRdn); - g_printerr("LDAP Error(ldap_modrdn2_s) failed[0x%x]: %s\n", rc, ldap_err2string(rc)); + g_printerr("LDAP Error(ldap_modrdn2_s) failed[0x%x]: %s\n", rc, ldaputil_get_error(ld)); g_free(newRdn); clean_up(ld, server, contact); return; @@ -1310,7 +1310,7 @@ void ldapsvr_update_contact(LdapServer *server, GHashTable *contact) { rc = ldap_modify_ext_s(ld, dn, mods, NULL, NULL); if (rc) { g_printerr("ldap_modify for dn=%s\" failed[0x%x]: %s\n", - dn, rc, ldap_err2string(rc)); + dn, rc, ldaputil_get_error(ld)); server->retVal = LDAPRC_NAMING_VIOLATION; } if (mail) @@ -1351,7 +1351,7 @@ void ldapsvr_delete_contact(LdapServer *server, GHashTable *contact) { rc = ldap_delete_ext_s(ld, dn, NULL, NULL); if (rc) { g_printerr("ldap_modify for dn=%s\" failed[0x%x]: %s\n", - dn, rc, ldap_err2string(rc)); + dn, rc, ldaputil_get_error(ld)); server->retVal = LDAPRC_NODN; } clean_up(ld, server, contact); diff --git a/src/ldaputil.c b/src/ldaputil.c @@ -28,6 +28,7 @@ #ifdef USE_LDAP #include <glib.h> +#include <glib/gi18n.h> #include <string.h> #include <sys/time.h> #include <errno.h> @@ -105,7 +106,9 @@ static GList *ldaputil_test_v3( LDAP *ld, gint tov, gint *errcode ) { } ber = NULL; } - } + } else + debug_print("LDAP: Error %d (%s)\n", rc, ldaputil_get_error(ld)); + if (errcode) *errcode = rc; if (result) @@ -310,6 +313,20 @@ gboolean ldaputil_test_ldap_lib( void ) { return TRUE; } +const gchar *ldaputil_get_error(LDAP *ld) +{ + gchar *ld_error; + static gchar error[512]; + + ldap_get_option( ld, LDAP_OPT_ERROR_STRING, &ld_error); + if (ld_error != NULL) + strncpy2(error, ld_error, sizeof(error)); + else + strncpy2(error, _("Unknown error"), sizeof(error)); + ldap_memfree(ld_error); + + return error; +} #endif /* USE_LDAP */ /* diff --git a/src/ldaputil.h b/src/ldaputil.h @@ -45,6 +45,7 @@ GList *ldaputil_read_basedn ( const gchar *host, const gint port, gboolean ldaputil_test_connect ( const gchar *host, const gint port, int ssl, int tls, int secs); gboolean ldaputil_test_ldap_lib ( void ); int claws_ldap_simple_bind_s( LDAP *ld, LDAP_CONST char *dn, LDAP_CONST char *passwd ); +const gchar *ldaputil_get_error(LDAP *ld); #endif /* USE_LDAP */