diff options
Diffstat (limited to 'extensions/source/config/ldap/ldapaccess.cxx')
-rw-r--r-- | extensions/source/config/ldap/ldapaccess.cxx | 89 |
1 files changed, 70 insertions, 19 deletions
diff --git a/extensions/source/config/ldap/ldapaccess.cxx b/extensions/source/config/ldap/ldapaccess.cxx index 7c4a690cd16f..a850a441c5fe 100644 --- a/extensions/source/config/ldap/ldapaccess.cxx +++ b/extensions/source/config/ldap/ldapaccess.cxx @@ -40,14 +40,30 @@ namespace extensions { namespace config { namespace ldap { - +oslModule LdapConnection::s_Ldap_Module = NULL; +t_ldap_unbind_s LdapConnection::s_p_unbind_s = NULL; +t_ldap_simple_bind_s LdapConnection::s_p_simple_bind_s = NULL; +t_ldap_set_option LdapConnection::s_p_set_option = NULL; +t_ldap_err2string LdapConnection::s_p_err2string = NULL; +t_ldap_init LdapConnection::s_p_init = NULL; +t_ldap_msgfree LdapConnection::s_p_msgfree = NULL; +t_ldap_get_dn LdapConnection::s_p_get_dn = NULL; +t_ldap_first_entry LdapConnection::s_p_first_entry = NULL; +t_ldap_search_s LdapConnection::s_p_search_s = NULL; +t_ldap_value_free LdapConnection::s_p_value_free = NULL; +t_ldap_get_values LdapConnection::s_p_get_values = NULL; +t_ldap_memfree LdapConnection::s_p_memfree = NULL; //------------------------------------------------------------------------------ typedef int LdapErrCode; //------------------------------------------------------------------------------ struct LdapMessageHolder { LdapMessageHolder() : msg(0) {} - ~LdapMessageHolder() { if (msg) ldap_msgfree(msg); } + ~LdapMessageHolder() + { + if (msg) + (*LdapConnection::s_p_msgfree)(msg); + } LDAPMessage * msg; @@ -66,7 +82,7 @@ void LdapConnection::disconnect() { if (mConnection != NULL) { - ldap_unbind_s(mConnection) ; + (*s_p_unbind_s)(mConnection) ; mConnection = NULL; } } @@ -85,11 +101,11 @@ static void checkLdapReturnCode(const sal_Char *aOperation, { message.appendAscii(aOperation).appendAscii(": ") ; } - message.appendAscii(ldap_err2string(aRetCode)).appendAscii(" (") ; + message.appendAscii((*LdapConnection::s_p_err2string)(aRetCode)).appendAscii(" (") ; sal_Char *stub = NULL ; #ifndef LDAP_OPT_SIZELIMIT // for use with OpenLDAP - ldap_get_lderrno(aConnection, NULL, &stub) ; + (*s_p_get_lderrno)(aConnection, NULL, &stub) ; #endif if (stub != NULL) { @@ -99,7 +115,7 @@ static void checkLdapReturnCode(const sal_Char *aOperation, // string itself. At any rate freeing it seems to // cause some undue problems at least on Windows. // This call is thus disabled for the moment. - //ldap_memfree(stub) ; + //(*s_p_memfree)(stub) ; } else { message.appendAscii(kNoSpecificMessage) ; } message.appendAscii(")") ; @@ -126,20 +142,20 @@ void LdapConnection::connectSimple() initConnection() ; // Set Protocol V3 int version = LDAP_VERSION3; - ldap_set_option(mConnection, + (*s_p_set_option)(mConnection, LDAP_OPT_PROTOCOL_VERSION, &version); #ifdef LDAP_X_OPT_CONNECT_TIMEOUT // OpenLDAP doesn't support this and the func /* timeout is specified in milliseconds -> 4 seconds*/ int timeout = 4000; - ldap_set_option( mConnection, + (*s_p_set_option)( mConnection, LDAP_X_OPT_CONNECT_TIMEOUT, &timeout ); #endif // Do the bind - LdapErrCode retCode = ldap_simple_bind_s(mConnection, + LdapErrCode retCode = (*s_p_simple_bind_s)(mConnection, mLdapDefinition.mAnonUser , mLdapDefinition.mAnonCredentials) ; @@ -160,7 +176,7 @@ void LdapConnection::initConnection() if (mLdapDefinition.mPort == 0) mLdapDefinition.mPort = LDAP_PORT; - mConnection = ldap_init(mLdapDefinition.mServer, + mConnection = (*s_p_init)(mLdapDefinition.mServer, mLdapDefinition.mPort) ; if (mConnection == NULL) { @@ -186,7 +202,7 @@ void LdapConnection::initConnection() rtl::OString aUserDn =findUserDn( rtl::OUStringToOString(aUser, RTL_TEXTENCODING_ASCII_US)); LdapMessageHolder result; - LdapErrCode retCode = ldap_search_s(mConnection, + LdapErrCode retCode = (*s_p_search_s)(mConnection, aUserDn, LDAP_SCOPE_BASE, "(objectclass=*)", @@ -228,21 +244,21 @@ void LdapConnection::initConnection() sal_Char * attributes [2]; attributes[0]= const_cast<sal_Char *>(LDAP_NO_ATTRS); attributes[1]= NULL; - LdapErrCode retCode = ldap_search_s(mConnection, + LdapErrCode retCode = (*s_p_search_s)(mConnection, mLdapDefinition.mBaseDN, LDAP_SCOPE_SUBTREE, filter.makeStringAndClear(), attributes, 0, &result.msg) ; checkLdapReturnCode("FindUserDn", retCode,mConnection) ; rtl::OString userDn ; - LDAPMessage *entry = ldap_first_entry(mConnection, result.msg) ; + LDAPMessage *entry = (*s_p_first_entry)(mConnection, result.msg) ; if (entry != NULL) { - sal_Char *charsDn = ldap_get_dn(mConnection, entry) ; + sal_Char *charsDn = (*s_p_get_dn)(mConnection, entry) ; userDn = charsDn ; - ldap_memfree(charsDn) ; + (*s_p_memfree)(charsDn) ; } else { @@ -264,7 +280,7 @@ rtl::OString LdapConnection::getSingleAttribute( attributes [0] = aAttribute ; attributes [1] = 0 ; LdapMessageHolder result ; - LdapErrCode retCode = ldap_search_s(mConnection, + LdapErrCode retCode = (*s_p_search_s)(mConnection, aDn, LDAP_SCOPE_BASE, "(objectclass=*)", @@ -277,22 +293,57 @@ rtl::OString LdapConnection::getSingleAttribute( return value ; } checkLdapReturnCode("GetSingleAttribute", retCode, mConnection) ; - LDAPMessage *entry = ldap_first_entry(mConnection, result.msg) ; + LDAPMessage *entry = (*s_p_first_entry)(mConnection, result.msg) ; if (entry != NULL) { - sal_Char **values = ldap_get_values(mConnection, entry, + sal_Char **values = (*s_p_get_values)(mConnection, entry, aAttribute) ; if (values != NULL) { if (*values != NULL) { value = *values ; } - ldap_value_free(values) ; + (*s_p_value_free)(values) ; } } return value ; } +extern "C" { static void SAL_CALL thisModule() {} } +void LdapConnection::loadModule() +{ + if ( !s_Ldap_Module ) + { +#if defined(WIN) || defined(WNT) + const ::rtl::OUString sModuleName(RTL_CONSTASCII_USTRINGPARAM("nsldap32v50.dll")); +#else +#ifdef WITH_OPENLDAP + const ::rtl::OUString sModuleName(RTL_CONSTASCII_USTRINGPARAM("libldap.so")); +#else + const ::rtl::OUString sModuleName(RTL_CONSTASCII_USTRINGPARAM("libldap50.so")); +#endif +#endif + + // load the dbtools library + s_Ldap_Module = osl_loadModuleRelative(&thisModule, sModuleName.pData, 0); + if ( s_Ldap_Module != NULL ) + { + s_p_unbind_s = (t_ldap_unbind_s)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_unbind_s").pData)); + s_p_simple_bind_s = (t_ldap_simple_bind_s)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_simple_bind_s").pData)); + s_p_set_option = (t_ldap_set_option)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_set_option").pData)); + s_p_err2string = (t_ldap_err2string)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_err2string").pData)); + s_p_init = (t_ldap_init)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_init").pData)); + s_p_msgfree = (t_ldap_msgfree)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_msgfree").pData)); + s_p_get_dn = (t_ldap_get_dn)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_get_dn").pData)); + s_p_first_entry = (t_ldap_first_entry)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_first_entry").pData)); + s_p_search_s = (t_ldap_search_s)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_search_s").pData)); + s_p_value_free = (t_ldap_value_free)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_value_free").pData)); + s_p_get_values = (t_ldap_get_values)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_get_values").pData)); + s_p_memfree = (t_ldap_memfree)(osl_getFunctionSymbol(s_Ldap_Module, ::rtl::OUString::createFromAscii("ldap_memfree").pData)); + } + } +} + //------------------------------------------------------------------------------ } } } // extensions.config.ldap |