]> git.sur5r.net Git - openldap/blobdiff - contrib/ldapc++/src/LDAPConnection.cpp
Merge remote branch 'origin/mdb.master'
[openldap] / contrib / ldapc++ / src / LDAPConnection.cpp
index 7baa9333a77162f02809b36adfd23f111824e4d1..b0ba527a25a4354d7128e26e48be9c76721ce96e 100644 (file)
@@ -1,5 +1,6 @@
+// $OpenLDAP$
 /*
- * Copyright 2000, OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 2000-2011 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
@@ -7,7 +8,6 @@
 
 #include "LDAPResult.h"
 #include "LDAPException.h"
-#include "LDAPReferralException.h"
 #include "LDAPUrlList.h"
 
 #include "LDAPConnection.h"
@@ -15,6 +15,8 @@ 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){
@@ -22,6 +24,10 @@ LDAPConnection::LDAPConnection(const string& hostname, int port,
 
 LDAPConnection::~LDAPConnection(){
 }
+
+void LDAPConnection::start_tls(){
+    LDAPAsynConnection::start_tls();
+}
    
 void LDAPConnection::bind(const string& dn, const string& passwd,
         LDAPConstraints* cons){
@@ -44,12 +50,48 @@ void LDAPConnection::bind(const string& dn, const string& passwd,
             delete msg;
             throw LDAPReferralException(urls);
         }else{
+            string srvMsg = res->getErrMsg();
             delete res;
             delete msg;
-            throw LDAPException(resCode);
+            throw LDAPException(resCode, srvMsg);
         }
     }
     delete res;
+    delete msg;   // memcheck
+}
+
+void LDAPConnection::saslInteractiveBind( const std::string &mech,
+                        int flags,
+                        SaslInteractionHandler *sih,
+                        const LDAPConstraints *cons)
+{
+    DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::bind" << endl);
+    LDAPMessageQueue* msg=0;
+    LDAPResult* res=0;
+    try{
+        msg = LDAPAsynConnection::saslInteractiveBind(mech, flags, sih, 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;
 }
 
 void LDAPConnection::unbind(){
@@ -90,9 +132,10 @@ bool LDAPConnection::compare(const string& dn, const LDAPAttribute& attr,
         }
         break;
         default :
+            string srvMsg = res->getErrMsg();
             delete res;
             delete msg;
-            throw LDAPException(resCode);
+            throw LDAPException(resCode, srvMsg);
     }
 }
 
@@ -123,14 +166,15 @@ void LDAPConnection::del(const string& dn, const LDAPConstraints* cons){
         }
         break;
         default :
+            string srvMsg = res->getErrMsg();
             delete res;
             delete msg;
-            throw LDAPException(resCode);
+            throw LDAPException(resCode, srvMsg);
     }
 
 }
 
-void LDAPConnection::add(const LDAPEntry* le, const LDAPConstraints* cons=0){
+void LDAPConnection::add(const LDAPEntry* le, const LDAPConstraints* cons){
     DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::add" << endl);
     LDAPMessageQueue* msg=0;
     LDAPResult* res=0;
@@ -157,9 +201,10 @@ void LDAPConnection::add(const LDAPEntry* le, const LDAPConstraints* cons=0){
         }
         break;
         default :
+            string srvMsg = res->getErrMsg();
             delete res;
             delete msg;
-            throw LDAPException(resCode);
+            throw LDAPException(resCode, srvMsg);
     }
 }
 
@@ -191,16 +236,17 @@ void LDAPConnection::modify(const string& dn, const LDAPModList* mods,
         }
         break;
         default :
+            string srvMsg = res->getErrMsg();
             delete res;
             delete msg;
-            throw LDAPException(resCode);
+            throw LDAPException(resCode, srvMsg);
     }
     
 }
 
 void LDAPConnection::rename(const string& dn, const string& newRDN,
         bool delOldRDN, const string& newParentDN, 
-        const LDAPConstraints* cons=0){
+        const LDAPConstraints* cons){
     DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::rename" << endl);
     LDAPMessageQueue* msg=0;
     LDAPResult* res=0;
@@ -228,9 +274,10 @@ void LDAPConnection::rename(const string& dn, const string& newRDN,
         }
         break;
         default :
+            string srvMsg = res->getErrMsg();
             delete res;
             delete msg;
-            throw LDAPException(resCode);
+            throw LDAPException(resCode, srvMsg);
     }
 }
 
@@ -243,11 +290,12 @@ LDAPSearchResults* LDAPConnection::search(const string& base, int scope,
     LDAPSearchResults* results= 0;
     
     try{
+        results = new LDAPSearchResults();
         msgq = LDAPAsynConnection::search(base,scope, filter, attrs, attrsOnly,
                 cons);
-        results = new LDAPSearchResults();
         res = results->readMessageQueue(msgq);
     }catch(LDAPException e){
+        delete results; // memcheck
         delete msgq;
         throw;
     }
@@ -262,22 +310,25 @@ LDAPSearchResults* LDAPConnection::search(const string& base, int scope,
             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);
+                throw LDAPException(resCode, srvMsg);
         }
     }        
     return 0;
 }
 
 LDAPExtResult* LDAPConnection::extOperation(const string& oid, 
-        const string& value, const LDAPConstraints *cons = 0){
+        const string& value, const LDAPConstraints *cons){
     DEBUG(LDAP_DEBUG_TRACE,"LDAPConnection::extOperation" << endl);
     LDAPMessageQueue* msg=0;
     LDAPExtResult* res=0;
@@ -303,9 +354,10 @@ LDAPExtResult* LDAPConnection::extOperation(const string& oid,
         }
         break;
         default :
+            string srvMsg = res->getErrMsg();
             delete res;
             delete msg;
-            throw LDAPException(resCode);
+            throw LDAPException(resCode, srvMsg);
     }
 }
 
@@ -324,3 +376,7 @@ void LDAPConnection::setConstraints(LDAPConstraints* cons){
 const LDAPConstraints* LDAPConnection::getConstraints() const{
     return LDAPAsynConnection::getConstraints();
 }
+
+TlsOptions LDAPConnection::getTlsOptions() const {
+    return LDAPAsynConnection::getTlsOptions();
+}