22 #include "resourceldapkio.h"
23 #include "resourceldapkioconfig.h"
25 #include "kldap/ldif.h"
26 #include "kldap/ldapdn.h"
27 #include "kldap/ldapurl.h"
29 #include <kio/netaccess.h>
30 #include <kio/udsentry.h>
34 #include <kstandarddirs.h>
35 #include <klineedit.h>
38 #include <kstringhandler.h>
39 #include <ktemporaryfile.h>
41 #include <QtCore/QBuffer>
42 #include <QtCore/QEventLoop>
43 #include <QtCore/QFile>
49 class ResourceLDAPKIO::Private
52 Private( ResourceLDAPKIO *parent )
53 : mParent( parent ), mPort( 389 ), mAnonymous( true ), mTLS( false ),
54 mSSL( false ), mSubTree( false ), mSASL( false ), mVer( 3 ),
55 mRDNPrefix( 0 ), mTimeLimit( 0 ), mSizeLimit( 0 ),
56 mCachePolicy( Cache_No ), mAutoCache( true )
58 KGlobal::locale()->insertCatalog( QLatin1String(
"libkldap" ) );
61 KIO::TransferJob *loadFromCache();
65 QByteArray addEntry(
const QString &attr,
const QString &value,
bool mod );
66 QString findUid(
const QString &uid );
67 bool AddresseeToLDIF( QByteArray &ldif,
const Addressee &addr,
const QString &olddn );
69 ResourceLDAPKIO *mParent;
77 QMap<QString, QString> mAttributes;
82 bool mTLS, mSSL, mSubTree;
86 Resource::Iterator mSaveIt;
89 QString mRealm, mBindDN;
90 KLDAP::LdapUrl mLDAPUrl;
100 KTemporaryFile *mTmp;
103 ResourceLDAPKIO::ResourceLDAPKIO()
104 :
Resource(), d( new Private( this ) )
106 d->mCacheDst = KGlobal::dirs()->saveLocation(
"cache", QLatin1String(
"ldapkio" ) ) +
111 ResourceLDAPKIO::ResourceLDAPKIO(
const KConfigGroup &group )
112 :
Resource( group ), d( new Private( this ) )
114 QMap<QString, QString> attrList;
115 QStringList attributes = group.readEntry(
"LdapAttributes", QStringList() );
116 for (
int pos = 0; pos < attributes.count(); pos += 2 ) {
117 d->mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] );
120 d->mUser = group.readEntry(
"LdapUser" );
121 d->mPassword = KStringHandler::obscure( group.readEntry(
"LdapPassword" ) );
122 d->mDn = group.readEntry(
"LdapDn" );
123 d->mHost = group.readEntry(
"LdapHost" );
124 d->mPort = group.readEntry(
"LdapPort", 389 );
125 d->mFilter = group.readEntry(
"LdapFilter" );
126 d->mAnonymous = group.readEntry(
"LdapAnonymous",
false );
127 d->mTLS = group.readEntry(
"LdapTLS",
false );
128 d->mSSL = group.readEntry(
"LdapSSL",
false );
129 d->mSubTree = group.readEntry(
"LdapSubTree",
false );
130 d->mSASL = group.readEntry(
"LdapSASL",
false );
131 d->mMech = group.readEntry(
"LdapMech" );
132 d->mRealm = group.readEntry(
"LdapRealm" );
133 d->mBindDN = group.readEntry(
"LdapBindDN" );
134 d->mVer = group.readEntry(
"LdapVer", 3 );
135 d->mTimeLimit = group.readEntry(
"LdapTimeLimit", 0 );
136 d->mSizeLimit = group.readEntry(
"LdapSizeLimit", 0 );
137 d->mRDNPrefix = group.readEntry(
"LdapRDNPrefix", 0 );
138 d->mCachePolicy = group.readEntry(
"LdapCachePolicy", 0 );
139 d->mAutoCache = group.readEntry(
"LdapAutoCache",
true );
140 d->mCacheDst = KGlobal::dirs()->saveLocation(
141 "cache", QLatin1String(
"ldapkio" ) ) + QLatin1Char(
'/' ) +
146 ResourceLDAPKIO::~ResourceLDAPKIO()
151 void ResourceLDAPKIO::Private::enter_loop()
153 QEventLoop eventLoop;
154 mParent->connect( mParent, SIGNAL(leaveModality()), &eventLoop, SLOT(quit()) );
155 eventLoop.exec( QEventLoop::ExcludeUserInputEvents );
158 void ResourceLDAPKIO::entries( KIO::Job *,
const KIO::UDSEntryList &list )
160 KIO::UDSEntryList::ConstIterator it = list.begin();
161 KIO::UDSEntryList::ConstIterator end = list.end();
162 for ( ; it != end; ++it ) {
163 const QString urlStr = ( *it ).stringValue( KIO::UDSEntry::UDS_URL );
164 if ( !urlStr.isEmpty() ) {
165 KUrl tmpurl( urlStr );
166 d->mResultDn = tmpurl.path();
167 kDebug() <<
"findUid():" << d->mResultDn;
168 if ( d->mResultDn.startsWith( QLatin1Char(
'/' ) ) ) {
169 d->mResultDn.remove( 0, 1 );
176 void ResourceLDAPKIO::listResult( KJob *job )
178 d->mError = job->error();
179 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
180 d->mErrorMsg = job->errorString();
182 d->mErrorMsg.clear();
184 emit leaveModality();
187 QString ResourceLDAPKIO::Private::findUid(
const QString &uid )
189 KLDAP::LdapUrl url( mLDAPUrl );
195 url.setAttributes( QStringList( QLatin1String(
"dn" ) ) );
196 url.setFilter( QLatin1Char(
'(' ) + mAttributes[ QLatin1String(
"uid" ) ] +
197 QLatin1Char(
'=' ) + uid + QLatin1Char(
')' ) + mFilter );
198 url.setExtension( QLatin1String(
"x-dir" ), QLatin1String(
"one" ) );
200 kDebug() << uid <<
"url" << url.prettyUrl();
202 KIO::ListJob *listJob = KIO::listDir( url, KIO::HideProgressInfo );
203 mParent->connect( listJob, SIGNAL(entries(KIO::Job*,KIO::UDSEntryList)),
204 SLOT(entries(KIO::Job*,KIO::UDSEntryList)) );
205 mParent->connect( listJob, SIGNAL(result(KJob*)),
206 mParent, SLOT(listResult(KJob*)) );
212 QByteArray ResourceLDAPKIO::Private::addEntry(
const QString &attr,
const QString &value,
bool mod )
215 if ( !attr.isEmpty() ) {
217 tmp += KLDAP::Ldif::assembleLine( QLatin1String(
"replace" ), attr ) +
'\n';
219 if ( !value.isEmpty() ) {
220 tmp += KLDAP::Ldif::assembleLine( attr, value ) +
'\n';
229 bool ResourceLDAPKIO::Private::AddresseeToLDIF( QByteArray &ldif,
const Addressee &addr,
230 const QString &olddn )
237 if ( olddn.isEmpty() ) {
239 switch ( mRDNPrefix ) {
241 dn = mAttributes[ QLatin1String(
"uid" ) ] +
242 QLatin1Char(
'=' ) + addr.uid() + QLatin1Char(
',' ) + mDn;
246 dn = mAttributes[ QLatin1String(
"commonName" ) ] +
247 QLatin1Char(
'=' ) + addr.assembledName() + QLatin1Char(
',' ) + mDn;
253 if ( olddn.startsWith( mAttributes[ QLatin1String(
"uid" ) ] ) ) {
254 dn = mAttributes[ QLatin1String(
"uid" ) ] + QLatin1Char(
'=' ) + addr.uid() +
255 QLatin1Char(
',' ) + olddn.section( QLatin1Char(
',' ), 1 );
256 }
else if ( olddn.startsWith( mAttributes[ QLatin1String(
"commonName" ) ] ) ) {
257 dn = mAttributes[ QLatin1String(
"commonName" ) ] +
258 QLatin1Char(
'=' ) + addr.assembledName()
259 + QLatin1Char(
',' ) + olddn.section( QLatin1Char(
',' ), 1 );
264 if ( olddn.toLower() != dn.toLower() ) {
265 tmp = KLDAP::Ldif::assembleLine( QLatin1String(
"dn" ), olddn ) +
'\n';
266 tmp +=
"changetype: modrdn\n";
267 tmp += KLDAP::Ldif::assembleLine( QLatin1String(
"newrdn" ),
268 dn.section( QLatin1Char(
',' ), 0, 0 ) ) +
'\n';
269 tmp +=
"deleteoldrdn: 1\n\n";
273 tmp += KLDAP::Ldif::assembleLine( QLatin1String(
"dn" ), dn ) +
'\n';
275 tmp +=
"changetype: modify\n";
278 tmp +=
"objectClass: top\n";
279 const QStringList obclass =
280 mAttributes[ QLatin1String(
"objectClass" ) ].split( QLatin1Char(
',' ),
281 QString::SkipEmptyParts );
282 for ( QStringList::const_iterator it = obclass.constBegin(); it != obclass.constEnd(); ++it ) {
283 tmp += KLDAP::Ldif::assembleLine( QLatin1String(
"objectClass" ), *it ) +
'\n';
287 tmp += addEntry( mAttributes[ QLatin1String(
"commonName" ) ], addr.assembledName(), mod );
288 tmp += addEntry( mAttributes[ QLatin1String(
"formattedName" ) ], addr.formattedName(), mod );
289 tmp += addEntry( mAttributes[ QLatin1String(
"givenName" ) ], addr.givenName(), mod );
290 tmp += addEntry( mAttributes[ QLatin1String(
"familyName" ) ], addr.familyName(), mod );
291 tmp += addEntry( mAttributes[ QLatin1String(
"uid" ) ], addr.uid(), mod );
295 tmp += addEntry( mAttributes[ QLatin1String(
"phoneNumber" ) ], number.number(), mod );
297 tmp += addEntry( mAttributes[ QLatin1String(
"telephoneNumber" ) ], number.number(), mod );
299 tmp += addEntry( mAttributes[ QLatin1String(
"facsimileTelephoneNumber" ) ],
300 number.number(), mod );
302 tmp += addEntry( mAttributes[ QLatin1String(
"mobile" ) ], number.number(), mod );
304 tmp += addEntry( mAttributes[ QLatin1String(
"pager" ) ], number.number(), mod );
306 tmp += addEntry( mAttributes[ QLatin1String(
"description" ) ], addr.note(), mod );
307 tmp += addEntry( mAttributes[ QLatin1String(
"title" ) ], addr.title(), mod );
308 tmp += addEntry( mAttributes[ QLatin1String(
"organization" ) ], addr.organization(), mod );
311 if ( !ad.isEmpty() ) {
312 tmp += addEntry( mAttributes[ QLatin1String(
"street" ) ], ad.street(), mod );
313 tmp += addEntry( mAttributes[ QLatin1String(
"state" ) ], ad.region(), mod );
314 tmp += addEntry( mAttributes[ QLatin1String(
"city" ) ], ad.locality(), mod );
315 tmp += addEntry( mAttributes[ QLatin1String(
"postalcode" ) ], ad.postalCode(), mod );
318 QStringList emails = addr.emails();
319 QStringList::ConstIterator mailIt = emails.constBegin();
321 if ( !mAttributes[ QLatin1String(
"mail" ) ].isEmpty() ) {
323 tmp += KLDAP::Ldif::assembleLine( QLatin1String(
"replace" ),
324 mAttributes[ QLatin1String(
"mail" ) ] ) +
'\n';
326 if ( mailIt != emails.constEnd() ) {
327 tmp += KLDAP::Ldif::assembleLine( mAttributes[ QLatin1String(
"mail" ) ], *mailIt ) +
'\n';
331 mAttributes[ QLatin1String(
"mail" ) ] != mAttributes[ QLatin1String(
"mailAlias" ) ] ) {
336 if ( !mAttributes[ QLatin1String(
"mailAlias" ) ].isEmpty() ) {
338 mAttributes[ QLatin1String(
"mail" ) ] != mAttributes[ QLatin1String(
"mailAlias" ) ] ) {
339 tmp += KLDAP::Ldif::assembleLine( QLatin1String(
"replace" ),
340 mAttributes[ QLatin1String(
"mailAlias" ) ] ) +
'\n';
342 for ( ; mailIt != emails.constEnd(); ++mailIt ) {
343 tmp += KLDAP::Ldif::assembleLine(
344 mAttributes[ QLatin1String(
"mailAlias" ) ], *mailIt ) +
'\n';
351 if ( !mAttributes[ QLatin1String(
"jpegPhoto" ) ].isEmpty() ) {
353 QBuffer buffer( &pic );
354 buffer.open( QIODevice::WriteOnly );
355 addr.photo().data().save( &buffer,
"JPEG" );
358 tmp += KLDAP::Ldif::assembleLine( QLatin1String(
"replace" ),
359 mAttributes[ QLatin1String(
"jpegPhoto" ) ] ) +
'\n';
361 tmp += KLDAP::Ldif::assembleLine( mAttributes[ QLatin1String(
"jpegPhoto" ) ], pic, 76 ) +
'\n';
368 kDebug() <<
"ldif:" << QString::fromUtf8( tmp );
373 void ResourceLDAPKIO::setReadOnly(
bool value )
380 void ResourceLDAPKIO::init()
382 if ( d->mPort == 0 ) {
392 if ( !d->mAttributes.contains( QLatin1String(
"objectClass" ) ) ) {
393 d->mAttributes.insert( QLatin1String(
"objectClass" ), QLatin1String(
"inetOrgPerson" ) );
395 if ( !d->mAttributes.contains( QLatin1String(
"commonName" ) ) ) {
396 d->mAttributes.insert( QLatin1String(
"commonName" ), QLatin1String(
"cn" ) );
398 if ( !d->mAttributes.contains( QLatin1String(
"formattedName" ) ) ) {
399 d->mAttributes.insert( QLatin1String(
"formattedName" ), QLatin1String(
"displayName" ) );
401 if ( !d->mAttributes.contains( QLatin1String(
"familyName" ) ) ) {
402 d->mAttributes.insert( QLatin1String(
"familyName" ), QLatin1String(
"sn" ) );
404 if ( !d->mAttributes.contains( QLatin1String(
"givenName" ) ) ) {
405 d->mAttributes.insert( QLatin1String(
"givenName" ), QLatin1String(
"givenName" ) );
407 if ( !d->mAttributes.contains( QLatin1String(
"mail" ) ) ) {
408 d->mAttributes.insert( QLatin1String(
"mail" ), QLatin1String(
"mail" ) );
410 if ( !d->mAttributes.contains( QLatin1String(
"mailAlias" ) ) ) {
411 d->mAttributes.insert( QLatin1String(
"mailAlias" ), QString() );
413 if ( !d->mAttributes.contains( QLatin1String(
"phoneNumber" ) ) ) {
414 d->mAttributes.insert( QLatin1String(
"phoneNumber" ), QLatin1String(
"homePhone" ) );
416 if ( !d->mAttributes.contains( QLatin1String(
"telephoneNumber" ) ) ) {
417 d->mAttributes.insert( QLatin1String(
"telephoneNumber" ), QLatin1String(
"telephoneNumber" ) );
419 if ( !d->mAttributes.contains( QLatin1String(
"facsimileTelephoneNumber" ) ) ) {
420 d->mAttributes.insert( QLatin1String(
"facsimileTelephoneNumber" ),
421 QLatin1String(
"facsimileTelephoneNumber" ) );
423 if ( !d->mAttributes.contains( QLatin1String(
"mobile" ) ) ) {
424 d->mAttributes.insert( QLatin1String(
"mobile" ), QLatin1String(
"mobile" ) );
426 if ( !d->mAttributes.contains( QLatin1String(
"pager" ) ) ) {
427 d->mAttributes.insert( QLatin1String(
"pager" ), QLatin1String(
"pager" ) );
429 if ( !d->mAttributes.contains( QLatin1String(
"description" ) ) ) {
430 d->mAttributes.insert( QLatin1String(
"description" ), QLatin1String(
"description" ) );
432 if ( !d->mAttributes.contains( QLatin1String(
"title" ) ) ) {
433 d->mAttributes.insert( QLatin1String(
"title" ), QLatin1String(
"title" ) );
435 if ( !d->mAttributes.contains( QLatin1String(
"street" ) ) ) {
436 d->mAttributes.insert( QLatin1String(
"street" ), QLatin1String(
"street" ) );
438 if ( !d->mAttributes.contains( QLatin1String(
"state" ) ) ) {
439 d->mAttributes.insert( QLatin1String(
"state" ), QLatin1String(
"st" ) );
441 if ( !d->mAttributes.contains( QLatin1String(
"city" ) ) ) {
442 d->mAttributes.insert( QLatin1String(
"city" ), QLatin1String(
"l" ) );
444 if ( !d->mAttributes.contains( QLatin1String(
"organization" ) ) ) {
445 d->mAttributes.insert( QLatin1String(
"organization" ), QLatin1String(
"o" ) );
447 if ( !d->mAttributes.contains( QLatin1String(
"postalcode" ) ) ) {
448 d->mAttributes.insert( QLatin1String(
"postalcode" ), QLatin1String(
"postalCode" ) );
450 if ( !d->mAttributes.contains( QLatin1String(
"uid" ) ) ) {
451 d->mAttributes.insert( QLatin1String(
"uid" ), QLatin1String(
"uid" ) );
453 if ( !d->mAttributes.contains( QLatin1String(
"jpegPhoto" ) ) ) {
454 d->mAttributes.insert( QLatin1String(
"jpegPhoto" ), QLatin1String(
"jpegPhoto" ) );
457 d->mLDAPUrl = KLDAP::LdapUrl( KUrl() );
458 if ( !d->mAnonymous ) {
459 d->mLDAPUrl.setExtension( QLatin1String(
"bindname" ), d->mBindDN );
460 d->mLDAPUrl.setUser( d->mUser );
461 d->mLDAPUrl.setPass( d->mPassword );
463 d->mLDAPUrl.setProtocol( d->mSSL ? QLatin1String(
"ldaps" ) : QLatin1String(
"ldap" ) );
464 d->mLDAPUrl.setHost( d->mHost );
465 d->mLDAPUrl.setPort( d->mPort );
466 d->mLDAPUrl.setDn( KLDAP::LdapDN( d->mDn ) );
468 if ( !d->mAttributes.empty() ) {
469 QMap<QString,QString>::Iterator it;
471 for ( it = d->mAttributes.begin(); it != d->mAttributes.end(); ++it ) {
472 if ( !it.value().isEmpty() && it.key() != QLatin1String(
"objectClass" ) ) {
473 attr.append( it.value() );
476 d->mLDAPUrl.setAttributes( attr );
479 d->mLDAPUrl.setScope( d->mSubTree ? KLDAP::LdapUrl::Sub : KLDAP::LdapUrl::One );
480 if ( !d->mFilter.isEmpty() && d->mFilter != QLatin1String(
"(objectClass=*)" ) ) {
481 d->mLDAPUrl.setFilter( d->mFilter );
483 d->mLDAPUrl.setExtension( QLatin1String(
"x-dir" ), QLatin1String(
"base" ) );
485 d->mLDAPUrl.setExtension( QLatin1String(
"x-tls" ), QString() );
487 d->mLDAPUrl.setExtension( QLatin1String(
"x-ver" ), QString::number( d->mVer ) );
488 if ( d->mSizeLimit ) {
489 d->mLDAPUrl.setExtension( QLatin1String(
"x-sizelimit" ), QString::number( d->mSizeLimit ) );
491 if ( d->mTimeLimit ) {
492 d->mLDAPUrl.setExtension( QLatin1String(
"x-timelimit" ), QString::number( d->mTimeLimit ) );
495 d->mLDAPUrl.setExtension( QLatin1String(
"x-sasl" ), QString() );
496 if ( !d->mMech.isEmpty() ) {
497 d->mLDAPUrl.setExtension( QLatin1String(
"x-mech" ), d->mMech );
499 if ( !d->mRealm.isEmpty() ) {
500 d->mLDAPUrl.setExtension( QLatin1String(
"x-realm" ), d->mRealm );
504 d->mReadOnly = readOnly();
506 kDebug() <<
"resource_ldapkio url:" << d->mLDAPUrl.prettyUrl();
509 void ResourceLDAPKIO::writeConfig( KConfigGroup &group )
513 group.writeEntry(
"LdapUser", d->mUser );
514 group.writeEntry(
"LdapPassword", KStringHandler::obscure( d->mPassword ) );
515 group.writeEntry(
"LdapDn", d->mDn );
516 group.writeEntry(
"LdapHost", d->mHost );
517 group.writeEntry(
"LdapPort", d->mPort );
518 group.writeEntry(
"LdapFilter", d->mFilter );
519 group.writeEntry(
"LdapAnonymous", d->mAnonymous );
520 group.writeEntry(
"LdapTLS", d->mTLS );
521 group.writeEntry(
"LdapSSL", d->mSSL );
522 group.writeEntry(
"LdapSubTree", d->mSubTree );
523 group.writeEntry(
"LdapSASL", d->mSASL );
524 group.writeEntry(
"LdapMech", d->mMech );
525 group.writeEntry(
"LdapVer", d->mVer );
526 group.writeEntry(
"LdapTimeLimit", d->mTimeLimit );
527 group.writeEntry(
"LdapSizeLimit", d->mSizeLimit );
528 group.writeEntry(
"LdapRDNPrefix", d->mRDNPrefix );
529 group.writeEntry(
"LdapRealm", d->mRealm );
530 group.writeEntry(
"LdapBindDN", d->mBindDN );
531 group.writeEntry(
"LdapCachePolicy", d->mCachePolicy );
532 group.writeEntry(
"LdapAutoCache", d->mAutoCache );
534 QStringList attributes;
535 QMap<QString, QString>::const_iterator it;
536 for ( it = d->mAttributes.constBegin(); it != d->mAttributes.constEnd(); ++it ) {
537 attributes << it.key() << it.value();
540 group.writeEntry(
"LdapAttributes", attributes );
543 Ticket *ResourceLDAPKIO::requestSaveTicket()
545 if ( !addressBook() ) {
546 kDebug() <<
"no addressbook";
550 return createTicket(
this );
553 void ResourceLDAPKIO::releaseSaveTicket(
Ticket *ticket )
558 bool ResourceLDAPKIO::doOpen()
563 void ResourceLDAPKIO::doClose()
567 void ResourceLDAPKIO::Private::createCache()
570 if ( mCachePolicy == Cache_NoConnection && mAutoCache ) {
571 mTmp =
new KTemporaryFile;
572 mTmp->setPrefix( mCacheDst );
573 mTmp->setSuffix( QLatin1String(
"tmp" ) );
578 void ResourceLDAPKIO::Private::activateCache()
580 if ( mTmp && mError == 0 ) {
581 QString filename = mTmp->fileName();
584 KDE_rename( QFile::encodeName( filename ), QFile::encodeName( mCacheDst ) );
588 KIO::TransferJob *ResourceLDAPKIO::Private::loadFromCache()
590 KIO::TransferJob *job = 0;
591 if ( mCachePolicy == Cache_Always ||
592 ( mCachePolicy == Cache_NoConnection &&
593 mError == KIO::ERR_COULD_NOT_CONNECT ) ) {
598 mLdif.startParsing();
600 mParent->Resource::setReadOnly(
true );
602 KUrl url( mCacheDst );
603 job = KIO::get( url, KIO::Reload, KIO::HideProgressInfo );
604 mParent->connect( job, SIGNAL(data(KIO::Job*,QByteArray)),
605 mParent, SLOT(data(KIO::Job*,QByteArray)) );
611 bool ResourceLDAPKIO::load()
614 KIO::TransferJob *job;
618 d->mAddr = Addressee();
621 d->mLdif.startParsing();
627 if ( d->mCachePolicy != Cache_Always ) {
628 job = KIO::get( d->mLDAPUrl, KIO::Reload, KIO::HideProgressInfo );
629 connect( job, SIGNAL(data(KIO::Job*,QByteArray)),
630 this, SLOT(data(KIO::Job*,QByteArray)) );
631 connect( job, SIGNAL(result(KJob*)),
632 this, SLOT(syncLoadSaveResult(KJob*)) );
636 job = d->loadFromCache();
638 connect( job, SIGNAL(result(KJob*)),
639 this, SLOT(syncLoadSaveResult(KJob*)) );
642 if ( d->mErrorMsg.isEmpty() ) {
643 kDebug() <<
"ResourceLDAPKIO load ok!";
646 kDebug() <<
"ResourceLDAPKIO load finished with error:" << d->mErrorMsg;
647 addressBook()->error( d->mErrorMsg );
652 bool ResourceLDAPKIO::asyncLoad()
656 d->mAddr = Addressee();
659 d->mLdif.startParsing();
664 if ( d->mCachePolicy != Cache_Always ) {
665 KIO::TransferJob *job = KIO::get( d->mLDAPUrl, KIO::Reload, KIO::HideProgressInfo );
666 connect( job, SIGNAL(data(KIO::Job*,QByteArray)),
667 this, SLOT(data(KIO::Job*,QByteArray)) );
668 connect( job, SIGNAL(result(KJob*)),
669 this, SLOT(result(KJob*)) );
676 void ResourceLDAPKIO::data( KIO::Job *job,
const QByteArray &data )
680 d->mLdif.setLdif( data );
682 d->mTmp->write( data );
688 KLDAP::Ldif::ParseValue ret;
692 ret = d->mLdif.nextItem();
694 case KLDAP::Ldif::NewEntry:
695 kDebug() <<
"new entry:" << d->mLdif.dn().toString();
697 case KLDAP::Ldif::Item:
698 name = d->mLdif.attr().toLower();
699 value = d->mLdif.value();
700 if ( name == d->mAttributes[ QLatin1String(
"commonName" ) ].toLower() ) {
701 if ( !d->mAddr.formattedName().isEmpty() ) {
702 QString fn = d->mAddr.formattedName();
703 d->mAddr.setNameFromString( QString::fromUtf8( value, value.size() ) );
704 d->mAddr.setFormattedName( fn );
706 d->mAddr.setNameFromString( QString::fromUtf8( value, value.size() ) );
708 }
else if ( name == d->mAttributes[ QLatin1String(
"formattedName" ) ].toLower() ) {
709 d->mAddr.setFormattedName( QString::fromUtf8( value, value.size() ) );
710 }
else if ( name == d->mAttributes[ QLatin1String(
"givenName" ) ].toLower() ) {
711 d->mAddr.setGivenName( QString::fromUtf8( value, value.size() ) );
712 }
else if ( name == d->mAttributes[ QLatin1String(
"mail" ) ].toLower() ) {
713 d->mAddr.insertEmail( QString::fromUtf8( value, value.size() ),
true );
714 }
else if ( name == d->mAttributes[ QLatin1String(
"mailAlias" ) ].toLower() ) {
715 d->mAddr.insertEmail( QString::fromUtf8( value, value.size() ),
false );
716 }
else if ( name == d->mAttributes[ QLatin1String(
"phoneNumber" ) ].toLower() ) {
718 phone.
setNumber( QString::fromUtf8( value, value.size() ) );
719 d->mAddr.insertPhoneNumber( phone );
720 }
else if ( name == d->mAttributes[ QLatin1String(
"telephoneNumber" ) ].toLower() ) {
721 PhoneNumber phone( QString::fromUtf8( value, value.size() ),
723 d->mAddr.insertPhoneNumber( phone );
725 d->mAttributes[ QLatin1String(
"facsimileTelephoneNumber" ) ].toLower() ) {
726 PhoneNumber phone( QString::fromUtf8( value, value.size() ),
728 d->mAddr.insertPhoneNumber( phone );
729 }
else if ( name == d->mAttributes[ QLatin1String(
"mobile" ) ].toLower() ) {
730 PhoneNumber phone( QString::fromUtf8( value, value.size() ),
732 d->mAddr.insertPhoneNumber( phone );
733 }
else if ( name == d->mAttributes[ QLatin1String(
"pager" ) ].toLower() ) {
734 PhoneNumber phone( QString::fromUtf8( value, value.size() ),
736 d->mAddr.insertPhoneNumber( phone );
737 }
else if ( name == d->mAttributes[ QLatin1String(
"description" ) ].toLower() ) {
738 d->mAddr.setNote( QString::fromUtf8( value, value.size() ) );
739 }
else if ( name == d->mAttributes[ QLatin1String(
"title" ) ].toLower() ) {
740 d->mAddr.setTitle( QString::fromUtf8( value, value.size() ) );
741 }
else if ( name == d->mAttributes[ QLatin1String(
"street" ) ].toLower() ) {
742 d->mAd.setStreet( QString::fromUtf8( value, value.size() ) );
743 }
else if ( name == d->mAttributes[ QLatin1String(
"state" ) ].toLower() ) {
744 d->mAd.setRegion( QString::fromUtf8( value, value.size() ) );
745 }
else if ( name == d->mAttributes[ QLatin1String(
"city" ) ].toLower() ) {
746 d->mAd.setLocality( QString::fromUtf8( value, value.size() ) );
747 }
else if ( name == d->mAttributes[ QLatin1String(
"postalcode" ) ].toLower() ) {
748 d->mAd.setPostalCode( QString::fromUtf8( value, value.size() ) );
749 }
else if ( name == d->mAttributes[ QLatin1String(
"organization" ) ].toLower() ) {
750 d->mAddr.setOrganization( QString::fromUtf8( value, value.size() ) );
751 }
else if ( name == d->mAttributes[ QLatin1String(
"familyName" ) ].toLower() ) {
752 d->mAddr.setFamilyName( QString::fromUtf8( value, value.size() ) );
753 }
else if ( name == d->mAttributes[ QLatin1String(
"uid" ) ].toLower() ) {
754 d->mAddr.setUid( QString::fromUtf8( value, value.size() ) );
755 }
else if ( name == d->mAttributes[ QLatin1String(
"jpegPhoto" ) ].toLower() ) {
756 if ( !value.isEmpty() ) {
758 photo.
setRawData( value, QLatin1String(
"jpeg" ) );
759 d->mAddr.setPhoto( photo );
764 case KLDAP::Ldif::EndEntry:
766 d->mAddr.setResource(
this );
767 d->mAddr.insertAddress( d->mAd );
768 d->mAddr.setChanged(
false );
769 insertAddressee( d->mAddr );
771 d->mAddr = Addressee();
778 }
while ( ret != KLDAP::Ldif::MoreData );
781 void ResourceLDAPKIO::loadCacheResult( KJob *job )
783 d->mErrorMsg.clear();
784 d->mError = job->error();
785 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
786 d->mErrorMsg = job->errorString();
788 if ( !d->mErrorMsg.isEmpty() ) {
789 emit loadingError(
this, d->mErrorMsg );
791 emit loadingFinished(
this );
795 void ResourceLDAPKIO::result( KJob *job )
797 d->mErrorMsg.clear();
799 d->mError = job->error();
800 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
801 d->mErrorMsg = job->errorString();
808 KIO::TransferJob *cjob;
809 cjob = d->loadFromCache();
811 connect( cjob, SIGNAL(result(KJob*)),
812 this, SLOT(loadCacheResult(KJob*)) );
814 if ( !d->mErrorMsg.isEmpty() ) {
815 emit loadingError(
this, d->mErrorMsg );
817 emit loadingFinished(
this );
822 bool ResourceLDAPKIO::save(
Ticket *ticket )
827 d->mSaveIt = begin();
828 KIO::TransferJob *job = KIO::put( d->mLDAPUrl, -1, KIO::Overwrite | KIO::HideProgressInfo );
829 connect( job, SIGNAL(dataReq(KIO::Job*,QByteArray&)),
830 this, SLOT(saveData(KIO::Job*,QByteArray&)) );
831 connect( job, SIGNAL(result(KJob*)),
832 this, SLOT(syncLoadSaveResult(KJob*)) );
834 if ( d->mErrorMsg.isEmpty() ) {
835 kDebug() <<
"ResourceLDAPKIO save ok!";
838 kDebug() <<
"ResourceLDAPKIO finished with error:" << d->mErrorMsg;
839 addressBook()->error( d->mErrorMsg );
844 bool ResourceLDAPKIO::asyncSave(
Ticket *ticket )
848 d->mSaveIt = begin();
849 KIO::TransferJob *job = KIO::put( d->mLDAPUrl, -1, KIO::Overwrite | KIO::HideProgressInfo );
850 connect( job, SIGNAL(dataReq(KIO::Job*,QByteArray&)),
851 this, SLOT(saveData(KIO::Job*,QByteArray&)) );
852 connect( job, SIGNAL(result(KJob*)),
853 this, SLOT(saveResult(KJob*)) );
857 void ResourceLDAPKIO::syncLoadSaveResult( KJob *job )
859 d->mError = job->error();
860 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
861 d->mErrorMsg = job->errorString();
863 d->mErrorMsg.clear();
867 emit leaveModality();
870 void ResourceLDAPKIO::saveResult( KJob *job )
872 d->mError = job->error();
873 if ( d->mError && d->mError != KIO::ERR_USER_CANCELED ) {
874 emit savingError(
this, job->errorString() );
876 emit savingFinished(
this );
880 void ResourceLDAPKIO::saveData( KIO::Job *job, QByteArray &data )
883 while ( d->mSaveIt != end() && !( *d->mSaveIt ).changed() ) {
887 if ( d->mSaveIt == end() ) {
888 kDebug() <<
"ResourceLDAPKIO endData";
893 kDebug() <<
"ResourceLDAPKIO saveData:" << ( *d->mSaveIt ).assembledName();
895 d->AddresseeToLDIF( data, *d->mSaveIt, d->findUid( ( *d->mSaveIt ).uid() ) );
898 ( *d->mSaveIt ).setChanged(
false );
903 void ResourceLDAPKIO::removeAddressee(
const Addressee &addr )
905 QString dn = d->findUid( addr.uid() );
909 if ( !d->mErrorMsg.isEmpty() ) {
910 addressBook()->error( d->mErrorMsg );
913 if ( !dn.isEmpty() ) {
914 kDebug() <<
"ResourceLDAPKIO: found uid:" << dn;
915 KLDAP::LdapUrl url( d->mLDAPUrl );
916 url.setPath( QLatin1Char(
'/' ) + dn );
917 url.setExtension( QLatin1String(
"x-dir" ), QLatin1String(
"base" ) );
918 url.setScope( KLDAP::LdapUrl::Base );
919 if ( KIO::NetAccess::del( url, 0 ) ) {
920 mAddrMap.remove( addr.uid() );
924 mAddrMap.remove( addr.uid() );
928 void ResourceLDAPKIO::setUser(
const QString &user )
933 QString ResourceLDAPKIO::user()
const
938 void ResourceLDAPKIO::setPassword(
const QString &password )
940 d->mPassword = password;
943 QString ResourceLDAPKIO::password()
const
948 void ResourceLDAPKIO::setDn(
const QString &dn )
953 QString ResourceLDAPKIO::dn()
const
958 void ResourceLDAPKIO::setHost(
const QString &host )
963 QString ResourceLDAPKIO::host()
const
968 void ResourceLDAPKIO::setPort(
int port )
973 int ResourceLDAPKIO::port()
const
978 void ResourceLDAPKIO::setVer(
int ver )
983 int ResourceLDAPKIO::ver()
const
988 void ResourceLDAPKIO::setSizeLimit(
int sizelimit )
990 d->mSizeLimit = sizelimit;
993 int ResourceLDAPKIO::sizeLimit()
995 return d->mSizeLimit;
998 void ResourceLDAPKIO::setTimeLimit(
int timelimit )
1000 d->mTimeLimit = timelimit;
1003 int ResourceLDAPKIO::timeLimit()
1005 return d->mTimeLimit;
1008 void ResourceLDAPKIO::setFilter(
const QString &filter )
1010 d->mFilter = filter;
1013 QString ResourceLDAPKIO::filter()
const
1018 void ResourceLDAPKIO::setIsAnonymous(
bool value )
1020 d->mAnonymous = value;
1023 bool ResourceLDAPKIO::isAnonymous()
const
1025 return d->mAnonymous;
1028 void ResourceLDAPKIO::setIsTLS(
bool value )
1033 bool ResourceLDAPKIO::isTLS()
const
1037 void ResourceLDAPKIO::setIsSSL(
bool value )
1042 bool ResourceLDAPKIO::isSSL()
const
1047 void ResourceLDAPKIO::setIsSubTree(
bool value )
1049 d->mSubTree = value;
1052 bool ResourceLDAPKIO::isSubTree()
const
1057 void ResourceLDAPKIO::setAttributes(
const QMap<QString, QString> &attributes )
1059 d->mAttributes = attributes;
1062 QMap<QString, QString> ResourceLDAPKIO::attributes()
const
1064 return d->mAttributes;
1067 void ResourceLDAPKIO::setRDNPrefix(
int value )
1069 d->mRDNPrefix = value;
1072 int ResourceLDAPKIO::RDNPrefix()
const
1074 return d->mRDNPrefix;
1077 void ResourceLDAPKIO::setIsSASL(
bool value )
1082 bool ResourceLDAPKIO::isSASL()
const
1087 void ResourceLDAPKIO::setMech(
const QString &mech )
1092 QString ResourceLDAPKIO::mech()
const
1097 void ResourceLDAPKIO::setRealm(
const QString &realm )
1102 QString ResourceLDAPKIO::realm()
const
1107 void ResourceLDAPKIO::setBindDN(
const QString &binddn )
1109 d->mBindDN = binddn;
1112 QString ResourceLDAPKIO::bindDN()
const
1117 void ResourceLDAPKIO::setCachePolicy(
int pol )
1119 d->mCachePolicy = pol;
1122 int ResourceLDAPKIO::cachePolicy()
const
1124 return d->mCachePolicy;
1127 void ResourceLDAPKIO::setAutoCache(
bool value )
1129 d->mAutoCache = value;
1132 bool ResourceLDAPKIO::autoCache()
1134 return d->mAutoCache;
1137 QString ResourceLDAPKIO::cacheDst()
const
1139 return d->mCacheDst;