📄 pldap.cxx
字号:
errorNumber = ldap_result2error(ldapContext, result, TRUE);
return errorNumber == LDAP_SUCCESS;
}
BOOL PLDAPSession::Modify(const PString & dn, const PStringToString & attributes)
{
return Modify(dn, AttribsFromDict(attributes));
}
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 + -