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