xref: /netbsd-src/external/bsd/openldap/dist/contrib/ldapc++/src/LDAPBindRequest.cpp (revision e670fd5c413e99c2f6a37901bb21c537fcd322d2)
1d11b170bStron // $OpenLDAP$
22de962bdSlukem /*
3*e670fd5cSchristos  * Copyright 2000-2021 The OpenLDAP Foundation, All Rights Reserved.
42de962bdSlukem  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
52de962bdSlukem  */
62de962bdSlukem 
72de962bdSlukem #include <ldap.h>
82de962bdSlukem 
92de962bdSlukem #include "debug.h"
102de962bdSlukem 
112de962bdSlukem #include "LDAPBindRequest.h"
122de962bdSlukem #include "LDAPException.h"
132de962bdSlukem #include "SaslInteractionHandler.h"
142de962bdSlukem #include "SaslInteraction.h"
152de962bdSlukem 
162de962bdSlukem #include <cstdlib>
172de962bdSlukem #include <sasl/sasl.h>
182de962bdSlukem 
192de962bdSlukem using namespace std;
202de962bdSlukem 
LDAPBindRequest(const LDAPBindRequest & req)212de962bdSlukem LDAPBindRequest::LDAPBindRequest(const LDAPBindRequest& req) :
222de962bdSlukem         LDAPRequest(req){
232de962bdSlukem     DEBUG(LDAP_DEBUG_CONSTRUCT, "LDAPBindRequest::LDAPBindRequest(&)" << endl);
242de962bdSlukem     m_dn=req.m_dn;
252de962bdSlukem     m_cred=req.m_cred;
262de962bdSlukem     m_mech=req.m_mech;
272de962bdSlukem }
282de962bdSlukem 
LDAPBindRequest(const string & dn,const string & passwd,LDAPAsynConnection * connect,const LDAPConstraints * cons,bool isReferral)292de962bdSlukem LDAPBindRequest::LDAPBindRequest(const string& dn,const string& passwd,
302de962bdSlukem         LDAPAsynConnection *connect, const LDAPConstraints *cons,
312de962bdSlukem         bool isReferral) : LDAPRequest(connect, cons, isReferral){
322de962bdSlukem    DEBUG(LDAP_DEBUG_CONSTRUCT,"LDAPBindRequest::LDAPBindRequest()" << endl);
332de962bdSlukem    DEBUG(LDAP_DEBUG_CONSTRUCT | LDAP_DEBUG_PARAMETER, "   dn:" << dn << endl
342de962bdSlukem            << "   passwd:" << passwd << endl);
352de962bdSlukem     m_dn = dn;
362de962bdSlukem     m_cred = passwd;
372de962bdSlukem     m_mech = "";
382de962bdSlukem }
392de962bdSlukem 
~LDAPBindRequest()402de962bdSlukem LDAPBindRequest::~LDAPBindRequest(){
412de962bdSlukem     DEBUG(LDAP_DEBUG_DESTROY,"LDAPBindRequest::~LDAPBindRequest()" << endl);
422de962bdSlukem }
432de962bdSlukem 
sendRequest()442de962bdSlukem LDAPMessageQueue* LDAPBindRequest::sendRequest(){
452de962bdSlukem     DEBUG(LDAP_DEBUG_TRACE,"LDAPBindRequest::sendRequest()" << endl);
462de962bdSlukem     int msgID=0;
472de962bdSlukem 
482de962bdSlukem     const char* mech = (m_mech == "" ? 0 : m_mech.c_str());
492de962bdSlukem     BerValue* tmpcred=0;
502de962bdSlukem     if(m_cred != ""){
512de962bdSlukem         char* tmppwd = (char*) malloc( (m_cred.size()+1) * sizeof(char));
522de962bdSlukem         m_cred.copy(tmppwd,string::npos);
532de962bdSlukem         tmppwd[m_cred.size()]=0;
542de962bdSlukem         tmpcred=ber_bvstr(tmppwd);
552de962bdSlukem     }else{
562de962bdSlukem         tmpcred=(BerValue*) malloc(sizeof(BerValue));
572de962bdSlukem         tmpcred->bv_len=0;
582de962bdSlukem         tmpcred->bv_val=0;
592de962bdSlukem     }
602de962bdSlukem     const char* dn = 0;
612de962bdSlukem     if(m_dn != ""){
622de962bdSlukem         dn = m_dn.c_str();
632de962bdSlukem     }
642de962bdSlukem     LDAPControl** tmpSrvCtrls=m_cons->getSrvCtrlsArray();
652de962bdSlukem     LDAPControl** tmpClCtrls=m_cons->getClCtrlsArray();
662de962bdSlukem     int err=ldap_sasl_bind(m_connection->getSessionHandle(),dn,
672de962bdSlukem             mech, tmpcred, tmpSrvCtrls, tmpClCtrls, &msgID);
682de962bdSlukem     LDAPControlSet::freeLDAPControlArray(tmpSrvCtrls);
692de962bdSlukem     LDAPControlSet::freeLDAPControlArray(tmpClCtrls);
702de962bdSlukem     ber_bvfree(tmpcred);
712de962bdSlukem 
722de962bdSlukem     if(err != LDAP_SUCCESS){
732de962bdSlukem         throw LDAPException(err);
742de962bdSlukem     }else{
752de962bdSlukem         m_msgID=msgID;
762de962bdSlukem         return new LDAPMessageQueue(this);
772de962bdSlukem     }
782de962bdSlukem }
792de962bdSlukem 
LDAPSaslBindRequest(const std::string & mech,const std::string & cred,LDAPAsynConnection * connect,const LDAPConstraints * cons,bool isReferral)802de962bdSlukem LDAPSaslBindRequest::LDAPSaslBindRequest(const std::string& mech,
812de962bdSlukem         const std::string& cred,
822de962bdSlukem         LDAPAsynConnection *connect,
832de962bdSlukem         const LDAPConstraints *cons,
842de962bdSlukem         bool isReferral) : LDAPRequest(connect, cons, isReferral),m_mech(mech), m_cred(cred) {}
852de962bdSlukem 
sendRequest()862de962bdSlukem LDAPMessageQueue* LDAPSaslBindRequest::sendRequest()
872de962bdSlukem {
882de962bdSlukem     DEBUG(LDAP_DEBUG_TRACE,"LDAPSaslBindRequest::sendRequest()" << endl);
892de962bdSlukem     int msgID=0;
902de962bdSlukem 
912de962bdSlukem     BerValue tmpcred;
922de962bdSlukem     tmpcred.bv_val = (char*) malloc( m_cred.size() * sizeof(char));
932de962bdSlukem     m_cred.copy(tmpcred.bv_val,string::npos);
942de962bdSlukem     tmpcred.bv_len = m_cred.size();
952de962bdSlukem 
962de962bdSlukem     LDAPControl** tmpSrvCtrls=m_cons->getSrvCtrlsArray();
972de962bdSlukem     LDAPControl** tmpClCtrls=m_cons->getClCtrlsArray();
982de962bdSlukem     int err=ldap_sasl_bind(m_connection->getSessionHandle(), "", m_mech.c_str(),
992de962bdSlukem             &tmpcred, tmpSrvCtrls, tmpClCtrls, &msgID);
1002de962bdSlukem     LDAPControlSet::freeLDAPControlArray(tmpSrvCtrls);
1012de962bdSlukem     LDAPControlSet::freeLDAPControlArray(tmpClCtrls);
1022de962bdSlukem     free(tmpcred.bv_val);
1032de962bdSlukem 
1042de962bdSlukem     if(err != LDAP_SUCCESS){
1052de962bdSlukem         throw LDAPException(err);
1062de962bdSlukem     }else{
1072de962bdSlukem         m_msgID=msgID;
1082de962bdSlukem         return new LDAPMessageQueue(this);
1092de962bdSlukem     }
1102de962bdSlukem }
1112de962bdSlukem 
~LDAPSaslBindRequest()1122de962bdSlukem LDAPSaslBindRequest::~LDAPSaslBindRequest()
1132de962bdSlukem {
1142de962bdSlukem     DEBUG(LDAP_DEBUG_DESTROY,"LDAPSaslBindRequest::~LDAPSaslBindRequest()" << endl);
1152de962bdSlukem }
1162de962bdSlukem 
LDAPSaslInteractiveBind(const std::string & mech,int flags,SaslInteractionHandler * sih,LDAPAsynConnection * connect,const LDAPConstraints * cons,bool isReferral)1172de962bdSlukem LDAPSaslInteractiveBind::LDAPSaslInteractiveBind( const std::string& mech,
1182de962bdSlukem         int flags, SaslInteractionHandler *sih, LDAPAsynConnection *connect,
1192de962bdSlukem         const LDAPConstraints *cons, bool isReferral) :
1202de962bdSlukem             LDAPRequest(connect, cons, isReferral),
1212de962bdSlukem             m_mech(mech), m_flags(flags), m_sih(sih), m_res(0)
1222de962bdSlukem {
1232de962bdSlukem }
1242de962bdSlukem 
my_sasl_interact(LDAP * l,unsigned flags,void * cbh,void * interact)1252de962bdSlukem static int my_sasl_interact(LDAP *l, unsigned flags, void *cbh, void *interact)
1262de962bdSlukem {
1272de962bdSlukem     DEBUG(LDAP_DEBUG_TRACE, "LDAPSaslInteractiveBind::my_sasl_interact()"
1282de962bdSlukem             << std::endl );
1292de962bdSlukem     std::list<SaslInteraction*> interactions;
1302de962bdSlukem 
1312de962bdSlukem     sasl_interact_t *iter = (sasl_interact_t*) interact;
1322de962bdSlukem     while ( iter->id != SASL_CB_LIST_END ) {
1332de962bdSlukem         SaslInteraction *si = new SaslInteraction(iter);
1342de962bdSlukem         interactions.push_back( si );
1352de962bdSlukem         iter++;
1362de962bdSlukem     }
1372de962bdSlukem     ((SaslInteractionHandler*)cbh)->handleInteractions(interactions);
1382de962bdSlukem     return LDAP_SUCCESS;
1392de962bdSlukem }
1402de962bdSlukem 
1412de962bdSlukem /* This kind of fakes an asynchronous operation, ldap_sasl_interactive_bind_s
1422de962bdSlukem  * is synchronous */
sendRequest()1432de962bdSlukem LDAPMessageQueue *LDAPSaslInteractiveBind::sendRequest()
1442de962bdSlukem {
1452de962bdSlukem     DEBUG(LDAP_DEBUG_TRACE, "LDAPSaslInteractiveBind::sendRequest()" <<
1462de962bdSlukem             m_mech << std::endl);
1472de962bdSlukem 
1482de962bdSlukem     LDAPControl** tmpSrvCtrls=m_cons->getSrvCtrlsArray();
1492de962bdSlukem     LDAPControl** tmpClCtrls=m_cons->getClCtrlsArray();
1502de962bdSlukem     int res = ldap_sasl_interactive_bind_s( m_connection->getSessionHandle(),
1512de962bdSlukem             "", m_mech.c_str(), tmpSrvCtrls, tmpClCtrls, m_flags,
1522de962bdSlukem             my_sasl_interact, m_sih );
1532de962bdSlukem 
1542de962bdSlukem     DEBUG(LDAP_DEBUG_TRACE, "ldap_sasl_interactive_bind_s returned: "
1552de962bdSlukem             << res << std::endl);
1562de962bdSlukem     if(res != LDAP_SUCCESS){
1572de962bdSlukem         throw LDAPException(res);
1582de962bdSlukem     } else {
1592de962bdSlukem         m_res = new LDAPResult(LDAPMsg::BIND_RESPONSE, res, "");
1602de962bdSlukem     }
1612de962bdSlukem     return new LDAPMessageQueue(this);
1622de962bdSlukem }
1632de962bdSlukem 
getNextMessage() const1642de962bdSlukem LDAPMsg* LDAPSaslInteractiveBind::getNextMessage() const
1652de962bdSlukem {
1662de962bdSlukem     return m_res;
1672de962bdSlukem }
1682de962bdSlukem 
~LDAPSaslInteractiveBind()1692de962bdSlukem LDAPSaslInteractiveBind::~LDAPSaslInteractiveBind()
1702de962bdSlukem {
1712de962bdSlukem     DEBUG(LDAP_DEBUG_DESTROY,"LDAPSaslInteractiveBind::~LDAPSaslInteractiveBind()" << endl);
1722de962bdSlukem }
1732de962bdSlukem 
174