• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeabc
 

tdeabc

  • tdeabc
  • plugins
  • ldaptdeio
resourceldaptdeio.cpp
1/*
2 This file is part of libtdeabc.
3 Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
4 Copyright (c) 2004 Szombathelyi György <gyurco@freemail.hu>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
15
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.
20*/
21
22
23#include <tqapplication.h>
24#include <tqbuffer.h>
25#include <tqfile.h>
26
27#include <kdebug.h>
28#include <tdeglobal.h>
29#include <tdestandarddirs.h>
30#include <klineedit.h>
31#include <tdelocale.h>
32#include <tdeconfig.h>
33#include <kstringhandler.h>
34#include <tdetempfile.h>
35
36#include <stdlib.h>
37#include <tdeio/netaccess.h>
38#include <tdeabc/ldif.h>
39#include <tdeabc/ldapurl.h>
40
41#include "resourceldaptdeio.h"
42#include "resourceldaptdeioconfig.h"
43
44using namespace TDEABC;
45
46// Hack from Netaccess
47void tqt_enter_modal( TQWidget *widget );
48void tqt_leave_modal( TQWidget *widget );
49
50class ResourceLDAPTDEIO::ResourceLDAPTDEIOPrivate
51{
52 public:
53 LDIF mLdif;
54 bool mTLS,mSSL,mSubTree;
55 TQString mResultDn;
56 Addressee mAddr;
57 Address mAd;
58 Resource::Iterator mSaveIt;
59 bool mSASL;
60 TQString mMech;
61 TQString mRealm, mBindDN;
62 LDAPUrl mLDAPUrl;
63 int mVer, mSizeLimit, mTimeLimit, mRDNPrefix;
64 int mError;
65 int mCachePolicy;
66 bool mReadOnly;
67 bool mAutoCache;
68 TQString mCacheDst;
69 KTempFile *mTmp;
70};
71
72ResourceLDAPTDEIO::ResourceLDAPTDEIO( const TDEConfig *config )
73 : Resource( config )
74{
75 d = new ResourceLDAPTDEIOPrivate;
76 if ( config ) {
77 TQMap<TQString, TQString> attrList;
78 TQStringList attributes = config->readListEntry( "LdapAttributes" );
79 for ( uint pos = 0; pos < attributes.count(); pos += 2 )
80 mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] );
81
82 mUser = config->readEntry( "LdapUser" );
83 mPassword = KStringHandler::obscure( config->readEntry( "LdapPassword" ) );
84 mDn = config->readEntry( "LdapDn" );
85 mHost = config->readEntry( "LdapHost" );
86 mPort = config->readNumEntry( "LdapPort", 389 );
87 mFilter = config->readEntry( "LdapFilter" );
88 mAnonymous = config->readBoolEntry( "LdapAnonymous" );
89 d->mTLS = config->readBoolEntry( "LdapTLS" );
90 d->mSSL = config->readBoolEntry( "LdapSSL" );
91 d->mSubTree = config->readBoolEntry( "LdapSubTree" );
92 d->mSASL = config->readBoolEntry( "LdapSASL" );
93 d->mMech = config->readEntry( "LdapMech" );
94 d->mRealm = config->readEntry( "LdapRealm" );
95 d->mBindDN = config->readEntry( "LdapBindDN" );
96 d->mVer = config->readNumEntry( "LdapVer", 3 );
97 d->mTimeLimit = config->readNumEntry( "LdapTimeLimit", 0 );
98 d->mSizeLimit = config->readNumEntry( "LdapSizeLimit", 0 );
99 d->mRDNPrefix = config->readNumEntry( "LdapRDNPrefix", 0 );
100 d->mCachePolicy = config->readNumEntry( "LdapCachePolicy", 0 );
101 d->mAutoCache = config->readBoolEntry( "LdapAutoCache", true );
102 } else {
103 mPort = 389;
104 mAnonymous = true;
105 mUser = mPassword = mHost = mFilter = mDn = "";
106 d->mMech = d->mRealm = d->mBindDN = "";
107 d->mTLS = d->mSSL = d->mSubTree = d->mSASL = false;
108 d->mVer = 3; d->mRDNPrefix = 0;
109 d->mTimeLimit = d->mSizeLimit = 0;
110 d->mCachePolicy = Cache_No;
111 d->mAutoCache = true;
112 }
113 d->mCacheDst = TDEGlobal::dirs()->saveLocation("cache", "ldaptdeio") + "/" +
114 type() + "_" + identifier();
115 init();
116}
117
118ResourceLDAPTDEIO::~ResourceLDAPTDEIO()
119{
120 delete d;
121}
122
123void ResourceLDAPTDEIO::enter_loop()
124{
125 TQWidget dummy(0,0,(WFlags)(WType_Dialog | WShowModal));
126 dummy.setFocusPolicy( TQWidget::NoFocus );
127 tqt_enter_modal(&dummy);
128 tqApp->enter_loop();
129 tqt_leave_modal(&dummy);
130}
131
132void ResourceLDAPTDEIO::entries( TDEIO::Job*, const TDEIO::UDSEntryList & list )
133{
134 TDEIO::UDSEntryListConstIterator it = list.begin();
135 TDEIO::UDSEntryListConstIterator end = list.end();
136 for (; it != end; ++it) {
137 TDEIO::UDSEntry::ConstIterator it2 = (*it).begin();
138 for( ; it2 != (*it).end(); it2++ ) {
139 if ( (*it2).m_uds == TDEIO::UDS_URL ) {
140 KURL tmpurl( (*it2).m_str );
141 d->mResultDn = tmpurl.path();
142 kdDebug(7125) << "findUid(): " << d->mResultDn << endl;
143 if ( d->mResultDn.startsWith("/") ) d->mResultDn.remove(0,1);
144 return;
145 }
146 }
147 }
148}
149
150void ResourceLDAPTDEIO::listResult( TDEIO::Job *job)
151{
152 d->mError = job->error();
153 if ( d->mError && d->mError != TDEIO::ERR_USER_CANCELED )
154 mErrorMsg = job->errorString();
155 else
156 mErrorMsg = "";
157 tqApp->exit_loop();
158}
159
160TQString ResourceLDAPTDEIO::findUid( const TQString &uid )
161{
162 LDAPUrl url( d->mLDAPUrl );
163 TDEIO::UDSEntry entry;
164
165 mErrorMsg = d->mResultDn = "";
166
167 url.setAttributes("dn");
168 url.setFilter( "(" + mAttributes[ "uid" ] + "=" + uid + ")" + mFilter );
169 url.setExtension( "x-dir", "one" );
170
171 kdDebug(7125) << "ResourceLDAPTDEIO::findUid() uid: " << uid << " url " <<
172 url.prettyURL() << endl;
173
174 TDEIO::ListJob * listJob = TDEIO::listDir( url, false /* no GUI */ );
175 connect( listJob,
176 TQ_SIGNAL( entries( TDEIO::Job *, const TDEIO::UDSEntryList& ) ),
177 TQ_SLOT( entries( TDEIO::Job*, const TDEIO::UDSEntryList& ) ) );
178 connect( listJob, TQ_SIGNAL( result( TDEIO::Job* ) ),
179 this, TQ_SLOT( listResult( TDEIO::Job* ) ) );
180
181 enter_loop();
182 return d->mResultDn;
183}
184
185TQCString ResourceLDAPTDEIO::addEntry( const TQString &attr, const TQString &value, bool mod )
186{
187 TQCString tmp;
188 if ( !attr.isEmpty() ) {
189 if ( mod ) tmp += LDIF::assembleLine( "replace", attr ) + "\n";
190 tmp += LDIF::assembleLine( attr, value ) + "\n";
191 if ( mod ) tmp += "-\n";
192 }
193 return ( tmp );
194}
195
196bool ResourceLDAPTDEIO::AddresseeToLDIF( TQByteArray &ldif, const Addressee &addr,
197 const TQString &olddn )
198{
199 TQCString tmp;
200 TQString dn;
201 TQByteArray data;
202 bool mod = false;
203
204 if ( olddn.isEmpty() ) {
205 //insert new entry
206 switch ( d->mRDNPrefix ) {
207 case 1:
208 dn = mAttributes[ "uid" ] + "=" + addr.uid() + "," +mDn;
209 break;
210 case 0:
211 default:
212 dn = mAttributes[ "commonName" ] + "=" + addr.assembledName() + "," +mDn;
213 break;
214 }
215 } else {
216 //modify existing entry
217 mod = true;
218 if ( olddn.startsWith( mAttributes[ "uid" ] ) ) {
219 dn = mAttributes[ "uid" ] + "=" + addr.uid() + "," + olddn.section( ',', 1 );
220 } else if ( olddn.startsWith( mAttributes[ "commonName" ] ) ) {
221 dn = mAttributes[ "commonName" ] + "=" + addr.assembledName() + "," +
222 olddn.section( ',', 1 );
223 } else {
224 dn = olddn;
225 }
226
227 if ( olddn.lower() != dn.lower() ) {
228 tmp = LDIF::assembleLine( "dn", olddn ) + "\n";
229 tmp += "changetype: modrdn\n";
230 tmp += LDIF::assembleLine( "newrdn", dn.section( ',', 0, 0 ) ) + "\n";
231 tmp += "deleteoldrdn: 1\n\n";
232 }
233 }
234
235
236 tmp += LDIF::assembleLine( "dn", dn ) + "\n";
237 if ( mod ) tmp += "changetype: modify\n";
238 if ( !mod ) {
239 tmp += "objectClass: top\n";
240 TQStringList obclass = TQStringList::split( ',', mAttributes[ "objectClass" ] );
241 for ( TQStringList::iterator it = obclass.begin(); it != obclass.end(); it++ ) {
242 tmp += LDIF::assembleLine( "objectClass", *it ) + "\n";
243 }
244 }
245
246 tmp += addEntry( mAttributes[ "commonName" ], addr.assembledName(), mod );
247 tmp += addEntry( mAttributes[ "formattedName" ], addr.formattedName(), mod );
248 tmp += addEntry( mAttributes[ "givenName" ], addr.givenName(), mod );
249 tmp += addEntry( mAttributes[ "familyName" ], addr.familyName(), mod );
250 tmp += addEntry( mAttributes[ "uid" ], addr.uid(), mod );
251
252 PhoneNumber number;
253 number = addr.phoneNumber( PhoneNumber::Home );
254 tmp += addEntry( mAttributes[ "phoneNumber" ], number.number().utf8(), mod );
255 number = addr.phoneNumber( PhoneNumber::Work );
256 tmp += addEntry( mAttributes[ "telephoneNumber" ], number.number().utf8(), mod );
257 number = addr.phoneNumber( PhoneNumber::Fax );
258 tmp += addEntry( mAttributes[ "facsimileTelephoneNumber" ], number.number().utf8(), mod );
259 number = addr.phoneNumber( PhoneNumber::Cell );
260 tmp += addEntry( mAttributes[ "mobile" ], number.number().utf8(), mod );
261 number = addr.phoneNumber( PhoneNumber::Pager );
262 tmp += addEntry( mAttributes[ "pager" ], number.number().utf8(), mod );
263
264 tmp += addEntry( mAttributes[ "description" ], addr.note(), mod );
265 tmp += addEntry( mAttributes[ "title" ], addr.title(), mod );
266 tmp += addEntry( mAttributes[ "organization" ], addr.organization(), mod );
267
268 Address ad = addr.address( Address::Home );
269 if ( !ad.isEmpty() ) {
270 tmp += addEntry( mAttributes[ "street" ], ad.street(), mod );
271 tmp += addEntry( mAttributes[ "state" ], ad.region(), mod );
272 tmp += addEntry( mAttributes[ "city" ], ad.locality(), mod );
273 tmp += addEntry( mAttributes[ "postalcode" ], ad.postalCode(), mod );
274 }
275
276 TQStringList emails = addr.emails();
277 TQStringList::ConstIterator mailIt = emails.begin();
278
279 if ( !mAttributes[ "mail" ].isEmpty() ) {
280 if ( mod ) tmp +=
281 LDIF::assembleLine( "replace", mAttributes[ "mail" ] ) + "\n";
282 if ( mailIt != emails.end() ) {
283 tmp += LDIF::assembleLine( mAttributes[ "mail" ], *mailIt ) + "\n";
284 mailIt ++;
285 }
286 if ( mod && mAttributes[ "mail" ] != mAttributes[ "mailAlias" ] ) tmp += "-\n";
287 }
288
289 if ( !mAttributes[ "mailAlias" ].isEmpty() ) {
290 if ( mod && mAttributes[ "mail" ] != mAttributes[ "mailAlias" ] ) tmp +=
291 LDIF::assembleLine( "replace", mAttributes[ "mailAlias" ] ) + "\n";
292 for ( ; mailIt != emails.end(); ++mailIt ) {
293 tmp += LDIF::assembleLine( mAttributes[ "mailAlias" ], *mailIt ) + "\n" ;
294 }
295 if ( mod ) tmp += "-\n";
296 }
297
298 if ( !mAttributes[ "jpegPhoto" ].isEmpty() ) {
299 TQByteArray pic;
300 TQBuffer buffer( pic );
301 buffer.open( IO_WriteOnly );
302 addr.photo().data().save( &buffer, "JPEG" );
303
304 if ( mod ) tmp +=
305 LDIF::assembleLine( "replace", mAttributes[ "jpegPhoto" ] ) + "\n";
306 tmp += LDIF::assembleLine( mAttributes[ "jpegPhoto" ], pic, 76 ) + "\n";
307 if ( mod ) tmp += "-\n";
308 }
309
310 tmp += "\n";
311 kdDebug(7125) << "ldif: " << TQString(TQString::fromUtf8(tmp)) << endl;
312 ldif = tmp;
313 return true;
314}
315
316void ResourceLDAPTDEIO::setReadOnly( bool value )
317{
318 //save the original readonly flag, because offline using disables writing
319 d->mReadOnly = true;
320 Resource::setReadOnly( value );
321}
322
323void ResourceLDAPTDEIO::init()
324{
325 if ( mPort == 0 ) mPort = 389;
326
333 if ( !mAttributes.contains("objectClass") )
334 mAttributes.insert( "objectClass", "inetOrgPerson" );
335 if ( !mAttributes.contains("commonName") )
336 mAttributes.insert( "commonName", "cn" );
337 if ( !mAttributes.contains("formattedName") )
338 mAttributes.insert( "formattedName", "displayName" );
339 if ( !mAttributes.contains("familyName") )
340 mAttributes.insert( "familyName", "sn" );
341 if ( !mAttributes.contains("givenName") )
342 mAttributes.insert( "givenName", "givenName" );
343 if ( !mAttributes.contains("mail") )
344 mAttributes.insert( "mail", "mail" );
345 if ( !mAttributes.contains("mailAlias") )
346 mAttributes.insert( "mailAlias", "" );
347 if ( !mAttributes.contains("phoneNumber") )
348 mAttributes.insert( "phoneNumber", "homePhone" );
349 if ( !mAttributes.contains("telephoneNumber") )
350 mAttributes.insert( "telephoneNumber", "telephoneNumber" );
351 if ( !mAttributes.contains("facsimileTelephoneNumber") )
352 mAttributes.insert( "facsimileTelephoneNumber", "facsimileTelephoneNumber" );
353 if ( !mAttributes.contains("mobile") )
354 mAttributes.insert( "mobile", "mobile" );
355 if ( !mAttributes.contains("pager") )
356 mAttributes.insert( "pager", "pager" );
357 if ( !mAttributes.contains("description") )
358 mAttributes.insert( "description", "description" );
359
360 if ( !mAttributes.contains("title") )
361 mAttributes.insert( "title", "title" );
362 if ( !mAttributes.contains("street") )
363 mAttributes.insert( "street", "street" );
364 if ( !mAttributes.contains("state") )
365 mAttributes.insert( "state", "st" );
366 if ( !mAttributes.contains("city") )
367 mAttributes.insert( "city", "l" );
368 if ( !mAttributes.contains("organization") )
369 mAttributes.insert( "organization", "o" );
370 if ( !mAttributes.contains("postalcode") )
371 mAttributes.insert( "postalcode", "postalCode" );
372
373 if ( !mAttributes.contains("uid") )
374 mAttributes.insert( "uid", "uid" );
375 if ( !mAttributes.contains("jpegPhoto") )
376 mAttributes.insert( "jpegPhoto", "jpegPhoto" );
377
378 d->mLDAPUrl = KURL();
379 if ( !mAnonymous ) {
380 d->mLDAPUrl.setUser( mUser );
381 d->mLDAPUrl.setPass( mPassword );
382 }
383 d->mLDAPUrl.setProtocol( d->mSSL ? "ldaps" : "ldap");
384 d->mLDAPUrl.setHost( mHost );
385 d->mLDAPUrl.setPort( mPort );
386 d->mLDAPUrl.setDn( mDn );
387
388 if (!mAttributes.empty()) {
389 TQMap<TQString,TQString>::Iterator it;
390 TQStringList attr;
391 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) {
392 if ( !it.data().isEmpty() && it.key() != "objectClass" )
393 attr.append( it.data() );
394 }
395 d->mLDAPUrl.setAttributes( attr );
396 }
397
398 d->mLDAPUrl.setScope( d->mSubTree ? LDAPUrl::Sub : LDAPUrl::One );
399 if ( !mFilter.isEmpty() && mFilter != "(objectClass=*)" )
400 d->mLDAPUrl.setFilter( mFilter );
401 d->mLDAPUrl.setExtension( "x-dir", "base" );
402 if ( d->mTLS ) d->mLDAPUrl.setExtension( "x-tls", "" );
403 d->mLDAPUrl.setExtension( "x-ver", TQString::number( d->mVer ) );
404 if ( d->mSizeLimit )
405 d->mLDAPUrl.setExtension( "x-sizelimit", TQString::number( d->mSizeLimit ) );
406 if ( d->mTimeLimit )
407 d->mLDAPUrl.setExtension( "x-timelimit", TQString::number( d->mTimeLimit ) );
408 if ( d->mSASL ) {
409 d->mLDAPUrl.setExtension( "x-sasl", "" );
410 if ( !d->mBindDN.isEmpty() ) d->mLDAPUrl.setExtension( "bindname", d->mBindDN );
411 if ( !d->mMech.isEmpty() ) d->mLDAPUrl.setExtension( "x-mech", d->mMech );
412 if ( !d->mRealm.isEmpty() ) d->mLDAPUrl.setExtension( "x-realm", d->mRealm );
413 }
414
415 d->mReadOnly = readOnly();
416
417 kdDebug(7125) << "resource_ldaptdeio url: " << d->mLDAPUrl.prettyURL() << endl;
418}
419
420void ResourceLDAPTDEIO::writeConfig( TDEConfig *config )
421{
422 Resource::writeConfig( config );
423
424 config->writeEntry( "LdapUser", mUser );
425 config->writeEntry( "LdapPassword", KStringHandler::obscure( mPassword ) );
426 config->writeEntry( "LdapDn", mDn );
427 config->writeEntry( "LdapHost", mHost );
428 config->writeEntry( "LdapPort", mPort );
429 config->writeEntry( "LdapFilter", mFilter );
430 config->writeEntry( "LdapAnonymous", mAnonymous );
431 config->writeEntry( "LdapTLS", d->mTLS );
432 config->writeEntry( "LdapSSL", d->mSSL );
433 config->writeEntry( "LdapSubTree", d->mSubTree );
434 config->writeEntry( "LdapSASL", d->mSASL );
435 config->writeEntry( "LdapMech", d->mMech );
436 config->writeEntry( "LdapVer", d->mVer );
437 config->writeEntry( "LdapTimeLimit", d->mTimeLimit );
438 config->writeEntry( "LdapSizeLimit", d->mSizeLimit );
439 config->writeEntry( "LdapRDNPrefix", d->mRDNPrefix );
440 config->writeEntry( "LdapRealm", d->mRealm );
441 config->writeEntry( "LdapBindDN", d->mBindDN );
442 config->writeEntry( "LdapCachePolicy", d->mCachePolicy );
443 config->writeEntry( "LdapAutoCache", d->mAutoCache );
444
445 TQStringList attributes;
446 TQMap<TQString, TQString>::Iterator it;
447 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it )
448 attributes << it.key() << it.data();
449
450 config->writeEntry( "LdapAttributes", attributes );
451}
452
453Ticket *ResourceLDAPTDEIO::requestSaveTicket()
454{
455 if ( !addressBook() ) {
456 kdDebug(7125) << "no addressbook" << endl;
457 return 0;
458 }
459
460 return createTicket( this );
461}
462
463void ResourceLDAPTDEIO::releaseSaveTicket( Ticket *ticket )
464{
465 delete ticket;
466}
467
468bool ResourceLDAPTDEIO::doOpen()
469{
470 return true;
471}
472
473void ResourceLDAPTDEIO::doClose()
474{
475}
476
477void ResourceLDAPTDEIO::createCache()
478{
479 d->mTmp = NULL;
480 if ( d->mCachePolicy == Cache_NoConnection && d->mAutoCache ) {
481 d->mTmp = new KTempFile( d->mCacheDst, "tmp" );
482 d->mTmp->setAutoDelete( true );
483 }
484}
485
486void ResourceLDAPTDEIO::activateCache()
487{
488 if ( d->mTmp && d->mError == 0 ) {
489 d->mTmp->close();
490 rename( TQFile::encodeName( d->mTmp->name() ), TQFile::encodeName( d->mCacheDst ) );
491 }
492 if ( d->mTmp ) {
493 delete d->mTmp;
494 d->mTmp = 0;
495 }
496}
497
498TDEIO::Job *ResourceLDAPTDEIO::loadFromCache()
499{
500 TDEIO::Job *job = NULL;
501 if ( d->mCachePolicy == Cache_Always ||
502 ( d->mCachePolicy == Cache_NoConnection &&
503 d->mError == TDEIO::ERR_COULD_NOT_CONNECT ) ) {
504
505 d->mAddr = Addressee();
506 d->mAd = Address( Address::Home );
507 //initialize ldif parser
508 d->mLdif.startParsing();
509
510 Resource::setReadOnly( true );
511
512 KURL url( d->mCacheDst );
513 job = TDEIO::get( url, true, false );
514 connect( job, TQ_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ),
515 this, TQ_SLOT( data( TDEIO::Job*, const TQByteArray& ) ) );
516 }
517 return job;
518}
519
520bool ResourceLDAPTDEIO::load()
521{
522 kdDebug(7125) << "ResourceLDAPTDEIO::load()" << endl;
523 TDEIO::Job *job;
524
525 clear();
526 //clear the addressee
527 d->mAddr = Addressee();
528 d->mAd = Address( Address::Home );
529 //initialize ldif parser
530 d->mLdif.startParsing();
531
532 //set to original settings, offline use will disable writing
533 Resource::setReadOnly( d->mReadOnly );
534
535 createCache();
536 if ( d->mCachePolicy != Cache_Always ) {
537 job = TDEIO::get( d->mLDAPUrl, true, false );
538 connect( job, TQ_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ),
539 this, TQ_SLOT( data( TDEIO::Job*, const TQByteArray& ) ) );
540 connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ),
541 this, TQ_SLOT( syncLoadSaveResult( TDEIO::Job* ) ) );
542 enter_loop();
543 }
544
545 job = loadFromCache();
546 if ( job ) {
547 connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ),
548 this, TQ_SLOT( syncLoadSaveResult( TDEIO::Job* ) ) );
549 enter_loop();
550 }
551 if ( mErrorMsg.isEmpty() ) {
552 kdDebug(7125) << "ResourceLDAPTDEIO load ok!" << endl;
553 return true;
554 } else {
555 kdDebug(7125) << "ResourceLDAPTDEIO load finished with error: " << mErrorMsg << endl;
556 addressBook()->error( mErrorMsg );
557 return false;
558 }
559}
560
561bool ResourceLDAPTDEIO::asyncLoad()
562{
563 clear();
564 //clear the addressee
565 d->mAddr = Addressee();
566 d->mAd = Address( Address::Home );
567 //initialize ldif parser
568 d->mLdif.startParsing();
569
570 Resource::setReadOnly( d->mReadOnly );
571
572 createCache();
573 if ( d->mCachePolicy != Cache_Always ) {
574 TDEIO::Job *job = TDEIO::get( d->mLDAPUrl, true, false );
575 connect( job, TQ_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ),
576 this, TQ_SLOT( data( TDEIO::Job*, const TQByteArray& ) ) );
577 connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ),
578 this, TQ_SLOT( result( TDEIO::Job* ) ) );
579 } else {
580 result( NULL );
581 }
582 return true;
583}
584
585void ResourceLDAPTDEIO::data( TDEIO::Job *, const TQByteArray &data )
586{
587 if ( data.size() ) {
588 d->mLdif.setLDIF( data );
589 if ( d->mTmp ) {
590 d->mTmp->file()->writeBlock( data );
591 }
592 } else {
593 d->mLdif.endLDIF();
594 }
595
596 LDIF::ParseVal ret;
597 TQString name;
598 TQByteArray value;
599 do {
600 ret = d->mLdif.nextItem();
601 switch ( ret ) {
602 case LDIF::NewEntry:
603 kdDebug(7125) << "new entry: " << d->mLdif.dn() << endl;
604 break;
605 case LDIF::Item:
606 name = d->mLdif.attr().lower();
607 value = d->mLdif.val();
608 if ( name == mAttributes[ "commonName" ].lower() ) {
609 if ( !d->mAddr.formattedName().isEmpty() ) {
610 TQString fn = d->mAddr.formattedName();
611 d->mAddr.setNameFromString( TQString::fromUtf8( value, value.size() ) );
612 d->mAddr.setFormattedName( fn );
613 } else
614 d->mAddr.setNameFromString( TQString::fromUtf8( value, value.size() ) );
615 } else if ( name == mAttributes[ "formattedName" ].lower() ) {
616 d->mAddr.setFormattedName( TQString::fromUtf8( value, value.size() ) );
617 } else if ( name == mAttributes[ "givenName" ].lower() ) {
618 d->mAddr.setGivenName( TQString::fromUtf8( value, value.size() ) );
619 } else if ( name == mAttributes[ "mail" ].lower() ) {
620 d->mAddr.insertEmail( TQString::fromUtf8( value, value.size() ), true );
621 } else if ( name == mAttributes[ "mailAlias" ].lower() ) {
622 d->mAddr.insertEmail( TQString::fromUtf8( value, value.size() ), false );
623 } else if ( name == mAttributes[ "phoneNumber" ].lower() ) {
624 PhoneNumber phone;
625 phone.setNumber( TQString::fromUtf8( value, value.size() ) );
626 d->mAddr.insertPhoneNumber( phone );
627 } else if ( name == mAttributes[ "telephoneNumber" ].lower() ) {
628 PhoneNumber phone( TQString::fromUtf8( value, value.size() ),
629 PhoneNumber::Work );
630 d->mAddr.insertPhoneNumber( phone );
631 } else if ( name == mAttributes[ "facsimileTelephoneNumber" ].lower() ) {
632 PhoneNumber phone( TQString::fromUtf8( value, value.size() ),
633 PhoneNumber::Fax );
634 d->mAddr.insertPhoneNumber( phone );
635 } else if ( name == mAttributes[ "mobile" ].lower() ) {
636 PhoneNumber phone( TQString::fromUtf8( value, value.size() ),
637 PhoneNumber::Cell );
638 d->mAddr.insertPhoneNumber( phone );
639 } else if ( name == mAttributes[ "pager" ].lower() ) {
640 PhoneNumber phone( TQString::fromUtf8( value, value.size() ),
641 PhoneNumber::Pager );
642 d->mAddr.insertPhoneNumber( phone );
643 } else if ( name == mAttributes[ "description" ].lower() ) {
644 d->mAddr.setNote( TQString::fromUtf8( value, value.size() ) );
645 } else if ( name == mAttributes[ "title" ].lower() ) {
646 d->mAddr.setTitle( TQString::fromUtf8( value, value.size() ) );
647 } else if ( name == mAttributes[ "street" ].lower() ) {
648 d->mAd.setStreet( TQString::fromUtf8( value, value.size() ) );
649 } else if ( name == mAttributes[ "state" ].lower() ) {
650 d->mAd.setRegion( TQString::fromUtf8( value, value.size() ) );
651 } else if ( name == mAttributes[ "city" ].lower() ) {
652 d->mAd.setLocality( TQString::fromUtf8( value, value.size() ) );
653 } else if ( name == mAttributes[ "postalcode" ].lower() ) {
654 d->mAd.setPostalCode( TQString::fromUtf8( value, value.size() ) );
655 } else if ( name == mAttributes[ "organization" ].lower() ) {
656 d->mAddr.setOrganization( TQString::fromUtf8( value, value.size() ) );
657 } else if ( name == mAttributes[ "familyName" ].lower() ) {
658 d->mAddr.setFamilyName( TQString::fromUtf8( value, value.size() ) );
659 } else if ( name == mAttributes[ "uid" ].lower() ) {
660 d->mAddr.setUid( TQString::fromUtf8( value, value.size() ) );
661 } else if ( name == mAttributes[ "jpegPhoto" ].lower() ) {
662 TDEABC::Picture photo;
663 TQImage img( value );
664 if ( !img.isNull() ) {
665 photo.setData( img );
666 photo.setType( "image/jpeg" );
667 d->mAddr.setPhoto( photo );
668 }
669 }
670
671 break;
672 case LDIF::EndEntry: {
673 d->mAddr.setResource( this );
674 d->mAddr.insertAddress( d->mAd );
675 d->mAddr.setChanged( false );
676 insertAddressee( d->mAddr );
677 //clear the addressee
678 d->mAddr = Addressee();
679 d->mAd = Address( Address::Home );
680 }
681 break;
682 default:
683 break;
684 }
685 } while ( ret != LDIF::MoreData );
686}
687
688void ResourceLDAPTDEIO::loadCacheResult( TDEIO::Job *job )
689{
690 mErrorMsg = "";
691 d->mError = job->error();
692 if ( d->mError && d->mError != TDEIO::ERR_USER_CANCELED ) {
693 mErrorMsg = job->errorString();
694 }
695 if ( !mErrorMsg.isEmpty() )
696 emit loadingError( this, mErrorMsg );
697 else
698 emit loadingFinished( this );
699}
700
701void ResourceLDAPTDEIO::result( TDEIO::Job *job )
702{
703 mErrorMsg = "";
704 if ( job ) {
705 d->mError = job->error();
706 if ( d->mError && d->mError != TDEIO::ERR_USER_CANCELED ) {
707 mErrorMsg = job->errorString();
708 }
709 } else {
710 d->mError = 0;
711 }
712 activateCache();
713
714 TDEIO::Job *cjob;
715 cjob = loadFromCache();
716 if ( cjob ) {
717 connect( cjob, TQ_SIGNAL( result( TDEIO::Job* ) ),
718 this, TQ_SLOT( loadCacheResult( TDEIO::Job* ) ) );
719 } else {
720 if ( !mErrorMsg.isEmpty() )
721 emit loadingError( this, mErrorMsg );
722 else
723 emit loadingFinished( this );
724 }
725}
726
727bool ResourceLDAPTDEIO::save( Ticket* )
728{
729 kdDebug(7125) << "ResourceLDAPTDEIO save" << endl;
730
731 d->mSaveIt = begin();
732 TDEIO::Job *job = TDEIO::put( d->mLDAPUrl, -1, true, false, false );
733 connect( job, TQ_SIGNAL( dataReq( TDEIO::Job*, TQByteArray& ) ),
734 this, TQ_SLOT( saveData( TDEIO::Job*, TQByteArray& ) ) );
735 connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ),
736 this, TQ_SLOT( syncLoadSaveResult( TDEIO::Job* ) ) );
737 enter_loop();
738 if ( mErrorMsg.isEmpty() ) {
739 kdDebug(7125) << "ResourceLDAPTDEIO save ok!" << endl;
740 return true;
741 } else {
742 kdDebug(7125) << "ResourceLDAPTDEIO finished with error: " << mErrorMsg << endl;
743 addressBook()->error( mErrorMsg );
744 return false;
745 }
746}
747
748bool ResourceLDAPTDEIO::asyncSave( Ticket* )
749{
750 kdDebug(7125) << "ResourceLDAPTDEIO asyncSave" << endl;
751 d->mSaveIt = begin();
752 TDEIO::Job *job = TDEIO::put( d->mLDAPUrl, -1, true, false, false );
753 connect( job, TQ_SIGNAL( dataReq( TDEIO::Job*, TQByteArray& ) ),
754 this, TQ_SLOT( saveData( TDEIO::Job*, TQByteArray& ) ) );
755 connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ),
756 this, TQ_SLOT( saveResult( TDEIO::Job* ) ) );
757 return true;
758}
759
760void ResourceLDAPTDEIO::syncLoadSaveResult( TDEIO::Job *job )
761{
762 d->mError = job->error();
763 if ( d->mError && d->mError != TDEIO::ERR_USER_CANCELED )
764 mErrorMsg = job->errorString();
765 else
766 mErrorMsg = "";
767 activateCache();
768
769 tqApp->exit_loop();
770}
771
772void ResourceLDAPTDEIO::saveResult( TDEIO::Job *job )
773{
774 d->mError = job->error();
775 if ( d->mError && d->mError != TDEIO::ERR_USER_CANCELED )
776 emit savingError( this, job->errorString() );
777 else
778 emit savingFinished( this );
779}
780
781void ResourceLDAPTDEIO::saveData( TDEIO::Job*, TQByteArray& data )
782{
783 while ( d->mSaveIt != end() &&
784 !(*d->mSaveIt).changed() ) d->mSaveIt++;
785
786 if ( d->mSaveIt == end() ) {
787 kdDebug(7125) << "ResourceLDAPTDEIO endData" << endl;
788 data.resize(0);
789 return;
790 }
791
792 kdDebug(7125) << "ResourceLDAPTDEIO saveData: " << (*d->mSaveIt).assembledName() << endl;
793
794 AddresseeToLDIF( data, *d->mSaveIt, findUid( (*d->mSaveIt).uid() ) );
795// kdDebug(7125) << "ResourceLDAPTDEIO save LDIF: " << TQString::fromUtf8(data) << endl;
796 // mark as unchanged
797 (*d->mSaveIt).setChanged( false );
798
799 d->mSaveIt++;
800}
801
802void ResourceLDAPTDEIO::removeAddressee( const Addressee& addr )
803{
804 TQString dn = findUid( addr.uid() );
805
806 kdDebug(7125) << "ResourceLDAPTDEIO: removeAddressee: " << dn << endl;
807
808 if ( !mErrorMsg.isEmpty() ) {
809 addressBook()->error( mErrorMsg );
810 return;
811 }
812 if ( !dn.isEmpty() ) {
813 kdDebug(7125) << "ResourceLDAPTDEIO: found uid: " << dn << endl;
814 LDAPUrl url( d->mLDAPUrl );
815 url.setPath( "/" + dn );
816 url.setExtension( "x-dir", "base" );
817 url.setScope( LDAPUrl::Base );
818 if ( TDEIO::NetAccess::del( url, NULL ) ) mAddrMap.erase( addr.uid() );
819 } else {
820 //maybe it's not saved yet
821 mAddrMap.erase( addr.uid() );
822 }
823}
824
825
826void ResourceLDAPTDEIO::setUser( const TQString &user )
827{
828 mUser = user;
829}
830
831TQString ResourceLDAPTDEIO::user() const
832{
833 return mUser;
834}
835
836void ResourceLDAPTDEIO::setPassword( const TQString &password )
837{
838 mPassword = password;
839}
840
841TQString ResourceLDAPTDEIO::password() const
842{
843 return mPassword;
844}
845
846void ResourceLDAPTDEIO::setDn( const TQString &dn )
847{
848 mDn = dn;
849}
850
851TQString ResourceLDAPTDEIO::dn() const
852{
853 return mDn;
854}
855
856void ResourceLDAPTDEIO::setHost( const TQString &host )
857{
858 mHost = host;
859}
860
861TQString ResourceLDAPTDEIO::host() const
862{
863 return mHost;
864}
865
866void ResourceLDAPTDEIO::setPort( int port )
867{
868 mPort = port;
869}
870
871int ResourceLDAPTDEIO::port() const
872{
873 return mPort;
874}
875
876void ResourceLDAPTDEIO::setVer( int ver )
877{
878 d->mVer = ver;
879}
880
881int ResourceLDAPTDEIO::ver() const
882{
883 return d->mVer;
884}
885
886void ResourceLDAPTDEIO::setSizeLimit( int sizelimit )
887{
888 d->mSizeLimit = sizelimit;
889}
890
891int ResourceLDAPTDEIO::sizeLimit()
892{
893 return d->mSizeLimit;
894}
895
896void ResourceLDAPTDEIO::setTimeLimit( int timelimit )
897{
898 d->mTimeLimit = timelimit;
899}
900
901int ResourceLDAPTDEIO::timeLimit()
902{
903 return d->mTimeLimit;
904}
905
906void ResourceLDAPTDEIO::setFilter( const TQString &filter )
907{
908 mFilter = filter;
909}
910
911TQString ResourceLDAPTDEIO::filter() const
912{
913 return mFilter;
914}
915
916void ResourceLDAPTDEIO::setIsAnonymous( bool value )
917{
918 mAnonymous = value;
919}
920
921bool ResourceLDAPTDEIO::isAnonymous() const
922{
923 return mAnonymous;
924}
925
926void ResourceLDAPTDEIO::setIsTLS( bool value )
927{
928 d->mTLS = value;
929}
930
931bool ResourceLDAPTDEIO::isTLS() const
932{
933 return d->mTLS;
934}
935void ResourceLDAPTDEIO::setIsSSL( bool value )
936{
937 d->mSSL = value;
938}
939
940bool ResourceLDAPTDEIO::isSSL() const
941{
942 return d->mSSL;
943}
944
945void ResourceLDAPTDEIO::setIsSubTree( bool value )
946{
947 d->mSubTree = value;
948}
949
950bool ResourceLDAPTDEIO::isSubTree() const
951{
952 return d->mSubTree;
953}
954
955void ResourceLDAPTDEIO::setAttributes( const TQMap<TQString, TQString> &attributes )
956{
957 mAttributes = attributes;
958}
959
960TQMap<TQString, TQString> ResourceLDAPTDEIO::attributes() const
961{
962 return mAttributes;
963}
964
965void ResourceLDAPTDEIO::setRDNPrefix( int value )
966{
967 d->mRDNPrefix = value;
968}
969
970int ResourceLDAPTDEIO::RDNPrefix() const
971{
972 return d->mRDNPrefix;
973}
974
975void ResourceLDAPTDEIO::setIsSASL( bool value )
976{
977 d->mSASL = value;
978}
979
980bool ResourceLDAPTDEIO::isSASL() const
981{
982 return d->mSASL;
983}
984
985void ResourceLDAPTDEIO::setMech( const TQString &mech )
986{
987 d->mMech = mech;
988}
989
990TQString ResourceLDAPTDEIO::mech() const
991{
992 return d->mMech;
993}
994
995void ResourceLDAPTDEIO::setRealm( const TQString &realm )
996{
997 d->mRealm = realm;
998}
999
1000TQString ResourceLDAPTDEIO::realm() const
1001{
1002 return d->mRealm;
1003}
1004
1005void ResourceLDAPTDEIO::setBindDN( const TQString &binddn )
1006{
1007 d->mBindDN = binddn;
1008}
1009
1010TQString ResourceLDAPTDEIO::bindDN() const
1011{
1012 return d->mBindDN;
1013}
1014
1015void ResourceLDAPTDEIO::setCachePolicy( int pol )
1016{
1017 d->mCachePolicy = pol;
1018}
1019
1020int ResourceLDAPTDEIO::cachePolicy() const
1021{
1022 return d->mCachePolicy;
1023}
1024
1025void ResourceLDAPTDEIO::setAutoCache( bool value )
1026{
1027 d->mAutoCache = value;
1028}
1029
1030bool ResourceLDAPTDEIO::autoCache()
1031{
1032 return d->mAutoCache;
1033}
1034
1035TQString ResourceLDAPTDEIO::cacheDst() const
1036{
1037 return d->mCacheDst;
1038}
1039
1040
1041#include "resourceldaptdeio.moc"
KStringHandler::obscure
static TQString obscure(const TQString &str)
KTempFile
KURL
TDEABC::Address
Postal address information.
Definition: address.h:56
TDEABC::Address::street
TQString street() const
Returns the street.
Definition: address.cpp:174
TDEABC::Address::isEmpty
bool isEmpty() const
Returns true, if the address is empty.
Definition: address.cpp:68
TDEABC::Address::postalCode
TQString postalCode() const
Returns the postal code.
Definition: address.cpp:228
TDEABC::Address::region
TQString region() const
Returns the region.
Definition: address.cpp:210
TDEABC::Address::locality
TQString locality() const
Returns the locality.
Definition: address.cpp:192
TDEABC::Addressee
address book entry
Definition: addressee.src.h:75
TDEABC::Addressee::emails
TQStringList emails() const
Return list of all email addresses.
Definition: addressee.src.cpp:451
TDEABC::Addressee::assembledName
TQString assembledName() const
Return the name that consists of all name parts.
Definition: addressee.src.cpp:378
TDEABC::Addressee::address
Address address(int type) const
Return address, which matches the given type.
Definition: addressee.src.cpp:707
TDEABC::Addressee::phoneNumber
PhoneNumber phoneNumber(int type) const
Return phone number, which matches the given type.
Definition: addressee.src.cpp:489
TDEABC::Addressee::uid
TQString uid() const
Return unique identifier.
Definition: addressee.src.cpp:174
TDEABC::LDAPUrl
LDAPUrl.
Definition: ldapurl.h:43
TDEABC::LDIF
LDIF.
Definition: ldif.h:41
TDEABC::PhoneNumber
Phonenumber information.
Definition: phonenumber.h:39
TDEABC::PhoneNumber::number
TQString number() const
Returns the number.
Definition: phonenumber.cpp:88
TDEABC::PhoneNumber::setNumber
void setNumber(const TQString &)
Sets the number.
Definition: phonenumber.cpp:83
TDEABC::Resource::Iterator
Resource Iterator.
Definition: resource.h:69
TDEABC::Ticket
Helper class for handling coordinated save of address books.
Definition: resource.h:38
TDEConfigBase::readEntry
TQString readEntry(const TQString &pKey, const TQString &aDefault=TQString::null) const
TDEConfigBase::readNumEntry
int readNumEntry(const TQString &pKey, int nDefault=0) const
TDEConfigBase::readBoolEntry
bool readBoolEntry(const TQString &pKey, bool bDefault=false) const
TDEConfigBase::readListEntry
int readListEntry(const TQString &pKey, TQStrList &list, char sep=',') const
TDEConfigBase::writeEntry
void writeEntry(const TQString &pKey, const TQString &pValue, bool bPersistent=true, bool bGlobal=false, bool bNLS=false)
TDEConfig
TDEGlobal::dirs
static TDEStandardDirs * dirs()
TDEStandardDirs::saveLocation
TQString saveLocation(const char *type, const TQString &suffix=TQString::null, bool create=true) const
endl
kndbgstream & endl(kndbgstream &s)
kdDebug
kdbgstream kdDebug(int area=0)
KStdAction::clear
TDEAction * clear(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
TDEABC
static data, shared by ALL addressee objects
Definition: address.h:48
TDEStdAccel::name
TQString name(StdAccel id)
TDEStdAccel::end
const TDEShortcut & end()
tdelocale.h

tdeabc

Skip menu "tdeabc"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdeabc

Skip menu "tdeabc"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeabc by doxygen 1.9.4
This website is maintained by Timothy Pearson.