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>
36#include <klocalizedstring.h>
38#include <kstringhandler.h>
39#include <ktemporaryfile.h>
41#include <QtCore/QBuffer>
42#include <QtCore/QEventLoop>
43#include <QtCore/QFile>
49class 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;
103ResourceLDAPKIO::ResourceLDAPKIO()
104 :
Resource(), d( new Private( this ) )
106 d->mCacheDst = KGlobal::dirs()->saveLocation(
"cache", QLatin1String(
"ldapkio" ) ) +
107 QLatin1Char(
'/' ) + type() + QLatin1Char(
'_' ) + identifier();
111ResourceLDAPKIO::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(
'/' ) +
142 type() + QLatin1Char(
'_' ) + identifier();
146ResourceLDAPKIO::~ResourceLDAPKIO()
151void ResourceLDAPKIO::Private::enter_loop()
153 QEventLoop eventLoop;
154 mParent->connect( mParent, SIGNAL(leaveModality()), &eventLoop, SLOT(quit()) );
155 eventLoop.exec( QEventLoop::ExcludeUserInputEvents );
158void 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 );
176void 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();
187QString 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*)) );
212QByteArray 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';
229bool 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" ) ] +
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" ) ],
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 );
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 );
373void ResourceLDAPKIO::setReadOnly(
bool value )
377 Resource::setReadOnly( value );
380void 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();
509void 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 );
543Ticket *ResourceLDAPKIO::requestSaveTicket()
545 if ( !addressBook() ) {
546 kDebug() <<
"no addressbook";
550 return createTicket(
this );
553void ResourceLDAPKIO::releaseSaveTicket(
Ticket *ticket )
558bool ResourceLDAPKIO::doOpen()
563void ResourceLDAPKIO::doClose()
567void ResourceLDAPKIO::Private::createCache()
570 if ( mCachePolicy == Cache_NoConnection && mAutoCache ) {
571 mTmp =
new KTemporaryFile;
572 mTmp->setPrefix( mCacheDst );
573 mTmp->setSuffix( QLatin1String(
"tmp" ) );
578void ResourceLDAPKIO::Private::activateCache()
580 if ( mTmp && mError == 0 ) {
581 QString filename = mTmp->fileName();
584 KDE_rename( QFile::encodeName( filename ), QFile::encodeName( mCacheDst ) );
588KIO::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)) );
611bool ResourceLDAPKIO::load()
614 KIO::TransferJob *job;
621 d->mLdif.startParsing();
624 Resource::setReadOnly( d->mReadOnly );
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 );
652bool ResourceLDAPKIO::asyncLoad()
659 d->mLdif.startParsing();
661 Resource::setReadOnly( d->mReadOnly );
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*)) );
676void 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 );
778 }
while ( ret != KLDAP::Ldif::MoreData );
781void 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 );
795void 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 );
822bool 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 );
844bool 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*)) );
857void 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();
870void 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 );
880void 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 );
903void 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() );
928void ResourceLDAPKIO::setUser(
const QString &user )
933QString ResourceLDAPKIO::user()
const
938void ResourceLDAPKIO::setPassword(
const QString &password )
940 d->mPassword = password;
943QString ResourceLDAPKIO::password()
const
948void ResourceLDAPKIO::setDn(
const QString &dn )
953QString ResourceLDAPKIO::dn()
const
958void ResourceLDAPKIO::setHost(
const QString &host )
963QString ResourceLDAPKIO::host()
const
968void ResourceLDAPKIO::setPort(
int port )
973int ResourceLDAPKIO::port()
const
978void ResourceLDAPKIO::setVer(
int ver )
983int ResourceLDAPKIO::ver()
const
988void ResourceLDAPKIO::setSizeLimit(
int sizelimit )
990 d->mSizeLimit = sizelimit;
993int ResourceLDAPKIO::sizeLimit()
995 return d->mSizeLimit;
998void ResourceLDAPKIO::setTimeLimit(
int timelimit )
1000 d->mTimeLimit = timelimit;
1003int ResourceLDAPKIO::timeLimit()
1005 return d->mTimeLimit;
1008void ResourceLDAPKIO::setFilter(
const QString &filter )
1010 d->mFilter = filter;
1013QString ResourceLDAPKIO::filter()
const
1018void ResourceLDAPKIO::setIsAnonymous(
bool value )
1020 d->mAnonymous = value;
1023bool ResourceLDAPKIO::isAnonymous()
const
1025 return d->mAnonymous;
1028void ResourceLDAPKIO::setIsTLS(
bool value )
1033bool ResourceLDAPKIO::isTLS()
const
1037void ResourceLDAPKIO::setIsSSL(
bool value )
1042bool ResourceLDAPKIO::isSSL()
const
1047void ResourceLDAPKIO::setIsSubTree(
bool value )
1049 d->mSubTree = value;
1052bool ResourceLDAPKIO::isSubTree()
const
1057void ResourceLDAPKIO::setAttributes(
const QMap<QString, QString> &attributes )
1059 d->mAttributes = attributes;
1062QMap<QString, QString> ResourceLDAPKIO::attributes()
const
1064 return d->mAttributes;
1067void ResourceLDAPKIO::setRDNPrefix(
int value )
1069 d->mRDNPrefix = value;
1072int ResourceLDAPKIO::RDNPrefix()
const
1074 return d->mRDNPrefix;
1077void ResourceLDAPKIO::setIsSASL(
bool value )
1082bool ResourceLDAPKIO::isSASL()
const
1087void ResourceLDAPKIO::setMech(
const QString &mech )
1092QString ResourceLDAPKIO::mech()
const
1097void ResourceLDAPKIO::setRealm(
const QString &realm )
1102QString ResourceLDAPKIO::realm()
const
1107void ResourceLDAPKIO::setBindDN(
const QString &binddn )
1109 d->mBindDN = binddn;
1112QString ResourceLDAPKIO::bindDN()
const
1117void ResourceLDAPKIO::setCachePolicy(
int pol )
1119 d->mCachePolicy = pol;
1122int ResourceLDAPKIO::cachePolicy()
const
1124 return d->mCachePolicy;
1127void ResourceLDAPKIO::setAutoCache(
bool value )
1129 d->mAutoCache = value;
1132bool ResourceLDAPKIO::autoCache()
1134 return d->mAutoCache;
1137QString ResourceLDAPKIO::cacheDst()
const
1139 return d->mCacheDst;
Postal address information.
QString street() const
Returns the street.
bool isEmpty() const
Returns true, if the address is empty.
QString region() const
Returns the region.
QString locality() const
Returns the locality.
QString postalCode() const
Returns the postal code.
QString familyName() const
Return family name.
QStringList emails() const
Return list of all email addresses.
QString organization() const
Return organization.
Picture photo() const
Return photo.
Address address(Address::Type type) const
Return address, which matches the given type.
QString note() const
Return note.
PhoneNumber phoneNumber(PhoneNumber::Type type) const
Return phone number, which matches the given type.
QString title() const
Return title.
QString assembledName() const
Return the name that consists of all name parts.
QString formattedName() const
Return formatted name.
QString givenName() const
Return given name.
QString uid() const
Return unique identifier.
void setNumber(const QString &number)
Sets the phone number.
QString number() const
Returns the phone number.
A class to store a picture of an addressee.
QImage data() const
Returns the image data of this picture.
void setRawData(const QByteArray &rawData, const QString &type)
Sets the raw data of the picture.
virtual void writeConfig(KConfigGroup &group)
Writes the resource specific config to file.
Helper class for handling coordinated save of address books.
Class that holds a Calendar Url (FBURL/CALADRURI/CALURI)