+// $OpenLDAP$
/*
- * Copyright 2000, OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 2000-2012 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
#include "LDAPBindRequest.h"
#include "LDAPCompareRequest.h"
#include "LDAPDeleteRequest.h"
-#include "LDAPException.h"
#include "LDAPExtRequest.h"
#include "LDAPEntry.h"
#include "LDAPModDNRequest.h"
#include "LDAPRebind.h"
#include "LDAPRebindAuth.h"
#include "LDAPSearchRequest.h"
+#include <lber.h>
+#include <sstream>
using namespace std;
-LDAPAsynConnection::LDAPAsynConnection(const string& hostname, int port,
+LDAPAsynConnection::LDAPAsynConnection(const string& url, int port,
LDAPConstraints *cons ){
DEBUG(LDAP_DEBUG_CONSTRUCT,"LDAPAsynConnection::LDAPAsynConnection()"
<< endl);
DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER,
- " host:" << hostname << endl << " port:" << port << endl);
+ " URL:" << url << endl << " port:" << port << endl);
cur_session=0;
m_constr = 0;
- this->init(hostname, port);
+ // Is this an LDAP URI?
+ if ( url.find("://") == std::string::npos ) {
+ this->init(url, port);
+ } else {
+ this->initialize(url);
+ }
this->setConstraints(cons);
}
-LDAPAsynConnection::~LDAPAsynConnection(){
- DEBUG(LDAP_DEBUG_DESTROY,
- "LDAPAsynConnection::~LDAPAsynConnection()" << endl);
- unbind();
- //delete m_constr;
-}
+LDAPAsynConnection::~LDAPAsynConnection(){}
void LDAPAsynConnection::init(const string& hostname, int port){
DEBUG(LDAP_DEBUG_TRACE,"LDAPAsynConnection::init" << endl);
DEBUG(LDAP_DEBUG_TRACE | LDAP_DEBUG_PARAMETER,
" hostname:" << hostname << endl
<< " port:" << port << endl);
- cur_session=ldap_init(hostname.c_str(),port);
- m_host=hostname;
- m_port=port;
+
+ m_uri.setScheme("ldap");
+ m_uri.setHost(hostname);
+ m_uri.setPort(port);
+
+ const char *ldapuri = m_uri.getURLString().c_str();
+ int ret = ldap_initialize(&cur_session, ldapuri);
+ if ( ret != LDAP_SUCCESS ) {
+ throw LDAPException( ret );
+ }
int opt=3;
ldap_set_option(cur_session, LDAP_OPT_REFERRALS, LDAP_OPT_OFF);
ldap_set_option(cur_session, LDAP_OPT_PROTOCOL_VERSION, &opt);
}
-int LDAPAsynConnection::start_tls(){
- return ldap_start_tls_s( cur_session, NULL, NULL );
+void LDAPAsynConnection::initialize(const std::string& uri){
+ m_uri.setURLString(uri);
+ int ret = ldap_initialize(&cur_session, m_uri.getURLString().c_str());
+ if ( ret != LDAP_SUCCESS ) {
+ throw LDAPException( ret );
+ }
+ int opt=3;
+ ldap_set_option(cur_session, LDAP_OPT_REFERRALS, LDAP_OPT_OFF);
+ ldap_set_option(cur_session, LDAP_OPT_PROTOCOL_VERSION, &opt);
+}
+
+void LDAPAsynConnection::start_tls(){
+ int ret = ldap_start_tls_s( cur_session, NULL, NULL );
+ if( ret != LDAP_SUCCESS ) {
+ throw LDAPException(this);
+ }
}
LDAPMessageQueue* LDAPAsynConnection::bind(const string& dn,
}
}
+LDAPMessageQueue* LDAPAsynConnection::saslBind(const std::string &mech,
+ const std::string &cred,
+ const LDAPConstraints *cons)
+{
+ DEBUG(LDAP_DEBUG_TRACE, "LDAPAsynConnection::saslBind()" << endl);
+ LDAPSaslBindRequest *req = new LDAPSaslBindRequest(mech, cred, this, cons);
+ try{
+ LDAPMessageQueue *ret = req->sendRequest();
+ return ret;
+ }catch(LDAPException e){
+ delete req;
+ throw;
+ }
+
+}
+
+LDAPMessageQueue* LDAPAsynConnection::saslInteractiveBind(
+ const std::string &mech,
+ int flags,
+ SaslInteractionHandler *sih,
+ const LDAPConstraints *cons)
+{
+ DEBUG(LDAP_DEBUG_TRACE, "LDAPAsynConnection::saslInteractiveBind"
+ << std::endl);
+ LDAPSaslInteractiveBind *req =
+ new LDAPSaslInteractiveBind(mech, flags, sih, this, cons);
+ try {
+ LDAPMessageQueue *ret = req->sendRequest();
+ return ret;
+ }catch(LDAPException e){
+ delete req;
+ throw;
+ }
+}
+
LDAPMessageQueue* LDAPAsynConnection::search(const string& base,int scope,
const string& filter,
const StringList& attrs,
return m_constr;
}
+TlsOptions LDAPAsynConnection::getTlsOptions() const {
+ return TlsOptions( cur_session );
+}
+
LDAP* LDAPAsynConnection::getSessionHandle() const{
DEBUG(LDAP_DEBUG_TRACE,"LDAPAsynConnection::getSessionHandle()" << endl);
return cur_session;
const string& LDAPAsynConnection::getHost() const{
DEBUG(LDAP_DEBUG_TRACE,"LDAPAsynConnection::setHost()" << endl);
- return m_host;
+ return m_uri.getHost();
}
int LDAPAsynConnection::getPort() const{
DEBUG(LDAP_DEBUG_TRACE,"LDAPAsynConnection::getPort()" << endl);
- return m_port;
+ return m_uri.getPort();
}
LDAPAsynConnection* LDAPAsynConnection::referralConnect(
string dn = auth->getDN();
string passwd = auth->getPassword();
const char* c_dn=0;
- const char* c_passwd=0;
+ struct berval c_passwd = { 0, 0 };
if(dn != ""){
c_dn = dn.c_str();
}
if(passwd != ""){
- c_passwd = passwd.c_str();
+ c_passwd.bv_val = const_cast<char*>(passwd.c_str());
+ c_passwd.bv_len = passwd.size();
}
- err = ldap_simple_bind_s(tmpConn->getSessionHandle(), c_dn,
- c_passwd);
+ err = ldap_sasl_bind_s(tmpConn->getSessionHandle(), c_dn,
+ LDAP_SASL_SIMPLE, &c_passwd, NULL, NULL, NULL);
} else {
// Do anonymous bind
- err = ldap_simple_bind_s(tmpConn->getSessionHandle(), 0,0);
+ err = ldap_sasl_bind_s(tmpConn->getSessionHandle(),NULL,
+ LDAP_SASL_SIMPLE, NULL, NULL, NULL, NULL);
}
if( err == LDAP_SUCCESS ){
usedUrl=conUrl;