summaryrefslogtreecommitdiffabout
path: root/kabc/plugins/ldap
authorzautrix <zautrix>2004-06-26 19:01:18 (UTC)
committer zautrix <zautrix>2004-06-26 19:01:18 (UTC)
commitb9aad1f15dc600e4dbe4c62d3fcced6363188ba3 (patch) (unidiff)
tree2c3d4004fb21c72cba65793859f9bcd8ffd3a49c /kabc/plugins/ldap
downloadkdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.zip
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.gz
kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.bz2
Initial revision
Diffstat (limited to 'kabc/plugins/ldap') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/plugins/ldap/resourceldap.cpp444
-rw-r--r--kabc/plugins/ldap/resourceldap.h99
-rw-r--r--kabc/plugins/ldap/resourceldapconfig.cpp254
-rw-r--r--kabc/plugins/ldap/resourceldapconfig.h100
4 files changed, 897 insertions, 0 deletions
diff --git a/kabc/plugins/ldap/resourceldap.cpp b/kabc/plugins/ldap/resourceldap.cpp
new file mode 100644
index 0000000..1c54f63
--- a/dev/null
+++ b/kabc/plugins/ldap/resourceldap.cpp
@@ -0,0 +1,444 @@
1/*
2 This file is part of libkabc.
3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/*
22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk
24
25$Id$
26*/
27
28#include <kdebug.h>
29#include <kglobal.h>
30#include <klineedit.h>
31#include <klocale.h>
32#include <kconfig.h>
33#include <kstringhandler.h>
34
35#include <stdlib.h>
36
37#include "resourceldap.h"
38#include "resourceldapconfig.h"
39
40using namespace KABC;
41
42extern "C"
43{
44 void *init_kabc_ldap()
45 {
46 qDebug("resourceldap.cpp : init_kabc_ldap has to be changed");
47//US return new KRES::PluginFactory<ResourceLDAP,ResourceLDAPConfig>();
48 }
49}
50
51void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value );
52
53
54ResourceLDAP::ResourceLDAP( const KConfig *config )
55 : Resource( config ), mPort( 389 ), mLdap( 0 )
56{
57 KConfig *cfg = (KConfig *)config;
58 if ( cfg ) {
59 mUser = cfg->readEntry( "LdapUser" );
60 mPassword = KStringHandler::obscure( cfg->readEntry( "LdapPassword" ) );
61 mDn = cfg->readEntry( "LdapDn" );
62 mHost = cfg->readEntry( "LdapHost" );
63 mPort = cfg->readNumEntry( "LdapPort", 389 );
64 mFilter = cfg->readEntry( "LdapFilter" );
65 mAnonymous = cfg->readBoolEntry( "LdapAnonymous" );
66
67 QStringList attributes = cfg->readListEntry( "LdapAttributes" );
68 for ( uint pos = 0; pos < attributes.count(); pos += 2 )
69 mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] );
70 }
71
72 /**
73 If you want to add new attributes, append them here, add a
74 translation string in the ctor of AttributesDialog and
75 handle them in the load() method below.
76 These are the default values from
77 */
78 if ( mAttributes.count() == 0 ) {
79 mAttributes.insert( "commonName", "cn" );
80 mAttributes.insert( "formattedName", "displayName" );
81 mAttributes.insert( "familyName", "sn" );
82 mAttributes.insert( "givenName", "givenName" );
83 mAttributes.insert( "mail", "mail" );
84 mAttributes.insert( "mailAlias", "" );
85 mAttributes.insert( "phoneNumber", "telephoneNumber" );
86 mAttributes.insert( "uid", "uid" );
87 }
88}
89
90void ResourceLDAP::writeConfig( KConfig *config )
91{
92 Resource::writeConfig( config );
93
94 config->writeEntry( "LdapUser", mUser );
95 config->writeEntry( "LdapPassword", KStringHandler::obscure( mPassword ) );
96 config->writeEntry( "LdapDn", mDn );
97 config->writeEntry( "LdapHost", mHost );
98 config->writeEntry( "LdapPort", mPort );
99 config->writeEntry( "LdapFilter", mFilter );
100 config->writeEntry( "LdapAnonymous", mAnonymous );
101
102 QStringList attributes;
103 QMap<QString, QString>::Iterator it;
104 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it )
105 attributes << it.key() << it.data();
106
107 config->writeEntry( "LdapAttributes", attributes );
108}
109
110Ticket *ResourceLDAP::requestSaveTicket()
111{
112 if ( !addressBook() ) {
113 kdDebug(5700) << "no addressbook" << endl;
114 return 0;
115 }
116
117 return createTicket( this );
118}
119
120bool ResourceLDAP::doOpen()
121{
122 if ( mLdap )
123 return false;
124
125 if ( !mPort )
126 mPort = 389;
127
128 mLdap = ldap_init( mHost.local8Bit(), mPort );
129 if ( !mLdap ) {
130 addressBook()->error( i18n( "Unable to connect to server '%1' on port '%2'" ).arg( mHost ).arg( mPort ) );
131 return false;
132 }
133
134 if ( !mUser.isEmpty() && !mAnonymous ) {
135 if ( ldap_simple_bind_s( mLdap, mUser.local8Bit(), mPassword.local8Bit() ) != LDAP_SUCCESS ) {
136 addressBook()->error( i18n( "Unable to bind to server '%1'" ).arg( mHost ) );
137 return false;
138 }
139
140 kdDebug(5700) << "ResourceLDAP: bind to server successfully" << endl;
141 } else {
142 if ( ldap_simple_bind_s( mLdap, NULL, NULL ) != LDAP_SUCCESS ) {
143 addressBook()->error( i18n( "Unable to bind anonymously to server '%1'" ).arg( mHost ) );
144 return false;
145 }
146
147 kdDebug( 5700 ) << "ResourceLDAP: bind anonymously to server successfully" << endl;
148 }
149
150 int deref = LDAP_DEREF_ALWAYS;
151 if ( ldap_set_option( mLdap, LDAP_OPT_DEREF, (void *) &deref ) != LDAP_OPT_SUCCESS ) {
152 kdDebug(5700) << "ResourceLDAP: can't set 'deref' option" << endl;
153 return false;
154 }
155
156 if ( ldap_set_option( mLdap, LDAP_OPT_REFERRALS, LDAP_OPT_ON ) != LDAP_OPT_SUCCESS ) {
157 kdDebug(5700) << "ResourceLDAP: can't set 'referrals' option" << endl;
158 return false;
159 }
160
161 return true;
162}
163
164void ResourceLDAP::doClose()
165{
166 if ( ldap_unbind_s( mLdap ) != LDAP_SUCCESS ) {
167 kdDebug(5700) << "ResourceLDAP: can't unbind from server" << endl;
168 return;
169 }
170
171 mLdap = 0;
172}
173
174bool ResourceLDAP::load()
175{
176 LDAPMessage *res;
177 LDAPMessage *msg;
178 BerElement *track;
179 char *names;
180 char **values;
181
182 char **LdapSearchAttr = new char*[ mAttributes.count() + 1 ];
183
184 QMap<QString, QString>::Iterator it;
185 int i = 0;
186 for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) {
187 if ( !it.data().isEmpty() ) {
188 unsigned int len = it.data().utf8().length();
189 LdapSearchAttr[ i ] = new char[ len+1 ];
190 memcpy( LdapSearchAttr[ i ], it.data().utf8(), len );
191 LdapSearchAttr[ i ][ len ] = 0;
192 ++i;
193 }
194 }
195 LdapSearchAttr[ i ] = 0;
196
197 QString filter = mFilter;
198 if ( filter.isEmpty() )
199 filter = "cn=*";
200
201 int result;
202 if ( ( result = ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, QString( "(%1)" ).arg( filter ).local8Bit(),
203 LdapSearchAttr, 0, &res ) != LDAP_SUCCESS ) ) {
204 addressBook()->error( i18n( "Unable to search on server '%1': %2" )
205 .arg( mHost )
206 .arg( ldap_err2string( result ) ) );
207
208 for ( i = 0; LdapSearchAttr[ i ]; ++i )
209 delete [] LdapSearchAttr[ i ];
210 delete [] LdapSearchAttr;
211
212 return false;
213 }
214
215 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) {
216 Addressee addr;
217 addr.setResource( this );
218 for ( names = ldap_first_attribute( mLdap, msg, &track ); names; names = ldap_next_attribute( mLdap, msg, track ) ) {
219 values = ldap_get_values( mLdap, msg, names );
220 for ( int i = 0; i < ldap_count_values( values ); ++i ) {
221 QString name = QString::fromUtf8( names ).lower();
222 QString value = QString::fromUtf8( values[ i ] );
223
224 if ( name == mAttributes[ "commonName" ].lower() ) {
225 if ( !addr.formattedName().isEmpty() ) {
226 QString fn = addr.formattedName();
227 addr.setNameFromString( value );
228 addr.setFormattedName( fn );
229 } else
230 addr.setNameFromString( value );
231 } else if ( name == mAttributes[ "formattedName" ].lower() ) {
232 addr.setFormattedName( value );
233 } else if ( name == mAttributes[ "givenName" ].lower() ) {
234 addr.setGivenName( value );
235 } else if ( name == mAttributes[ "mail" ].lower() ) {
236 addr.insertEmail( value, true );
237 } else if ( name == mAttributes[ "mailAlias" ].lower() ) {
238 addr.insertEmail( value, false );
239 } else if ( name == mAttributes[ "phoneNumber" ].lower() ) {
240 PhoneNumber phone;
241 phone.setNumber( value );
242 addr.insertPhoneNumber( phone );
243 break; // read only the home number
244 } else if ( name == mAttributes[ "familyName" ].lower() ) {
245 addr.setFamilyName( value );
246 } else if ( name == mAttributes[ "uid" ].lower() ) {
247 addr.setUid( value );
248 }
249 }
250 ldap_value_free( values );
251 }
252 ber_free( track, 0 );
253
254 addressBook()->insertAddressee( addr );
255 }
256
257 ldap_msgfree( res );
258
259 for ( i = 0; LdapSearchAttr[ i ]; ++i )
260 delete [] LdapSearchAttr[ i ];
261 delete [] LdapSearchAttr;
262
263 return true;
264}
265
266bool ResourceLDAP::save( Ticket * )
267{
268 AddressBook::Iterator it;
269 for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
270 if ( (*it).resource() == this && (*it).changed() ) {
271 LDAPMod **mods = NULL;
272
273 addModOp( &mods, "objectClass", "organizationalPerson" );
274 addModOp( &mods, "objectClass", "person" );
275 addModOp( &mods, "objectClass", "Top" );
276 addModOp( &mods, mAttributes[ "commonName" ].utf8(), (*it).assembledName() );
277 addModOp( &mods, mAttributes[ "formattedName" ].utf8(), (*it).formattedName() );
278 addModOp( &mods, mAttributes[ "givenName" ].utf8(), (*it).givenName() );
279 addModOp( &mods, mAttributes[ "familyName" ].utf8(), (*it).familyName() );
280 addModOp( &mods, mAttributes[ "uid" ].utf8(), (*it).uid() );
281
282 QStringList emails = (*it).emails();
283 QStringList::ConstIterator mailIt;
284 bool first = true;
285 for ( mailIt = emails.begin(); mailIt != emails.end(); ++mailIt ) {
286 if ( first ) {
287 addModOp( &mods, mAttributes[ "mail" ].utf8(), (*mailIt) );
288 first = false;
289 } else
290 addModOp( &mods, mAttributes[ "mailAlias" ].utf8(), (*mailIt) );
291 }
292
293 PhoneNumber number = (*it).phoneNumber( PhoneNumber::Home );
294 addModOp( &mods, mAttributes[ "phoneNumber" ].utf8(), number.number() );
295
296 QString dn = "cn=" + (*it).assembledName() + "," + mDn;
297
298 int retval;
299 if ( (retval = ldap_add_s( mLdap, dn.local8Bit(), mods )) != LDAP_SUCCESS )
300 addressBook()->error( i18n( "Unable to modify '%1' on server '%2'" ).arg( (*it).uid() ).arg( mHost ) );
301
302 ldap_mods_free( mods, 1 );
303
304 // mark as unchanged
305 (*it).setChanged( false );
306 }
307 }
308
309 return true;
310}
311
312void ResourceLDAP::removeAddressee( const Addressee &addr )
313{
314 LDAPMessage *res;
315 LDAPMessage *msg;
316
317 QString filter = QString( "(&(uid=%1)(%2))" ).arg( addr.uid() ).arg( mFilter );
318
319 kdDebug(5700) << "ldap:removeAddressee" << filter << endl;
320
321 ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, filter.local8Bit(),
322 0, 0, &res );
323
324 for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) {
325 char *dn = ldap_get_dn( mLdap, msg );
326 kdDebug(5700) << "found " << dn << endl;
327 if ( ldap_delete_s( mLdap, dn ) != LDAP_SUCCESS )
328 addressBook()->error( i18n( "Unable to delete '%1' on server '%2'" ).arg( dn ).arg( mHost ) );
329 ldap_memfree( dn );
330 }
331
332 ldap_msgfree( res );
333}
334
335void ResourceLDAP::setUser( const QString &user )
336{
337 mUser = user;
338}
339
340QString ResourceLDAP::user() const
341{
342 return mUser;
343}
344
345void ResourceLDAP::setPassword( const QString &password )
346{
347 mPassword = password;
348}
349
350QString ResourceLDAP::password() const
351{
352 return mPassword;
353}
354
355void ResourceLDAP::setDn( const QString &dn )
356{
357 mDn = dn;
358}
359
360QString ResourceLDAP::dn() const
361{
362 return mDn;
363}
364
365void ResourceLDAP::setHost( const QString &host )
366{
367 mHost = host;
368}
369
370QString ResourceLDAP::host() const
371{
372 return mHost;
373}
374
375void ResourceLDAP::setPort( int port )
376{
377 mPort = port;
378}
379
380int ResourceLDAP::port() const
381{
382 return mPort;
383}
384
385void ResourceLDAP::setFilter( const QString &filter )
386{
387 mFilter = filter;
388}
389
390QString ResourceLDAP::filter() const
391{
392 return mFilter;
393}
394
395void ResourceLDAP::setIsAnonymous( bool value )
396{
397 mAnonymous = value;
398}
399
400bool ResourceLDAP::isAnonymous() const
401{
402 return mAnonymous;
403}
404
405void ResourceLDAP::setAttributes( const QMap<QString, QString> &attributes )
406{
407 mAttributes = attributes;
408}
409
410QMap<QString, QString> ResourceLDAP::attributes() const
411{
412 return mAttributes;
413}
414
415void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value )
416{
417 if ( value.isNull() )
418 return;
419
420 LDAPMod**mods;
421
422 mods = *pmods;
423
424 uint i = 0;
425 if ( mods != 0 )
426 for ( ; mods[ i ] != 0; ++i );
427
428 if (( mods = (LDAPMod **)realloc( mods, (i + 2) * sizeof( LDAPMod * ))) == 0 ) {
429 kdError() << "ResourceLDAP: realloc" << endl;
430 return;
431 }
432
433 *pmods = mods;
434 mods[ i + 1 ] = 0;
435
436 mods[ i ] = new LDAPMod;
437
438 mods[ i ]->mod_op = 0;
439 mods[ i ]->mod_type = strdup( attr.utf8() );
440 mods[ i ]->mod_values = new char*[ 2 ];
441 mods[ i ]->mod_values[ 0 ] = strdup( value.utf8() );
442 mods[ i ]->mod_values[ 1 ] = 0;
443}
444
diff --git a/kabc/plugins/ldap/resourceldap.h b/kabc/plugins/ldap/resourceldap.h
new file mode 100644
index 0000000..0625f30
--- a/dev/null
+++ b/kabc/plugins/ldap/resourceldap.h
@@ -0,0 +1,99 @@
1/*
2 This file is part of libkabc.
3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/*
22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk
24
25$Id$
26*/
27
28#ifndef KABC_RESOURCELDAP_H
29#define KABC_RESOURCELDAP_H
30
31
32#include <lber.h>
33#include <ldap.h>
34
35#include "addressbook.h"
36#include "resource.h"
37
38class KConfig;
39
40namespace KABC {
41
42class ResourceLDAP : public Resource
43{
44public:
45
46 ResourceLDAP( const KConfig* );
47
48 virtual void writeConfig( KConfig* );
49
50 virtual bool doOpen();
51 virtual void doClose();
52
53 virtual Ticket *requestSaveTicket();
54
55 virtual bool load();
56 virtual bool save( Ticket * );
57
58 virtual void removeAddressee( const Addressee& addr );
59
60 void setUser( const QString &user );
61 QString user() const;
62
63 void setPassword( const QString &password );
64 QString password() const;
65
66 void setDn( const QString &dn );
67 QString dn() const;
68
69 void setHost( const QString &host );
70 QString host() const;
71
72 void setPort( int port );
73 int port() const;
74
75 void setFilter( const QString &filter );
76 QString filter() const;
77
78 void setIsAnonymous( bool value );
79 bool isAnonymous() const;
80
81 void setAttributes( const QMap<QString, QString> &attributes );
82 QMap<QString, QString> attributes() const;
83
84private:
85 QString mUser;
86 QString mPassword;
87 QString mDn;
88 QString mHost;
89 QString mFilter;
90 int mPort;
91 bool mAnonymous;
92 QMap<QString, QString> mAttributes;
93
94 LDAP *mLdap;
95};
96
97}
98
99#endif
diff --git a/kabc/plugins/ldap/resourceldapconfig.cpp b/kabc/plugins/ldap/resourceldapconfig.cpp
new file mode 100644
index 0000000..2c0d030
--- a/dev/null
+++ b/kabc/plugins/ldap/resourceldapconfig.cpp
@@ -0,0 +1,254 @@
1/*
2 This file is part of libkabc.
3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/*
22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk
24
25$Id$
26*/
27
28#include <qcheckbox.h>
29#include <qlabel.h>
30#include <qlayout.h>
31#include <qpushbutton.h>
32#include <qspinbox.h>
33#include <qvbox.h>
34
35//US #include <kaccelmanager.h>
36#include <kcombobox.h>
37#include <kdebug.h>
38#include <kdialogbase.h>
39#include <klocale.h>
40#include <klineedit.h>
41
42#include "resourceldap.h"
43
44#include "resourceldapconfig.h"
45
46using namespace KABC;
47
48ResourceLDAPConfig::ResourceLDAPConfig( QWidget* parent, const char* name )
49 : KRES::ConfigWidget( parent, name )
50{
51 QGridLayout *mainLayout = new QGridLayout( this, 8, 2, 0,
52 KDialog::spacingHint() );
53
54 QLabel *label = new QLabel( i18n( "User:" ), this );
55 mUser = new KLineEdit( this );
56
57 mainLayout->addWidget( label, 0, 0 );
58 mainLayout->addWidget( mUser, 0, 1 );
59
60 label = new QLabel( i18n( "Password:" ), this );
61 mPassword = new KLineEdit( this );
62 mPassword->setEchoMode( KLineEdit::Password );
63
64 mainLayout->addWidget( label, 1, 0 );
65 mainLayout->addWidget( mPassword, 1, 1 );
66
67 label = new QLabel( i18n( "Host:" ), this );
68 mHost = new KLineEdit( this );
69
70 mainLayout->addWidget( label, 2, 0 );
71 mainLayout->addWidget( mHost, 2, 1 );
72
73 label = new QLabel( i18n( "Port:" ), this );
74 QVBox *box = new QVBox( this );
75 mPort = new QSpinBox( 0, 65535, 1, box );
76 mPort->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) );
77 mPort->setValue( 389 );
78 new QWidget( box, "dummy" );
79
80 mainLayout->addWidget( label, 3, 0 );
81 mainLayout->addWidget( box, 3, 1 );
82
83 label = new QLabel( i18n( "Dn:" ), this );
84 mDn = new KLineEdit( this );
85
86 mainLayout->addWidget( label, 4, 0 );
87 mainLayout->addWidget( mDn, 4, 1 );
88
89 label = new QLabel( i18n( "Filter:" ), this );
90 mFilter = new KLineEdit( this );
91
92 mainLayout->addWidget( label, 5, 0 );
93 mainLayout->addWidget( mFilter, 5, 1 );
94
95 mAnonymous = new QCheckBox( i18n( "Anonymous login" ), this );
96 mainLayout->addMultiCellWidget( mAnonymous, 6, 6, 0, 1 );
97
98 mEditButton = new QPushButton( i18n( "Edit Attributes..." ), this );
99 mainLayout->addMultiCellWidget( mEditButton, 7, 7, 0, 1 );
100
101 connect( mAnonymous, SIGNAL( toggled(bool) ), mUser, SLOT( setDisabled(bool) ) );
102 connect( mAnonymous, SIGNAL( toggled(bool) ), mPassword, SLOT( setDisabled(bool) ) );
103 connect( mEditButton, SIGNAL( clicked() ), SLOT( editAttributes() ) );
104}
105
106void ResourceLDAPConfig::loadSettings( KRES::Resource *res )
107{
108//US ResourceLDAP *resource = dynamic_cast<ResourceLDAP*>( res );
109 ResourceLDAP *resource = (ResourceLDAP*)( res );
110
111 if ( !resource ) {
112 kdDebug(5700) << "ResourceLDAPConfig::loadSettings(): cast failed" << endl;
113 return;
114 }
115
116 mUser->setText( resource->user() );
117 mPassword->setText( resource->password() );
118 mHost->setText( resource->host() );
119 mPort->setValue( resource->port() );
120 mDn->setText( resource->dn() );
121 mFilter->setText( resource->filter() );
122 mAnonymous->setChecked( resource->isAnonymous() );
123 mAttributes = resource->attributes();
124}
125
126void ResourceLDAPConfig::saveSettings( KRES::Resource *res )
127{
128//US ResourceLDAP *resource = dynamic_cast<ResourceLDAP*>( res );
129 ResourceLDAP *resource = (ResourceLDAP*)( res );
130
131 if ( !resource ) {
132 kdDebug(5700) << "ResourceLDAPConfig::saveSettings(): cast failed" << endl;
133 return;
134 }
135
136 resource->setUser( mUser->text() );
137 resource->setPassword( mPassword->text() );
138 resource->setHost( mHost->text() );
139 resource->setPort( mPort->value() );
140 resource->setDn( mDn->text() );
141 resource->setFilter( mFilter->text() );
142 resource->setIsAnonymous( mAnonymous->isChecked() );
143 resource->setAttributes( mAttributes );
144}
145
146void ResourceLDAPConfig::editAttributes()
147{
148 AttributesDialog dlg( mAttributes, this );
149 if ( dlg.exec() )
150 mAttributes = dlg.attributes();
151}
152
153AttributesDialog::AttributesDialog( const QMap<QString, QString> &attributes,
154 QWidget *parent, const char *name )
155 : KDialogBase( Plain, i18n( "Attributes Configuration" ), Ok | Cancel,
156 Ok, parent, name, true, true )
157{
158 mNameDict.setAutoDelete( true );
159 mNameDict.insert( "commonName", new QString( i18n( "Common name" ) ) );
160 mNameDict.insert( "formattedName", new QString( i18n( "Formatted name" ) ) );
161 mNameDict.insert( "familyName", new QString( i18n( "Family name" ) ) );
162 mNameDict.insert( "givenName", new QString( i18n( "Given name" ) ) );
163 mNameDict.insert( "mail", new QString( i18n( "Email" ) ) );
164 mNameDict.insert( "mailAlias", new QString( i18n( "Email alias" ) ) );
165 mNameDict.insert( "phoneNumber", new QString( i18n( "Telephone number" ) ) );
166 mNameDict.insert( "uid", new QString( i18n( "UID" ) ) );
167
168 // overwrite the default values here
169 QMap<QString, QString> kolabMap, netscapeMap, evolutionMap, outlookMap;
170
171 // kolab
172 kolabMap.insert( "formattedName", "display-name" );
173 kolabMap.insert( "mailAlias", "mailalias" );
174
175 // evolution
176 evolutionMap.insert( "formattedName", "fileAs" );
177
178 mMapList.append( attributes );
179 mMapList.append( kolabMap );
180 mMapList.append( netscapeMap );
181 mMapList.append( evolutionMap );
182 mMapList.append( outlookMap );
183
184 QFrame *page = plainPage();
185 QGridLayout *layout = new QGridLayout( page, 2, attributes.count() + 1,
186 0, spacingHint() );
187
188 QLabel *label = new QLabel( i18n( "Template:" ), page );
189 layout->addWidget( label, 0, 0 );
190 mMapCombo = new KComboBox( page );
191 layout->addWidget( mMapCombo, 0, 1 );
192
193 mMapCombo->insertItem( i18n( "User Defined" ) );
194 mMapCombo->insertItem( i18n( "Kolab" ) );
195 mMapCombo->insertItem( i18n( "Netscape" ) );
196 mMapCombo->insertItem( i18n( "Evolution" ) );
197 mMapCombo->insertItem( i18n( "Outlook" ) );
198 connect( mMapCombo, SIGNAL( activated( int ) ), SLOT( mapChanged( int ) ) );
199
200 QMap<QString, QString>::ConstIterator it;
201 int i;
202 for ( i = 1, it = attributes.begin(); it != attributes.end(); ++it, ++i ) {
203 label = new QLabel( *mNameDict[ it.key() ] + ":", page );
204 KLineEdit *lineedit = new KLineEdit( page );
205 mLineEditDict.insert( it.key(), lineedit );
206 lineedit->setText( it.data() );
207 label->setBuddy( lineedit );
208 layout->addWidget( label, i, 0 );
209 layout->addWidget( lineedit, i, 1 );
210 }
211
212//US KAcceleratorManager::manage( this );
213}
214
215AttributesDialog::~AttributesDialog()
216{
217}
218
219QMap<QString, QString> AttributesDialog::attributes() const
220{
221 QMap<QString, QString> map;
222
223 QDictIterator<KLineEdit> it( mLineEditDict );
224 for ( ; it.current(); ++it )
225 map.insert( it.currentKey(), it.current()->text() );
226
227 return map;
228}
229
230void AttributesDialog::mapChanged( int pos )
231{
232 // default map
233 QMap<QString, QString> defaultMap;
234 defaultMap.insert( "commonName", "cn" );
235 defaultMap.insert( "formattedName", "displayName" );
236 defaultMap.insert( "familyName", "sn" );
237 defaultMap.insert( "givenName", "givenName" );
238 defaultMap.insert( "mail", "mail" );
239 defaultMap.insert( "mailAlias", "" );
240 defaultMap.insert( "phoneNumber", "telephoneNumber" );
241 defaultMap.insert( "uid", "uid" );
242
243 // apply first the default and than the spezific changes
244 QMap<QString, QString>::Iterator it;
245 for ( it = defaultMap.begin(); it != defaultMap.end(); ++it )
246 mLineEditDict[ it.key() ]->setText( it.data() );
247
248 for ( it = mMapList[ pos ].begin(); it != mMapList[ pos ].end(); ++it ) {
249 if ( !it.data().isEmpty() )
250 mLineEditDict[ it.key() ]->setText( it.data() );
251 }
252}
253
254//US #include "resourceldapconfig.moc"
diff --git a/kabc/plugins/ldap/resourceldapconfig.h b/kabc/plugins/ldap/resourceldapconfig.h
new file mode 100644
index 0000000..42d30ff
--- a/dev/null
+++ b/kabc/plugins/ldap/resourceldapconfig.h
@@ -0,0 +1,100 @@
1/*
2 This file is part of libkabc.
3 Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20
21/*
22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk
24
25$Id$
26*/
27
28#ifndef RESOURCELDAPCONFIG_H
29#define RESOURCELDAPCONFIG_H
30
31#include <qmap.h>
32//US
33#include <qdict.h>
34
35#include <kdialogbase.h>
36#include <kresources/configwidget.h>
37
38class QCheckBox;
39class QPushButton;
40class QSpinBox;
41class QString;
42
43class KComboBox;
44class KLineEdit;
45
46namespace KABC {
47
48class ResourceLDAPConfig : public KRES::ConfigWidget
49{
50 Q_OBJECT
51
52 public:
53 ResourceLDAPConfig( QWidget* parent = 0, const char* name = 0 );
54
55 public slots:
56 void loadSettings( KRES::Resource* );
57 void saveSettings( KRES::Resource* );
58
59 private slots:
60 void editAttributes();
61
62 private:
63 KLineEdit *mUser;
64 KLineEdit *mPassword;
65 KLineEdit *mHost;
66 QSpinBox *mPort;
67 KLineEdit *mDn;
68 KLineEdit *mFilter;
69 QCheckBox *mAnonymous;
70 QPushButton *mEditButton;
71 QMap<QString, QString> mAttributes;
72};
73
74class AttributesDialog : public KDialogBase
75{
76 Q_OBJECT
77
78 public:
79 AttributesDialog( const QMap<QString, QString> &attributes, QWidget *parent,
80 const char *name = 0 );
81 ~AttributesDialog();
82
83 QMap<QString, QString> attributes() const;
84
85 private slots:
86 void mapChanged( int pos );
87
88 private:
89 enum { UserMap, KolabMap, NetscapeMap, EvolutionMap, OutlookMap };
90
91 KComboBox *mMapCombo;
92 QValueList< QMap<QString, QString> > mMapList;
93
94 QDict<KLineEdit> mLineEditDict;
95 QDict<QString> mNameDict;
96};
97
98}
99
100#endif