summaryrefslogtreecommitdiffstats
path: root/kabc/ldapclient.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kabc/ldapclient.cpp')
-rw-r--r--kabc/ldapclient.cpp427
1 files changed, 0 insertions, 427 deletions
diff --git a/kabc/ldapclient.cpp b/kabc/ldapclient.cpp
deleted file mode 100644
index 39e4c504f..000000000
--- a/kabc/ldapclient.cpp
+++ /dev/null
@@ -1,427 +0,0 @@
-/* kldapclient.cpp - LDAP access
- * Copyright (C) 2002 Klarälvdalens Datakonsult AB
- *
- * Author: Steffen Hansen <hansen@kde.org>
- *
- * Ported to KABC by Daniel Molkentin <molkentin@kde.org>
- *
- * This file is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This file is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-
-
-#include <tqfile.h>
-#include <tqimage.h>
-#include <tqlabel.h>
-#include <tqpixmap.h>
-#include <tqtextstream.h>
-#include <tqurl.h>
-
-#include <kapplication.h>
-#include <kconfig.h>
-#include <kdebug.h>
-#include <kmdcodec.h>
-#include <kprotocolinfo.h>
-
-#include "ldapclient.h"
-#include "ldif.h"
-#include "ldapurl.h"
-
-using namespace KABC;
-
-class LdapClient::LdapClientPrivate{
-public:
- TQString bindDN;
- TQString pwdBindDN;
- LDIF ldif;
-};
-
-TQString LdapObject::toString() const
-{
- TQString result = TQString::fromLatin1( "\ndn: %1\n" ).arg( dn );
- for ( LdapAttrMap::ConstIterator it = attrs.begin(); it != attrs.end(); ++it ) {
- TQString attr = it.key();
- for ( LdapAttrValue::ConstIterator it2 = (*it).begin(); it2 != (*it).end(); ++it2 ) {
- result += TQString::fromUtf8( LDIF::assembleLine( attr, *it2, 76 ) ) + "\n";
- }
- }
-
- return result;
-}
-
-void LdapObject::clear()
-{
- dn = TQString::null;
- attrs.clear();
-}
-
-void LdapObject::assign( const LdapObject& that )
-{
- if ( &that != this ) {
- dn = that.dn;
- attrs = that.attrs;
- client = that.client;
- }
-}
-
-LdapClient::LdapClient( TQObject* parent, const char* name )
- : TQObject( parent, name ), mJob( 0 ), mActive( false )
-{
- d = new LdapClientPrivate;
-}
-
-LdapClient::~LdapClient()
-{
- cancelQuery();
- delete d; d = 0;
-}
-
-void LdapClient::setHost( const TQString& host )
-{
- mHost = host;
-}
-
-void LdapClient::setPort( const TQString& port )
-{
- mPort = port;
-}
-
-void LdapClient::setBase( const TQString& base )
-{
- mBase = base;
-}
-
-void LdapClient::setBindDN( const TQString& bindDN )
-{
- d->bindDN = bindDN;
-}
-
-void LdapClient::setPwdBindDN( const TQString& pwdBindDN )
-{
- d->pwdBindDN = pwdBindDN;
-}
-
-void LdapClient::setAttrs( const TQStringList& attrs )
-{
- mAttrs = attrs;
-}
-
-void LdapClient::startQuery( const TQString& filter )
-{
- cancelQuery();
- LDAPUrl url;
-
- url.setProtocol( "ldap" );
- url.setUser( d->bindDN );
- url.setPass( d->pwdBindDN );
- url.setHost( mHost );
- url.setPort( mPort.toUInt() );
- url.setDn( mBase );
- url.setAttributes( mAttrs );
- url.setScope( mScope == "one" ? LDAPUrl::One : LDAPUrl::Sub );
- url.setFilter( "("+filter+")" );
-
- kdDebug(5700) << "Doing query: " << url.prettyURL() << endl;
-
- startParseLDIF();
- mActive = true;
- mJob = KIO::get( url, false, false );
- connect( mJob, TQT_SIGNAL( data( KIO::Job*, const TQByteArray& ) ),
- this, TQT_SLOT( slotData( KIO::Job*, const TQByteArray& ) ) );
- connect( mJob, TQT_SIGNAL( infoMessage( KIO::Job*, const TQString& ) ),
- this, TQT_SLOT( slotInfoMessage( KIO::Job*, const TQString& ) ) );
- connect( mJob, TQT_SIGNAL( result( KIO::Job* ) ),
- this, TQT_SLOT( slotDone() ) );
-}
-
-void LdapClient::cancelQuery()
-{
- if ( mJob ) {
- mJob->kill();
- mJob = 0;
- }
-
- mActive = false;
-}
-
-void LdapClient::slotData( KIO::Job*, const TQByteArray& data )
-{
-#ifndef NDEBUG // don't create the QString
-// TQString str( data );
-// kdDebug(5700) << "LdapClient: Got \"" << str << "\"\n";
-#endif
- parseLDIF( data );
-}
-
-void LdapClient::slotInfoMessage( KIO::Job*, const TQString & )
-{
- //tqDebug("Job said \"%s\"", info.latin1());
-}
-
-void LdapClient::slotDone()
-{
- endParseLDIF();
- mActive = false;
-#if 0
- for ( TQValueList<LdapObject>::Iterator it = mObjects.begin(); it != mObjects.end(); ++it ) {
- tqDebug( (*it).toString().latin1() );
- }
-#endif
- int err = mJob->error();
- if ( err && err != KIO::ERR_USER_CANCELED ) {
- emit error( KIO::buildErrorString( err, TQString("%1:%2").arg( mHost ).arg( mPort ) ) );
- }
- emit done();
-}
-
-void LdapClient::startParseLDIF()
-{
- mCurrentObject.clear();
- mLastAttrName = 0;
- mLastAttrValue = 0;
- mIsBase64 = false;
- d->ldif.startParsing();
-}
-
-void LdapClient::endParseLDIF()
-{
-}
-
-void LdapClient::parseLDIF( const TQByteArray& data )
-{
- if ( data.size() ) {
- d->ldif.setLDIF( data );
- } else {
- d->ldif.endLDIF();
- }
-
- LDIF::ParseVal ret;
- TQString name;
- do {
- ret = d->ldif.nextItem();
- switch ( ret ) {
- case LDIF::Item:
- {
- name = d->ldif.attr();
- // Must make a copy! TQByteArray is explicitely shared
- TQByteArray value = d->ldif.val().copy();
- mCurrentObject.attrs[ name ].append( value );
- break;
- }
- case LDIF::EndEntry:
- mCurrentObject.dn = d->ldif.dn();
- mCurrentObject.client = this;
- emit result( mCurrentObject );
- mCurrentObject.clear();
- break;
- default:
- break;
- }
- } while ( ret != LDIF::MoreData );
-}
-
-TQString LdapClient::bindDN() const
-{
- return d->bindDN;
-}
-
-TQString LdapClient::pwdBindDN() const
-{
- return d->pwdBindDN;
-}
-
-LdapSearch::LdapSearch()
- : mActiveClients( 0 ), mNoLDAPLookup( false )
-{
- if ( !KProtocolInfo::isKnownProtocol( KURL("ldap://localhost") ) ) {
- mNoLDAPLookup = true;
- return;
- }
-
- // stolen from KAddressBook
- KConfig config( "kabldaprc", true );
- config.setGroup( "LDAP" );
- int numHosts = config.readUnsignedNumEntry( "NumSelectedHosts");
- if ( !numHosts ) {
- mNoLDAPLookup = true;
- return;
- } else {
- for ( int j = 0; j < numHosts; j++ ) {
- LdapClient* ldapClient = new LdapClient( this );
-
- TQString host = config.readEntry( TQString( "SelectedHost%1" ).arg( j ), "" ).stripWhiteSpace();
- if ( !host.isEmpty() )
- ldapClient->setHost( host );
-
- TQString port = TQString::number( config.readUnsignedNumEntry( TQString( "SelectedPort%1" ).arg( j ) ) );
- if ( !port.isEmpty() )
- ldapClient->setPort( port );
-
- TQString base = config.readEntry( TQString( "SelectedBase%1" ).arg( j ), "" ).stripWhiteSpace();
- if ( !base.isEmpty() )
- ldapClient->setBase( base );
-
- TQString bindDN = config.readEntry( TQString( "SelectedBind%1" ).arg( j ) ).stripWhiteSpace();
- if ( !bindDN.isEmpty() )
- ldapClient->setBindDN( bindDN );
-
- TQString pwdBindDN = config.readEntry( TQString( "SelectedPwdBind%1" ).arg( j ) );
- if ( !pwdBindDN.isEmpty() )
- ldapClient->setPwdBindDN( pwdBindDN );
-
- TQStringList attrs;
- attrs << "cn" << "mail" << "givenname" << "sn";
- ldapClient->setAttrs( attrs );
-
- connect( ldapClient, TQT_SIGNAL( result( const KABC::LdapObject& ) ),
- this, TQT_SLOT( slotLDAPResult( const KABC::LdapObject& ) ) );
- connect( ldapClient, TQT_SIGNAL( done() ),
- this, TQT_SLOT( slotLDAPDone() ) );
- connect( ldapClient, TQT_SIGNAL( error( const TQString& ) ),
- this, TQT_SLOT( slotLDAPError( const TQString& ) ) );
-
- mClients.append( ldapClient );
- }
- }
-
- connect( &mDataTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotDataTimer() ) );
-}
-
-void LdapSearch::startSearch( const TQString& txt )
-{
- if ( mNoLDAPLookup )
- return;
-
- cancelSearch();
-
- int pos = txt.find( '\"' );
- if( pos >= 0 )
- {
- ++pos;
- int pos2 = txt.find( '\"', pos );
- if( pos2 >= 0 )
- mSearchText = txt.mid( pos , pos2 - pos );
- else
- mSearchText = txt.mid( pos );
- } else
- mSearchText = txt;
-
- TQString filter = TQString( "|(cn=%1*)(mail=%2*)(givenName=%3*)(sn=%4*)" )
- .arg( mSearchText ).arg( mSearchText ).arg( mSearchText ).arg( mSearchText );
-
- TQValueList< LdapClient* >::Iterator it;
- for ( it = mClients.begin(); it != mClients.end(); ++it ) {
- (*it)->startQuery( filter );
- ++mActiveClients;
- }
-}
-
-void LdapSearch::cancelSearch()
-{
- TQValueList< LdapClient* >::Iterator it;
- for ( it = mClients.begin(); it != mClients.end(); ++it )
- (*it)->cancelQuery();
-
- mActiveClients = 0;
- mResults.clear();
-}
-
-void LdapSearch::slotLDAPResult( const KABC::LdapObject& obj )
-{
- mResults.append( obj );
- if ( !mDataTimer.isActive() )
- mDataTimer.start( 500, true );
-}
-
-void LdapSearch::slotLDAPError( const TQString& )
-{
- slotLDAPDone();
-}
-
-void LdapSearch::slotLDAPDone()
-{
- if ( --mActiveClients > 0 )
- return;
-
- finish();
-}
-
-void LdapSearch::slotDataTimer()
-{
- TQStringList lst;
- LdapResultList reslist;
- makeSearchData( lst, reslist );
- if ( !lst.isEmpty() )
- emit searchData( lst );
- if ( !reslist.isEmpty() )
- emit searchData( reslist );
-}
-
-void LdapSearch::finish()
-{
- mDataTimer.stop();
-
- slotDataTimer(); // emit final bunch of data
- emit searchDone();
-}
-
-void LdapSearch::makeSearchData( TQStringList& ret, LdapResultList& resList )
-{
- TQString search_text_upper = mSearchText.upper();
-
- TQValueList< KABC::LdapObject >::ConstIterator it1;
- for ( it1 = mResults.begin(); it1 != mResults.end(); ++it1 ) {
- TQString name, mail, givenname, sn;
-
- LdapAttrMap::ConstIterator it2;
- for ( it2 = (*it1).attrs.begin(); it2 != (*it1).attrs.end(); ++it2 ) {
- TQString tmp = TQString::fromUtf8( (*it2).first(), (*it2).first().size() );
- if ( it2.key() == "cn" )
- name = tmp; // TODO loop?
- else if( it2.key() == "mail" )
- mail = tmp;
- else if( it2.key() == "givenName" )
- givenname = tmp;
- else if( it2.key() == "sn" )
- sn = tmp;
- }
-
- if( mail.isEmpty())
- continue; // nothing, bad entry
- else if ( name.isEmpty() )
- ret.append( mail );
- else {
- kdDebug(5700) << "<" << name << "><" << mail << ">" << endl;
- ret.append( TQString( "%1 <%2>" ).arg( name ).arg( mail ) );
- }
-
- LdapResult sr;
- sr.clientNumber = mClients.findIndex( (*it1).client );
- sr.name = name;
- sr.email = mail;
- resList.append( sr );
- }
-
- mResults.clear();
-}
-
-bool LdapSearch::isAvailable() const
-{
- return !mNoLDAPLookup;
-}
-
-
-
-#include "ldapclient.moc"