📄 pldap.cxx
字号:
BOOL PLDAPSession::Modify(const PString & dn, const PStringArray & attributes){ return Modify(dn, AttribsFromArray(attributes));}BOOL PLDAPSession::Modify(const PString & dn, const PLDAPStructBase & attributes){ return Modify(dn, AttribsFromStruct(attributes));}BOOL PLDAPSession::Delete(const PString & dn){ if (!IsOpen()) return FALSE; int msgid; errorNumber = ldap_delete_ext(ldapContext, dn, NULL, NULL, &msgid); if (errorNumber != LDAP_SUCCESS) return FALSE; P_timeval tval = timeout; LDAPMessage * result = NULL; ldap_result(ldapContext, msgid, LDAP_MSG_ALL, tval, &result); if (result) errorNumber = ldap_result2error(ldapContext, result, TRUE); return errorNumber == LDAP_SUCCESS;}PLDAPSession::SearchContext::SearchContext(){ result = NULL; message = NULL; found = FALSE; completed = FALSE;}PLDAPSession::SearchContext::~SearchContext(){ if (message != NULL) ldap_msgfree(message); if (result != NULL && result != message) ldap_msgfree(result);}BOOL PLDAPSession::Search(SearchContext & context, const PString & filter, const PStringArray & attributes, const PString & baseDN, SearchScope scope){ if (!IsOpen()) return FALSE; PCharArray storage; char ** attribs = attributes.ToCharArray(&storage); PString base = baseDN; if (base.IsEmpty()) base = defaultBaseDN; static const int ScopeCode[NumSearchScope] = { LDAP_SCOPE_BASE, LDAP_SCOPE_ONELEVEL, LDAP_SCOPE_SUBTREE }; P_timeval tval = timeout; errorNumber = ldap_search_ext(ldapContext, base, ScopeCode[scope], filter, attribs, FALSE, NULL, NULL, tval, searchLimit, &context.msgid); if (errorNumber != LDAP_SUCCESS) return FALSE; if (ldap_result(ldapContext, context.msgid, LDAP_MSG_ONE, tval, &context.result) > 0) return GetNextSearchResult(context); if (context.result) errorNumber = ldap_result2error(ldapContext, context.result, TRUE); if (errorNumber == 0) errorNumber = LDAP_OTHER; return FALSE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context, PStringToString & data){ data.RemoveAll(); if (!IsOpen()) return FALSE; if (context.result == NULL || context.message == NULL || context.completed) return FALSE; // Extract the resulting data data.SetAt("dn", GetSearchResultDN(context)); BerElement * ber = NULL; char * attrib = ldap_first_attribute(ldapContext, context.message, &ber); while (attrib != NULL) { struct berval ** bvals = ldap_get_values_len(ldapContext, context.message, attrib); if (bvals != NULL) { PString value = data(attrib); for (PINDEX i = 0; bvals[i] != NULL; i++ ) { if (!value) value += multipleValueSeparator; value += PString(bvals[i]->bv_val, bvals[i]->bv_len); } ber_bvecfree(bvals); data.SetAt(attrib, value); } ldap_memfree(attrib); attrib = ldap_next_attribute(ldapContext, context.message, ber); } if (ber != NULL) ber_free (ber, 0); return TRUE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context, const PString & attribute, PString & data){ data.MakeEmpty(); if (!IsOpen()) return FALSE; if (context.result == NULL || context.message == NULL || context.completed) return FALSE; if (attribute == "dn") { data = GetSearchResultDN(context); return TRUE; } char ** values = ldap_get_values(ldapContext, context.message, attribute); if (values == NULL) return FALSE; PINDEX count = ldap_count_values(values); for (PINDEX i = 0; i < count; i++) { if (!data) data += multipleValueSeparator; data += values[i]; } ldap_value_free(values); return TRUE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context, const PString & attribute, PStringArray & data){ data.RemoveAll(); if (!IsOpen()) return FALSE; if (context.result == NULL || context.message == NULL || context.completed) return FALSE; if (attribute == "dn") { data.SetSize(1); data[0] = GetSearchResultDN(context); return TRUE; } char ** values = ldap_get_values(ldapContext, context.message, attribute); if (values == NULL) return FALSE; PINDEX count = ldap_count_values(values); data.SetSize(count); for (PINDEX i = 0; i < count; i++) data[i] = values[i]; ldap_value_free(values); return TRUE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context, const PString & attribute, PArray<PBYTEArray> & data){ data.RemoveAll(); if (!IsOpen()) return FALSE; if (attribute == "dn") { char * dn = ldap_get_dn(ldapContext, context.message); data.Append(new PBYTEArray((const BYTE *)dn, ::strlen(dn))); ldap_memfree(dn); return TRUE; } struct berval ** values = ldap_get_values_len(ldapContext, context.message, attribute); if (values == NULL) return FALSE; PINDEX count = ldap_count_values_len(values); data.SetSize(count); for (PINDEX i = 0; i < count; i++) data[i] = PBYTEArray((const BYTE *)values[i]->bv_val, values[i]->bv_len); ldap_value_free_len(values); return TRUE;}BOOL PLDAPSession::GetSearchResult(SearchContext & context, PLDAPStructBase & data){ if (!IsOpen()) return FALSE; BOOL atLeastOne = FALSE; for (PINDEX i = 0; i < data.GetNumAttributes(); i++) { PLDAPAttributeBase & attr = data.GetAttribute(i); if (attr.IsBinary()) { PArray<PBYTEArray> bin; if (GetSearchResult(context, attr.GetName(), bin)) { attr.FromBinary(bin); atLeastOne = TRUE; } } else { PString str; if (GetSearchResult(context, attr.GetName(), str)) { attr.FromString(str); atLeastOne = TRUE; } } } return atLeastOne;}PString PLDAPSession::GetSearchResultDN(SearchContext & context){ PString str; if (context.message != NULL) { char * dn = ldap_get_dn(ldapContext, context.message); if (dn != NULL) { str = dn; ldap_memfree(dn); } } return str;}BOOL PLDAPSession::GetNextSearchResult(SearchContext & context){ if (!IsOpen()) return FALSE; if (context.result == NULL || context.completed) return FALSE; P_timeval tval = timeout; do { if (context.message == NULL) context.message = ldap_first_message(ldapContext, context.result); else context.message = ldap_next_message(ldapContext, context.message); if (context.message != NULL) { switch (ldap_msgtype(context.message)) { case LDAP_RES_SEARCH_ENTRY : context.found = TRUE; errorNumber = LDAP_SUCCESS; return TRUE; case LDAP_RES_SEARCH_RESULT : errorNumber = ldap_result2error(ldapContext, context.message, FALSE); if (errorNumber == 0 && !context.found) errorNumber = LDAP_NO_RESULTS_RETURNED; context.completed = TRUE; return FALSE; } // Ignore other result message types for now ... } ldap_msgfree(context.result); } while (ldap_result(ldapContext, context.msgid, LDAP_MSG_ONE, tval, &context.result) > 0); if (context.result) errorNumber = ldap_result2error(ldapContext, context.result, FALSE); if (errorNumber == 0) errorNumber = LDAP_OTHER; return FALSE;}PList<PStringToString> PLDAPSession::Search(const PString & filter, const PStringArray & attributes, const PString & base, SearchScope scope){ PList<PStringToString> data; SearchContext context; if (!Search(context, filter, attributes, base, scope)) return data; do { PStringToString * entry = new PStringToString; if (GetSearchResult(context, *entry)) data.Append(entry); else { delete entry; break; } } while (GetNextSearchResult(context)); return data;}PString PLDAPSession::GetErrorText() const{ return ldap_err2string(errorNumber);}///////////////////////////////////////////////////////////////////////////////PLDAPAttributeBase::PLDAPAttributeBase(const char * n, void * ptr, PINDEX sz) : name(n), pointer(ptr), size(sz){ PLDAPStructBase::GetInitialiser().AddAttribute(this);}PString PLDAPAttributeBase::ToString() const{ PStringStream stream; PrintOn(stream); return stream;}void PLDAPAttributeBase::FromString(const PString & str){ PStringStream stream(str); ReadFrom(stream);}PBYTEArray PLDAPAttributeBase::ToBinary() const{ return PBYTEArray((const BYTE *)pointer, size, FALSE);}void PLDAPAttributeBase::FromBinary(const PArray<PBYTEArray> & data){ if (data.GetSize() > 0 && data[0].GetSize() == size) memcpy(pointer, data[0], size);}///////////////////////////////////////////////////////////////////////////////PMutex PLDAPStructBase::initialiserMutex;PLDAPStructBase * PLDAPStructBase::initialiserInstance;PLDAPStructBase::PLDAPStructBase(){ attributes.DisallowDeleteObjects(); initialiserMutex.Wait(); initialiserStack = initialiserInstance; initialiserInstance = this;}PLDAPStructBase & PLDAPStructBase::operator=(const PLDAPStructBase & other){ for (PINDEX i = 0; i < attributes.GetSize(); i++) attributes.GetDataAt(i).Copy(other.attributes.GetDataAt(i)); return *this;}PLDAPStructBase & PLDAPStructBase::operator=(const PStringArray & array){ for (PINDEX i = 0; i < array.GetSize(); i++) { PString str = array[i]; PINDEX equal = str.Find('='); if (equal != P_MAX_INDEX) { PLDAPAttributeBase * attr = GetAttribute(str.Left(equal)); if (attr != NULL) attr->FromString(str.Mid(equal+1)); } } return *this;}PLDAPStructBase & PLDAPStructBase::operator=(const PStringToString & dict){ for (PINDEX i = 0; i < dict.GetSize(); i++) { PLDAPAttributeBase * attr = GetAttribute(dict.GetKeyAt(i)); if (attr != NULL) attr->FromString(dict.GetDataAt(i)); } return *this;}void PLDAPStructBase::PrintOn(ostream & strm) const{ strm << attributes << '\n';}void PLDAPStructBase::AddAttribute(PLDAPAttributeBase * attr){ attributes.SetAt(attr->GetName(), attr);}void PLDAPStructBase::EndConstructor(){ initialiserInstance = initialiserStack; initialiserMutex.Signal();}#endif // P_LDAP// End of file ////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -