• 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 <kstandarddirs.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 
44 using namespace TDEABC;
45 
46 // Hack from Netaccess
47 void tqt_enter_modal( TQWidget *widget );
48 void tqt_leave_modal( TQWidget *widget );
49 
50 class 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 
72 ResourceLDAPTDEIO::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 
118 ResourceLDAPTDEIO::~ResourceLDAPTDEIO()
119 {
120  delete d;
121 }
122 
123 void ResourceLDAPTDEIO::enter_loop()
124 {
125  TQWidget dummy(0,0,(WFlags)(WType_Dialog | WShowModal));
126  dummy.setFocusPolicy( TQ_NoFocus );
127  tqt_enter_modal(&dummy);
128  tqApp->enter_loop();
129  tqt_leave_modal(&dummy);
130 }
131 
132 void 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 
150 void 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 
160 TQString 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  TQT_SIGNAL( entries( TDEIO::Job *, const TDEIO::UDSEntryList& ) ),
177  TQT_SLOT( entries( TDEIO::Job*, const TDEIO::UDSEntryList& ) ) );
178  connect( listJob, TQT_SIGNAL( result( TDEIO::Job* ) ),
179  this, TQT_SLOT( listResult( TDEIO::Job* ) ) );
180 
181  enter_loop();
182  return d->mResultDn;
183 }
184 
185 TQCString 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 
196 bool 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 
316 void 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 
323 void 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 
420 void 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 
453 Ticket *ResourceLDAPTDEIO::requestSaveTicket()
454 {
455  if ( !addressBook() ) {
456  kdDebug(7125) << "no addressbook" << endl;
457  return 0;
458  }
459 
460  return createTicket( this );
461 }
462 
463 void ResourceLDAPTDEIO::releaseSaveTicket( Ticket *ticket )
464 {
465  delete ticket;
466 }
467 
468 bool ResourceLDAPTDEIO::doOpen()
469 {
470  return true;
471 }
472 
473 void ResourceLDAPTDEIO::doClose()
474 {
475 }
476 
477 void 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 
486 void 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 
498 TDEIO::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, TQT_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ),
515  this, TQT_SLOT( data( TDEIO::Job*, const TQByteArray& ) ) );
516  }
517  return job;
518 }
519 
520 bool 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, TQT_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ),
539  this, TQT_SLOT( data( TDEIO::Job*, const TQByteArray& ) ) );
540  connect( job, TQT_SIGNAL( result( TDEIO::Job* ) ),
541  this, TQT_SLOT( syncLoadSaveResult( TDEIO::Job* ) ) );
542  enter_loop();
543  }
544 
545  job = loadFromCache();
546  if ( job ) {
547  connect( job, TQT_SIGNAL( result( TDEIO::Job* ) ),
548  this, TQT_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 
561 bool 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, TQT_SIGNAL( data( TDEIO::Job*, const TQByteArray& ) ),
576  this, TQT_SLOT( data( TDEIO::Job*, const TQByteArray& ) ) );
577  connect( job, TQT_SIGNAL( result( TDEIO::Job* ) ),
578  this, TQT_SLOT( result( TDEIO::Job* ) ) );
579  } else {
580  result( NULL );
581  }
582  return true;
583 }
584 
585 void 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 
688 void 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 
701 void 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, TQT_SIGNAL( result( TDEIO::Job* ) ),
718  this, TQT_SLOT( loadCacheResult( TDEIO::Job* ) ) );
719  } else {
720  if ( !mErrorMsg.isEmpty() )
721  emit loadingError( this, mErrorMsg );
722  else
723  emit loadingFinished( this );
724  }
725 }
726 
727 bool 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, TQT_SIGNAL( dataReq( TDEIO::Job*, TQByteArray& ) ),
734  this, TQT_SLOT( saveData( TDEIO::Job*, TQByteArray& ) ) );
735  connect( job, TQT_SIGNAL( result( TDEIO::Job* ) ),
736  this, TQT_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 
748 bool 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, TQT_SIGNAL( dataReq( TDEIO::Job*, TQByteArray& ) ),
754  this, TQT_SLOT( saveData( TDEIO::Job*, TQByteArray& ) ) );
755  connect( job, TQT_SIGNAL( result( TDEIO::Job* ) ),
756  this, TQT_SLOT( saveResult( TDEIO::Job* ) ) );
757  return true;
758 }
759 
760 void 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 
772 void 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 
781 void 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 
802 void 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 
826 void ResourceLDAPTDEIO::setUser( const TQString &user )
827 {
828  mUser = user;
829 }
830 
831 TQString ResourceLDAPTDEIO::user() const
832 {
833  return mUser;
834 }
835 
836 void ResourceLDAPTDEIO::setPassword( const TQString &password )
837 {
838  mPassword = password;
839 }
840 
841 TQString ResourceLDAPTDEIO::password() const
842 {
843  return mPassword;
844 }
845 
846 void ResourceLDAPTDEIO::setDn( const TQString &dn )
847 {
848  mDn = dn;
849 }
850 
851 TQString ResourceLDAPTDEIO::dn() const
852 {
853  return mDn;
854 }
855 
856 void ResourceLDAPTDEIO::setHost( const TQString &host )
857 {
858  mHost = host;
859 }
860 
861 TQString ResourceLDAPTDEIO::host() const
862 {
863  return mHost;
864 }
865 
866 void ResourceLDAPTDEIO::setPort( int port )
867 {
868  mPort = port;
869 }
870 
871 int ResourceLDAPTDEIO::port() const
872 {
873  return mPort;
874 }
875 
876 void ResourceLDAPTDEIO::setVer( int ver )
877 {
878  d->mVer = ver;
879 }
880 
881 int ResourceLDAPTDEIO::ver() const
882 {
883  return d->mVer;
884 }
885 
886 void ResourceLDAPTDEIO::setSizeLimit( int sizelimit )
887 {
888  d->mSizeLimit = sizelimit;
889 }
890 
891 int ResourceLDAPTDEIO::sizeLimit()
892 {
893  return d->mSizeLimit;
894 }
895 
896 void ResourceLDAPTDEIO::setTimeLimit( int timelimit )
897 {
898  d->mTimeLimit = timelimit;
899 }
900 
901 int ResourceLDAPTDEIO::timeLimit()
902 {
903  return d->mTimeLimit;
904 }
905 
906 void ResourceLDAPTDEIO::setFilter( const TQString &filter )
907 {
908  mFilter = filter;
909 }
910 
911 TQString ResourceLDAPTDEIO::filter() const
912 {
913  return mFilter;
914 }
915 
916 void ResourceLDAPTDEIO::setIsAnonymous( bool value )
917 {
918  mAnonymous = value;
919 }
920 
921 bool ResourceLDAPTDEIO::isAnonymous() const
922 {
923  return mAnonymous;
924 }
925 
926 void ResourceLDAPTDEIO::setIsTLS( bool value )
927 {
928  d->mTLS = value;
929 }
930 
931 bool ResourceLDAPTDEIO::isTLS() const
932 {
933  return d->mTLS;
934 }
935 void ResourceLDAPTDEIO::setIsSSL( bool value )
936 {
937  d->mSSL = value;
938 }
939 
940 bool ResourceLDAPTDEIO::isSSL() const
941 {
942  return d->mSSL;
943 }
944 
945 void ResourceLDAPTDEIO::setIsSubTree( bool value )
946 {
947  d->mSubTree = value;
948 }
949 
950 bool ResourceLDAPTDEIO::isSubTree() const
951 {
952  return d->mSubTree;
953 }
954 
955 void ResourceLDAPTDEIO::setAttributes( const TQMap<TQString, TQString> &attributes )
956 {
957  mAttributes = attributes;
958 }
959 
960 TQMap<TQString, TQString> ResourceLDAPTDEIO::attributes() const
961 {
962  return mAttributes;
963 }
964 
965 void ResourceLDAPTDEIO::setRDNPrefix( int value )
966 {
967  d->mRDNPrefix = value;
968 }
969 
970 int ResourceLDAPTDEIO::RDNPrefix() const
971 {
972  return d->mRDNPrefix;
973 }
974 
975 void ResourceLDAPTDEIO::setIsSASL( bool value )
976 {
977  d->mSASL = value;
978 }
979 
980 bool ResourceLDAPTDEIO::isSASL() const
981 {
982  return d->mSASL;
983 }
984 
985 void ResourceLDAPTDEIO::setMech( const TQString &mech )
986 {
987  d->mMech = mech;
988 }
989 
990 TQString ResourceLDAPTDEIO::mech() const
991 {
992  return d->mMech;
993 }
994 
995 void ResourceLDAPTDEIO::setRealm( const TQString &realm )
996 {
997  d->mRealm = realm;
998 }
999 
1000 TQString ResourceLDAPTDEIO::realm() const
1001 {
1002  return d->mRealm;
1003 }
1004 
1005 void ResourceLDAPTDEIO::setBindDN( const TQString &binddn )
1006 {
1007  d->mBindDN = binddn;
1008 }
1009 
1010 TQString ResourceLDAPTDEIO::bindDN() const
1011 {
1012  return d->mBindDN;
1013 }
1014 
1015 void ResourceLDAPTDEIO::setCachePolicy( int pol )
1016 {
1017  d->mCachePolicy = pol;
1018 }
1019 
1020 int ResourceLDAPTDEIO::cachePolicy() const
1021 {
1022  return d->mCachePolicy;
1023 }
1024 
1025 void ResourceLDAPTDEIO::setAutoCache( bool value )
1026 {
1027  d->mAutoCache = value;
1028 }
1029 
1030 bool ResourceLDAPTDEIO::autoCache()
1031 {
1032  return d->mAutoCache;
1033 }
1034 
1035 TQString ResourceLDAPTDEIO::cacheDst() const
1036 {
1037  return d->mCacheDst;
1038 }
1039 
1040 
1041 #include "resourceldaptdeio.moc"
TDEABC::LDAPUrl
LDAPUrl.
Definition: ldapurl.h:42
TDEConfig
KURL
TDEABC::Addressee::emails
TQStringList emails() const
Return list of all email addresses.
Definition: addressee.src.cpp:451
KStringHandler::obscure
static TQString obscure(const TQString &str)
KStdAction::clear
TDEAction * clear(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
kdDebug
kdbgstream kdDebug(int area=0)
TDEABC::LDIF::assembleLine
static TQCString assembleLine(const TQString &fieldname, const TQByteArray &value, uint linelen=0, bool url=false)
Assembles fieldname and value into a valid LDIF line, BASE64 encodes the value if neccessary and opti...
Definition: ldif.cpp:37
TDEABC::Addressee::assembledName
TQString assembledName() const
Return the name that consists of all name parts.
Definition: addressee.src.cpp:378
TDEABC
static data, shared by ALL addressee objects
Definition: address.h:48
TDEABC::PhoneNumber::setNumber
void setNumber(const TQString &)
Sets the number.
Definition: phonenumber.cpp:83
TDEABC::Addressee::phoneNumber
PhoneNumber phoneNumber(int type) const
Return phone number, which matches the given type.
Definition: addressee.src.cpp:489
TDEGlobal::dirs
static TDEStandardDirs * dirs()
TDEABC::Address
Postal address information.
Definition: address.h:55
tdelocale.h
TDEStdAccel::end
const TDEShortcut & end()
TDEABC::Resource::Iterator
Resource Iterator.
Definition: resource.h:68
TDEABC::Ticket
Helper class for handling coordinated save of address books.
Definition: resource.h:37
TDEABC::Addressee::uid
TQString uid() const
Return unique identifier.
Definition: addressee.src.cpp:174
TDEABC::LDIF
LDIF.
Definition: ldif.h:40
KTempFile
TDEABC::PhoneNumber
Phonenumber information.
Definition: phonenumber.h:38
TDEABC::Addressee
address book entry
Definition: addressee.src.h:74
TDEABC::Addressee::address
Address address(int type) const
Return address, which matches the given type.
Definition: addressee.src.cpp:707
TDEStandardDirs::saveLocation
TQString saveLocation(const char *type, const TQString &suffix=TQString::null, bool create=true) const
endl
kndbgstream & endl(kndbgstream &s)
TDEStdAccel::name
TQString name(StdAccel id)

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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeabc by doxygen 1.8.8
This website is maintained by Timothy Pearson.