static DWORD LsaPstorepInitializePlugin( OUT PLSA_PSTORE_PLUGIN_INFO PluginInfo, IN PCSTR PluginName ) { DWORD dwError = 0; int EE = 0; LSA_PSTORE_PLUGIN_INITIALIZE_FUNCTION initFunction = NULL; dwError = LwNtStatusToWin32Error(LwRtlCStringDuplicate(&PluginInfo->Name, PluginName)); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); dwError = LsaPstorepGetPluginPath(PluginInfo->Name, &PluginInfo->Path); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); dwError = LsaPstorepOpenPlugin( PluginInfo->Path, LSA_PSTORE_PLUGIN_INITIALIZE_FUNCTION_NAME, &PluginInfo->LibraryHandle, OUT_PPVOID(&initFunction)); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); dwError = initFunction(LSA_PSTORE_PLUGIN_VERSION, PluginInfo->Name, &PluginInfo->Dispatch, &PluginInfo->Context); GOTO_CLEANUP_ON_WINERROR_EE(dwError, EE); if (!PluginInfo->Dispatch) { LW_RTL_LOG_ERROR("LSA pstore plugin %s is missing a dispatch table", PluginInfo->Name); dwError = ERROR_DLL_INIT_FAILED; GOTO_CLEANUP_EE(EE); } if (!PluginInfo->Dispatch->Cleanup) { LW_RTL_LOG_ERROR("LSA pstore plugin %s is missing the Cleanup function", PluginInfo->Name); dwError = ERROR_DLL_INIT_FAILED; GOTO_CLEANUP_EE(EE); } LW_RTL_LOG_VERBOSE("Loaded LSA pstore plugin %s from %s", PluginInfo->Name, PluginInfo->Path); cleanup: if (dwError) { LsaPstorepCleanupPlugin(PluginInfo); } LSA_PSTORE_LOG_LEAVE_ERROR_EE(dwError, EE); return dwError; }
DWORD LwLdapDirectorySearchEx( HANDLE hDirectory, PCSTR pszObjectDN, int scope, PCSTR pszQuery, PSTR* ppszAttributeList, LDAPControl** ppServerControls, DWORD dwNumMaxEntries, LDAPMessage** ppMessage ) { DWORD dwError = LW_ERROR_SUCCESS; PLW_LDAP_DIRECTORY_CONTEXT pDirectory = (PLW_LDAP_DIRECTORY_CONTEXT)hDirectory; struct timeval timeout = {0}; LDAPMessage* pMessage = NULL; // Set timeout to 60 seconds to be able to deal with large group // Instead of bailing on errors timeout.tv_sec = 60; timeout.tv_usec = 0; dwError = ldap_search_ext_s( pDirectory->ld, pszObjectDN, scope, pszQuery, ppszAttributeList, 0, ppServerControls, NULL, &timeout, dwNumMaxEntries, &pMessage); if (dwError) { if (dwError == LDAP_NO_SUCH_OBJECT) { LW_RTL_LOG_VERBOSE("Caught LDAP_NO_SUCH_OBJECT Error on ldap search"); BAIL_ON_LDAP_ERROR(dwError); } if (dwError == LDAP_REFERRAL) { LW_RTL_LOG_ERROR("Caught LDAP_REFERRAL Error on ldap search"); LW_RTL_LOG_ERROR("LDAP Search Info: DN: [%s]", LW_IS_NULL_OR_EMPTY_STR(pszObjectDN) ? "<null>" : pszObjectDN); LW_RTL_LOG_ERROR("LDAP Search Info: scope: [%d]", scope); LW_RTL_LOG_ERROR("LDAP Search Info: query: [%s]", LW_IS_NULL_OR_EMPTY_STR(pszQuery) ? "<null>" : pszQuery); if (ppszAttributeList) { size_t i; for (i = 0; ppszAttributeList[i] != NULL; i++) { LW_RTL_LOG_ERROR("LDAP Search Info: attribute: [%s]", ppszAttributeList[i]); } } else { LW_RTL_LOG_ERROR("Error: LDAP Search Info: no attributes were specified"); } } BAIL_ON_LDAP_ERROR(dwError); } *ppMessage = pMessage; cleanup: return(dwError); error: *ppMessage = NULL; if (pMessage) { ldap_msgfree(pMessage); } goto cleanup; }
DWORD LwLdapDirectorySearch( HANDLE hDirectory, PCSTR pszObjectDN, int scope, PCSTR pszQuery, PSTR* ppszAttributeList, LDAPMessage** ppMessage ) { DWORD dwError = LW_ERROR_SUCCESS; PLW_LDAP_DIRECTORY_CONTEXT pDirectory = (PLW_LDAP_DIRECTORY_CONTEXT)hDirectory; struct timeval timeout = {0}; LDAPMessage* pMessage = NULL; timeout.tv_sec = 15; timeout.tv_usec = 0; dwError = ldap_search_st(pDirectory->ld, pszObjectDN, scope, pszQuery, ppszAttributeList, 0, &timeout, &pMessage); if (dwError) { if (dwError == LDAP_NO_SUCH_OBJECT) { LW_RTL_LOG_VERBOSE("Caught LDAP_NO_SUCH_OBJECT Error on ldap search"); BAIL_ON_LDAP_ERROR(dwError); } if (dwError == LDAP_REFERRAL) { LW_RTL_LOG_ERROR("Caught LDAP_REFERRAL Error on ldap search"); LW_RTL_LOG_ERROR("LDAP Search Info: DN: [%s]", LW_IS_NULL_OR_EMPTY_STR(pszObjectDN) ? "<null>" : pszObjectDN); LW_RTL_LOG_ERROR("LDAP Search Info: scope: [%d]", scope); LW_RTL_LOG_ERROR("LDAP Search Info: query: [%s]", LW_IS_NULL_OR_EMPTY_STR(pszQuery) ? "<null>" : pszQuery); if (ppszAttributeList) { size_t i; for (i = 0; ppszAttributeList[i] != NULL; i++) { LW_RTL_LOG_ERROR("LDAP Search Info: attribute: [%s]", ppszAttributeList[i]); } } else { LW_RTL_LOG_ERROR("Error: LDAP Search Info: no attributes were specified"); } } BAIL_ON_LDAP_ERROR(dwError); } *ppMessage = pMessage; cleanup: return(dwError); error: *ppMessage = NULL; if (pMessage) { ldap_msgfree(pMessage); } goto cleanup; }