mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-06 10:46:21 +08:00
345 lines
9.4 KiB
C++
345 lines
9.4 KiB
C++
// $OpenLDAP$
|
|
/*
|
|
* Copyright 2000, OpenLDAP Foundation, All Rights Reserved.
|
|
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
|
|
*/
|
|
|
|
#include "debug.h"
|
|
|
|
#include "LDAPResult.h"
|
|
#include "LDAPException.h"
|
|
#include "LDAPUrlList.h"
|
|
|
|
#include "LDAPConnection.h"
|
|
const int LDAPConnection::SEARCH_BASE = LDAPAsynConnection::SEARCH_BASE;
|
|
const int LDAPConnection::SEARCH_ONE = LDAPAsynConnection::SEARCH_ONE;
|
|
const int LDAPConnection::SEARCH_SUB = LDAPAsynConnection::SEARCH_SUB;
|
|
|
|
using namespace std;
|
|
|
|
LDAPConnection::LDAPConnection(const string& hostname, int port,
|
|
LDAPConstraints* cons) :
|
|
LDAPAsynConnection(hostname, port, cons){
|
|
}
|
|
|
|
LDAPConnection::~LDAPConnection(){
|
|
}
|
|
|
|
void LDAPConnection::start_tls(){
|
|
LDAPAsynConnection::start_tls();
|
|
}
|
|
|
|
void LDAPConnection::bind(const string& dn, const string& passwd,
|
|
LDAPConstraints* cons){
|
|
DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::bind" << endl);
|
|
LDAPMessageQueue* msg=0;
|
|
LDAPResult* res=0;
|
|
try{
|
|
msg = LDAPAsynConnection::bind(dn,passwd,cons);
|
|
res = (LDAPResult*)msg->getNext();
|
|
}catch(LDAPException e){
|
|
delete msg;
|
|
delete res;
|
|
throw;
|
|
}
|
|
int resCode=res->getResultCode();
|
|
if(resCode != LDAPResult::SUCCESS) {
|
|
if(resCode == LDAPResult::REFERRAL){
|
|
LDAPUrlList urls = res->getReferralUrls();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPReferralException(urls);
|
|
}else{
|
|
string srvMsg = res->getErrMsg();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPException(resCode, srvMsg);
|
|
}
|
|
}
|
|
delete res;
|
|
delete msg; // memcheck
|
|
}
|
|
|
|
void LDAPConnection::unbind(){
|
|
LDAPAsynConnection::unbind();
|
|
}
|
|
|
|
bool LDAPConnection::compare(const string& dn, const LDAPAttribute& attr,
|
|
LDAPConstraints* cons){
|
|
DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::compare" << endl);
|
|
LDAPMessageQueue* msg=0;
|
|
LDAPResult* res=0;
|
|
try{
|
|
msg = LDAPAsynConnection::compare(dn,attr,cons);
|
|
res = (LDAPResult*)msg->getNext();
|
|
}catch(LDAPException e){
|
|
delete msg;
|
|
delete res;
|
|
throw;
|
|
}
|
|
int resCode=res->getResultCode();
|
|
switch (resCode){
|
|
case LDAPResult::COMPARE_TRUE :
|
|
delete res;
|
|
delete msg;
|
|
return true;
|
|
break;
|
|
case LDAPResult::COMPARE_FALSE :
|
|
delete res;
|
|
delete msg;
|
|
return false;
|
|
break;
|
|
case LDAPResult::REFERRAL :
|
|
{
|
|
LDAPUrlList urls = res->getReferralUrls();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPReferralException(urls);
|
|
}
|
|
break;
|
|
default :
|
|
string srvMsg = res->getErrMsg();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPException(resCode, srvMsg);
|
|
}
|
|
}
|
|
|
|
void LDAPConnection::del(const string& dn, const LDAPConstraints* cons){
|
|
DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::del" << endl);
|
|
LDAPMessageQueue* msg=0;
|
|
LDAPResult* res=0;
|
|
try{
|
|
msg = LDAPAsynConnection::del(dn,cons);
|
|
res = (LDAPResult*)msg->getNext();
|
|
}catch(LDAPException e){
|
|
delete msg;
|
|
delete res;
|
|
throw;
|
|
}
|
|
int resCode=res->getResultCode();
|
|
switch (resCode){
|
|
case LDAPResult::SUCCESS :
|
|
delete res;
|
|
delete msg;
|
|
break;
|
|
case LDAPResult::REFERRAL :
|
|
{
|
|
LDAPUrlList urls = res->getReferralUrls();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPReferralException(urls);
|
|
}
|
|
break;
|
|
default :
|
|
string srvMsg = res->getErrMsg();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPException(resCode, srvMsg);
|
|
}
|
|
|
|
}
|
|
|
|
void LDAPConnection::add(const LDAPEntry* le, const LDAPConstraints* cons){
|
|
DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::add" << endl);
|
|
LDAPMessageQueue* msg=0;
|
|
LDAPResult* res=0;
|
|
try{
|
|
msg = LDAPAsynConnection::add(le,cons);
|
|
res = (LDAPResult*)msg->getNext();
|
|
}catch(LDAPException e){
|
|
delete msg;
|
|
delete res;
|
|
throw;
|
|
}
|
|
int resCode=res->getResultCode();
|
|
switch (resCode){
|
|
case LDAPResult::SUCCESS :
|
|
delete res;
|
|
delete msg;
|
|
break;
|
|
case LDAPResult::REFERRAL :
|
|
{
|
|
LDAPUrlList urls = res->getReferralUrls();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPReferralException(urls);
|
|
}
|
|
break;
|
|
default :
|
|
string srvMsg = res->getErrMsg();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPException(resCode, srvMsg);
|
|
}
|
|
}
|
|
|
|
void LDAPConnection::modify(const string& dn, const LDAPModList* mods,
|
|
const LDAPConstraints* cons){
|
|
DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::modify" << endl);
|
|
LDAPMessageQueue* msg=0;
|
|
LDAPResult* res=0;
|
|
try{
|
|
msg = LDAPAsynConnection::modify(dn,mods,cons);
|
|
res = (LDAPResult*)msg->getNext();
|
|
}catch(LDAPException e){
|
|
delete msg;
|
|
delete res;
|
|
throw;
|
|
}
|
|
int resCode=res->getResultCode();
|
|
switch (resCode){
|
|
case LDAPResult::SUCCESS :
|
|
delete res;
|
|
delete msg;
|
|
break;
|
|
case LDAPResult::REFERRAL :
|
|
{
|
|
LDAPUrlList urls = res->getReferralUrls();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPReferralException(urls);
|
|
}
|
|
break;
|
|
default :
|
|
string srvMsg = res->getErrMsg();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPException(resCode, srvMsg);
|
|
}
|
|
|
|
}
|
|
|
|
void LDAPConnection::rename(const string& dn, const string& newRDN,
|
|
bool delOldRDN, const string& newParentDN,
|
|
const LDAPConstraints* cons){
|
|
DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::rename" << endl);
|
|
LDAPMessageQueue* msg=0;
|
|
LDAPResult* res=0;
|
|
try{
|
|
msg = LDAPAsynConnection::rename(dn,newRDN,delOldRDN, newParentDN,
|
|
cons);
|
|
res = (LDAPResult*)msg->getNext();
|
|
}catch(LDAPException e){
|
|
delete msg;
|
|
delete res;
|
|
throw;
|
|
}
|
|
int resCode=res->getResultCode();
|
|
switch (resCode){
|
|
case LDAPResult::SUCCESS :
|
|
delete res;
|
|
delete msg;
|
|
break;
|
|
case LDAPResult::REFERRAL :
|
|
{
|
|
LDAPUrlList urls = res->getReferralUrls();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPReferralException(urls);
|
|
}
|
|
break;
|
|
default :
|
|
string srvMsg = res->getErrMsg();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPException(resCode, srvMsg);
|
|
}
|
|
}
|
|
|
|
LDAPSearchResults* LDAPConnection::search(const string& base, int scope,
|
|
const string& filter, const StringList& attrs, bool attrsOnly,
|
|
const LDAPConstraints* cons){
|
|
DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::search" << endl);
|
|
LDAPMessageQueue* msgq=0;
|
|
LDAPResult* res=0;
|
|
LDAPSearchResults* results= 0;
|
|
|
|
try{
|
|
results = new LDAPSearchResults();
|
|
msgq = LDAPAsynConnection::search(base,scope, filter, attrs, attrsOnly,
|
|
cons);
|
|
res = results->readMessageQueue(msgq);
|
|
}catch(LDAPException e){
|
|
delete results; // memcheck
|
|
delete msgq;
|
|
throw;
|
|
}
|
|
if(res != 0){
|
|
int resCode=res->getResultCode();
|
|
switch (resCode){
|
|
case LDAPResult::SUCCESS :
|
|
delete res;
|
|
delete msgq;
|
|
return results;
|
|
break;
|
|
case LDAPResult::REFERRAL :
|
|
{
|
|
LDAPUrlList urls = res->getReferralUrls();
|
|
delete results; // memcheck
|
|
delete res;
|
|
delete msgq;
|
|
throw LDAPReferralException(urls);
|
|
}
|
|
break;
|
|
default :
|
|
string srvMsg = res->getErrMsg();
|
|
delete results; // memcheck
|
|
delete res;
|
|
delete msgq;
|
|
throw LDAPException(resCode, srvMsg);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
LDAPExtResult* LDAPConnection::extOperation(const string& oid,
|
|
const string& value, const LDAPConstraints *cons){
|
|
DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::extOperation" << endl);
|
|
LDAPMessageQueue* msg=0;
|
|
LDAPExtResult* res=0;
|
|
try{
|
|
msg = LDAPAsynConnection::extOperation(oid,value,cons);
|
|
res = (LDAPExtResult*)msg->getNext();
|
|
}catch(LDAPException e){
|
|
delete msg;
|
|
delete res;
|
|
throw;
|
|
}
|
|
int resCode=res->getResultCode();
|
|
switch (resCode){
|
|
case LDAPResult::SUCCESS :
|
|
delete msg;
|
|
return res;
|
|
case LDAPResult::REFERRAL :
|
|
{
|
|
LDAPUrlList urls = res->getReferralUrls();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPReferralException(urls);
|
|
}
|
|
break;
|
|
default :
|
|
string srvMsg = res->getErrMsg();
|
|
delete res;
|
|
delete msg;
|
|
throw LDAPException(resCode, srvMsg);
|
|
}
|
|
}
|
|
|
|
const string& LDAPConnection::getHost() const{
|
|
return LDAPAsynConnection::getHost();
|
|
}
|
|
|
|
int LDAPConnection::getPort() const{
|
|
return LDAPAsynConnection::getPort();
|
|
}
|
|
|
|
void LDAPConnection::setConstraints(LDAPConstraints* cons){
|
|
LDAPAsynConnection::setConstraints(cons);
|
|
}
|
|
|
|
const LDAPConstraints* LDAPConnection::getConstraints() const{
|
|
return LDAPAsynConnection::getConstraints();
|
|
}
|