summaryrefslogtreecommitdiffabout
path: root/kabc/plugins/ldap
Side-by-side diff
Diffstat (limited to 'kabc/plugins/ldap') (more/less context) (show 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 @@
+/*
+ This file is part of libkabc.
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/*
+Enhanced Version of the file for platform independent KDE tools.
+Copyright (c) 2004 Ulf Schenk
+
+$Id$
+*/
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kstringhandler.h>
+
+#include <stdlib.h>
+
+#include "resourceldap.h"
+#include "resourceldapconfig.h"
+
+using namespace KABC;
+
+extern "C"
+{
+ void *init_kabc_ldap()
+ {
+ qDebug("resourceldap.cpp : init_kabc_ldap has to be changed");
+//US return new KRES::PluginFactory<ResourceLDAP,ResourceLDAPConfig>();
+ }
+}
+
+void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value );
+
+
+ResourceLDAP::ResourceLDAP( const KConfig *config )
+ : Resource( config ), mPort( 389 ), mLdap( 0 )
+{
+ KConfig *cfg = (KConfig *)config;
+ if ( cfg ) {
+ mUser = cfg->readEntry( "LdapUser" );
+ mPassword = KStringHandler::obscure( cfg->readEntry( "LdapPassword" ) );
+ mDn = cfg->readEntry( "LdapDn" );
+ mHost = cfg->readEntry( "LdapHost" );
+ mPort = cfg->readNumEntry( "LdapPort", 389 );
+ mFilter = cfg->readEntry( "LdapFilter" );
+ mAnonymous = cfg->readBoolEntry( "LdapAnonymous" );
+
+ QStringList attributes = cfg->readListEntry( "LdapAttributes" );
+ for ( uint pos = 0; pos < attributes.count(); pos += 2 )
+ mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] );
+ }
+
+ /**
+ If you want to add new attributes, append them here, add a
+ translation string in the ctor of AttributesDialog and
+ handle them in the load() method below.
+ These are the default values from
+ */
+ if ( mAttributes.count() == 0 ) {
+ mAttributes.insert( "commonName", "cn" );
+ mAttributes.insert( "formattedName", "displayName" );
+ mAttributes.insert( "familyName", "sn" );
+ mAttributes.insert( "givenName", "givenName" );
+ mAttributes.insert( "mail", "mail" );
+ mAttributes.insert( "mailAlias", "" );
+ mAttributes.insert( "phoneNumber", "telephoneNumber" );
+ mAttributes.insert( "uid", "uid" );
+ }
+}
+
+void ResourceLDAP::writeConfig( KConfig *config )
+{
+ Resource::writeConfig( config );
+
+ config->writeEntry( "LdapUser", mUser );
+ config->writeEntry( "LdapPassword", KStringHandler::obscure( mPassword ) );
+ config->writeEntry( "LdapDn", mDn );
+ config->writeEntry( "LdapHost", mHost );
+ config->writeEntry( "LdapPort", mPort );
+ config->writeEntry( "LdapFilter", mFilter );
+ config->writeEntry( "LdapAnonymous", mAnonymous );
+
+ QStringList attributes;
+ QMap<QString, QString>::Iterator it;
+ for ( it = mAttributes.begin(); it != mAttributes.end(); ++it )
+ attributes << it.key() << it.data();
+
+ config->writeEntry( "LdapAttributes", attributes );
+}
+
+Ticket *ResourceLDAP::requestSaveTicket()
+{
+ if ( !addressBook() ) {
+ kdDebug(5700) << "no addressbook" << endl;
+ return 0;
+ }
+
+ return createTicket( this );
+}
+
+bool ResourceLDAP::doOpen()
+{
+ if ( mLdap )
+ return false;
+
+ if ( !mPort )
+ mPort = 389;
+
+ mLdap = ldap_init( mHost.local8Bit(), mPort );
+ if ( !mLdap ) {
+ addressBook()->error( i18n( "Unable to connect to server '%1' on port '%2'" ).arg( mHost ).arg( mPort ) );
+ return false;
+ }
+
+ if ( !mUser.isEmpty() && !mAnonymous ) {
+ if ( ldap_simple_bind_s( mLdap, mUser.local8Bit(), mPassword.local8Bit() ) != LDAP_SUCCESS ) {
+ addressBook()->error( i18n( "Unable to bind to server '%1'" ).arg( mHost ) );
+ return false;
+ }
+
+ kdDebug(5700) << "ResourceLDAP: bind to server successfully" << endl;
+ } else {
+ if ( ldap_simple_bind_s( mLdap, NULL, NULL ) != LDAP_SUCCESS ) {
+ addressBook()->error( i18n( "Unable to bind anonymously to server '%1'" ).arg( mHost ) );
+ return false;
+ }
+
+ kdDebug( 5700 ) << "ResourceLDAP: bind anonymously to server successfully" << endl;
+ }
+
+ int deref = LDAP_DEREF_ALWAYS;
+ if ( ldap_set_option( mLdap, LDAP_OPT_DEREF, (void *) &deref ) != LDAP_OPT_SUCCESS ) {
+ kdDebug(5700) << "ResourceLDAP: can't set 'deref' option" << endl;
+ return false;
+ }
+
+ if ( ldap_set_option( mLdap, LDAP_OPT_REFERRALS, LDAP_OPT_ON ) != LDAP_OPT_SUCCESS ) {
+ kdDebug(5700) << "ResourceLDAP: can't set 'referrals' option" << endl;
+ return false;
+ }
+
+ return true;
+}
+
+void ResourceLDAP::doClose()
+{
+ if ( ldap_unbind_s( mLdap ) != LDAP_SUCCESS ) {
+ kdDebug(5700) << "ResourceLDAP: can't unbind from server" << endl;
+ return;
+ }
+
+ mLdap = 0;
+}
+
+bool ResourceLDAP::load()
+{
+ LDAPMessage *res;
+ LDAPMessage *msg;
+ BerElement *track;
+ char *names;
+ char **values;
+
+ char **LdapSearchAttr = new char*[ mAttributes.count() + 1 ];
+
+ QMap<QString, QString>::Iterator it;
+ int i = 0;
+ for ( it = mAttributes.begin(); it != mAttributes.end(); ++it ) {
+ if ( !it.data().isEmpty() ) {
+ unsigned int len = it.data().utf8().length();
+ LdapSearchAttr[ i ] = new char[ len+1 ];
+ memcpy( LdapSearchAttr[ i ], it.data().utf8(), len );
+ LdapSearchAttr[ i ][ len ] = 0;
+ ++i;
+ }
+ }
+ LdapSearchAttr[ i ] = 0;
+
+ QString filter = mFilter;
+ if ( filter.isEmpty() )
+ filter = "cn=*";
+
+ int result;
+ if ( ( result = ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, QString( "(%1)" ).arg( filter ).local8Bit(),
+ LdapSearchAttr, 0, &res ) != LDAP_SUCCESS ) ) {
+ addressBook()->error( i18n( "Unable to search on server '%1': %2" )
+ .arg( mHost )
+ .arg( ldap_err2string( result ) ) );
+
+ for ( i = 0; LdapSearchAttr[ i ]; ++i )
+ delete [] LdapSearchAttr[ i ];
+ delete [] LdapSearchAttr;
+
+ return false;
+ }
+
+ for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) {
+ Addressee addr;
+ addr.setResource( this );
+ for ( names = ldap_first_attribute( mLdap, msg, &track ); names; names = ldap_next_attribute( mLdap, msg, track ) ) {
+ values = ldap_get_values( mLdap, msg, names );
+ for ( int i = 0; i < ldap_count_values( values ); ++i ) {
+ QString name = QString::fromUtf8( names ).lower();
+ QString value = QString::fromUtf8( values[ i ] );
+
+ if ( name == mAttributes[ "commonName" ].lower() ) {
+ if ( !addr.formattedName().isEmpty() ) {
+ QString fn = addr.formattedName();
+ addr.setNameFromString( value );
+ addr.setFormattedName( fn );
+ } else
+ addr.setNameFromString( value );
+ } else if ( name == mAttributes[ "formattedName" ].lower() ) {
+ addr.setFormattedName( value );
+ } else if ( name == mAttributes[ "givenName" ].lower() ) {
+ addr.setGivenName( value );
+ } else if ( name == mAttributes[ "mail" ].lower() ) {
+ addr.insertEmail( value, true );
+ } else if ( name == mAttributes[ "mailAlias" ].lower() ) {
+ addr.insertEmail( value, false );
+ } else if ( name == mAttributes[ "phoneNumber" ].lower() ) {
+ PhoneNumber phone;
+ phone.setNumber( value );
+ addr.insertPhoneNumber( phone );
+ break; // read only the home number
+ } else if ( name == mAttributes[ "familyName" ].lower() ) {
+ addr.setFamilyName( value );
+ } else if ( name == mAttributes[ "uid" ].lower() ) {
+ addr.setUid( value );
+ }
+ }
+ ldap_value_free( values );
+ }
+ ber_free( track, 0 );
+
+ addressBook()->insertAddressee( addr );
+ }
+
+ ldap_msgfree( res );
+
+ for ( i = 0; LdapSearchAttr[ i ]; ++i )
+ delete [] LdapSearchAttr[ i ];
+ delete [] LdapSearchAttr;
+
+ return true;
+}
+
+bool ResourceLDAP::save( Ticket * )
+{
+ AddressBook::Iterator it;
+ for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) {
+ if ( (*it).resource() == this && (*it).changed() ) {
+ LDAPMod **mods = NULL;
+
+ addModOp( &mods, "objectClass", "organizationalPerson" );
+ addModOp( &mods, "objectClass", "person" );
+ addModOp( &mods, "objectClass", "Top" );
+ addModOp( &mods, mAttributes[ "commonName" ].utf8(), (*it).assembledName() );
+ addModOp( &mods, mAttributes[ "formattedName" ].utf8(), (*it).formattedName() );
+ addModOp( &mods, mAttributes[ "givenName" ].utf8(), (*it).givenName() );
+ addModOp( &mods, mAttributes[ "familyName" ].utf8(), (*it).familyName() );
+ addModOp( &mods, mAttributes[ "uid" ].utf8(), (*it).uid() );
+
+ QStringList emails = (*it).emails();
+ QStringList::ConstIterator mailIt;
+ bool first = true;
+ for ( mailIt = emails.begin(); mailIt != emails.end(); ++mailIt ) {
+ if ( first ) {
+ addModOp( &mods, mAttributes[ "mail" ].utf8(), (*mailIt) );
+ first = false;
+ } else
+ addModOp( &mods, mAttributes[ "mailAlias" ].utf8(), (*mailIt) );
+ }
+
+ PhoneNumber number = (*it).phoneNumber( PhoneNumber::Home );
+ addModOp( &mods, mAttributes[ "phoneNumber" ].utf8(), number.number() );
+
+ QString dn = "cn=" + (*it).assembledName() + "," + mDn;
+
+ int retval;
+ if ( (retval = ldap_add_s( mLdap, dn.local8Bit(), mods )) != LDAP_SUCCESS )
+ addressBook()->error( i18n( "Unable to modify '%1' on server '%2'" ).arg( (*it).uid() ).arg( mHost ) );
+
+ ldap_mods_free( mods, 1 );
+
+ // mark as unchanged
+ (*it).setChanged( false );
+ }
+ }
+
+ return true;
+}
+
+void ResourceLDAP::removeAddressee( const Addressee &addr )
+{
+ LDAPMessage *res;
+ LDAPMessage *msg;
+
+ QString filter = QString( "(&(uid=%1)(%2))" ).arg( addr.uid() ).arg( mFilter );
+
+ kdDebug(5700) << "ldap:removeAddressee" << filter << endl;
+
+ ldap_search_s( mLdap, mDn.local8Bit(), LDAP_SCOPE_SUBTREE, filter.local8Bit(),
+ 0, 0, &res );
+
+ for ( msg = ldap_first_entry( mLdap, res ); msg; msg = ldap_next_entry( mLdap, msg ) ) {
+ char *dn = ldap_get_dn( mLdap, msg );
+ kdDebug(5700) << "found " << dn << endl;
+ if ( ldap_delete_s( mLdap, dn ) != LDAP_SUCCESS )
+ addressBook()->error( i18n( "Unable to delete '%1' on server '%2'" ).arg( dn ).arg( mHost ) );
+ ldap_memfree( dn );
+ }
+
+ ldap_msgfree( res );
+}
+
+void ResourceLDAP::setUser( const QString &user )
+{
+ mUser = user;
+}
+
+QString ResourceLDAP::user() const
+{
+ return mUser;
+}
+
+void ResourceLDAP::setPassword( const QString &password )
+{
+ mPassword = password;
+}
+
+QString ResourceLDAP::password() const
+{
+ return mPassword;
+}
+
+void ResourceLDAP::setDn( const QString &dn )
+{
+ mDn = dn;
+}
+
+QString ResourceLDAP::dn() const
+{
+ return mDn;
+}
+
+void ResourceLDAP::setHost( const QString &host )
+{
+ mHost = host;
+}
+
+QString ResourceLDAP::host() const
+{
+ return mHost;
+}
+
+void ResourceLDAP::setPort( int port )
+{
+ mPort = port;
+}
+
+int ResourceLDAP::port() const
+{
+ return mPort;
+}
+
+void ResourceLDAP::setFilter( const QString &filter )
+{
+ mFilter = filter;
+}
+
+QString ResourceLDAP::filter() const
+{
+ return mFilter;
+}
+
+void ResourceLDAP::setIsAnonymous( bool value )
+{
+ mAnonymous = value;
+}
+
+bool ResourceLDAP::isAnonymous() const
+{
+ return mAnonymous;
+}
+
+void ResourceLDAP::setAttributes( const QMap<QString, QString> &attributes )
+{
+ mAttributes = attributes;
+}
+
+QMap<QString, QString> ResourceLDAP::attributes() const
+{
+ return mAttributes;
+}
+
+void addModOp( LDAPMod ***pmods, const QString &attr, const QString &value )
+{
+ if ( value.isNull() )
+ return;
+
+ LDAPMod **mods;
+
+ mods = *pmods;
+
+ uint i = 0;
+ if ( mods != 0 )
+ for ( ; mods[ i ] != 0; ++i );
+
+ if (( mods = (LDAPMod **)realloc( mods, (i + 2) * sizeof( LDAPMod * ))) == 0 ) {
+ kdError() << "ResourceLDAP: realloc" << endl;
+ return;
+ }
+
+ *pmods = mods;
+ mods[ i + 1 ] = 0;
+
+ mods[ i ] = new LDAPMod;
+
+ mods[ i ]->mod_op = 0;
+ mods[ i ]->mod_type = strdup( attr.utf8() );
+ mods[ i ]->mod_values = new char*[ 2 ];
+ mods[ i ]->mod_values[ 0 ] = strdup( value.utf8() );
+ mods[ i ]->mod_values[ 1 ] = 0;
+}
+
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 @@
+/*
+ This file is part of libkabc.
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/*
+Enhanced Version of the file for platform independent KDE tools.
+Copyright (c) 2004 Ulf Schenk
+
+$Id$
+*/
+
+#ifndef KABC_RESOURCELDAP_H
+#define KABC_RESOURCELDAP_H
+
+
+#include <lber.h>
+#include <ldap.h>
+
+#include "addressbook.h"
+#include "resource.h"
+
+class KConfig;
+
+namespace KABC {
+
+class ResourceLDAP : public Resource
+{
+public:
+
+ ResourceLDAP( const KConfig* );
+
+ virtual void writeConfig( KConfig* );
+
+ virtual bool doOpen();
+ virtual void doClose();
+
+ virtual Ticket *requestSaveTicket();
+
+ virtual bool load();
+ virtual bool save( Ticket * );
+
+ virtual void removeAddressee( const Addressee& addr );
+
+ void setUser( const QString &user );
+ QString user() const;
+
+ void setPassword( const QString &password );
+ QString password() const;
+
+ void setDn( const QString &dn );
+ QString dn() const;
+
+ void setHost( const QString &host );
+ QString host() const;
+
+ void setPort( int port );
+ int port() const;
+
+ void setFilter( const QString &filter );
+ QString filter() const;
+
+ void setIsAnonymous( bool value );
+ bool isAnonymous() const;
+
+ void setAttributes( const QMap<QString, QString> &attributes );
+ QMap<QString, QString> attributes() const;
+
+private:
+ QString mUser;
+ QString mPassword;
+ QString mDn;
+ QString mHost;
+ QString mFilter;
+ int mPort;
+ bool mAnonymous;
+ QMap<QString, QString> mAttributes;
+
+ LDAP *mLdap;
+};
+
+}
+
+#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 @@
+/*
+ This file is part of libkabc.
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/*
+Enhanced Version of the file for platform independent KDE tools.
+Copyright (c) 2004 Ulf Schenk
+
+$Id$
+*/
+
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qvbox.h>
+
+//US #include <kaccelmanager.h>
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <klineedit.h>
+
+#include "resourceldap.h"
+
+#include "resourceldapconfig.h"
+
+using namespace KABC;
+
+ResourceLDAPConfig::ResourceLDAPConfig( QWidget* parent, const char* name )
+ : KRES::ConfigWidget( parent, name )
+{
+ QGridLayout *mainLayout = new QGridLayout( this, 8, 2, 0,
+ KDialog::spacingHint() );
+
+ QLabel *label = new QLabel( i18n( "User:" ), this );
+ mUser = new KLineEdit( this );
+
+ mainLayout->addWidget( label, 0, 0 );
+ mainLayout->addWidget( mUser, 0, 1 );
+
+ label = new QLabel( i18n( "Password:" ), this );
+ mPassword = new KLineEdit( this );
+ mPassword->setEchoMode( KLineEdit::Password );
+
+ mainLayout->addWidget( label, 1, 0 );
+ mainLayout->addWidget( mPassword, 1, 1 );
+
+ label = new QLabel( i18n( "Host:" ), this );
+ mHost = new KLineEdit( this );
+
+ mainLayout->addWidget( label, 2, 0 );
+ mainLayout->addWidget( mHost, 2, 1 );
+
+ label = new QLabel( i18n( "Port:" ), this );
+ QVBox *box = new QVBox( this );
+ mPort = new QSpinBox( 0, 65535, 1, box );
+ mPort->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) );
+ mPort->setValue( 389 );
+ new QWidget( box, "dummy" );
+
+ mainLayout->addWidget( label, 3, 0 );
+ mainLayout->addWidget( box, 3, 1 );
+
+ label = new QLabel( i18n( "Dn:" ), this );
+ mDn = new KLineEdit( this );
+
+ mainLayout->addWidget( label, 4, 0 );
+ mainLayout->addWidget( mDn, 4, 1 );
+
+ label = new QLabel( i18n( "Filter:" ), this );
+ mFilter = new KLineEdit( this );
+
+ mainLayout->addWidget( label, 5, 0 );
+ mainLayout->addWidget( mFilter, 5, 1 );
+
+ mAnonymous = new QCheckBox( i18n( "Anonymous login" ), this );
+ mainLayout->addMultiCellWidget( mAnonymous, 6, 6, 0, 1 );
+
+ mEditButton = new QPushButton( i18n( "Edit Attributes..." ), this );
+ mainLayout->addMultiCellWidget( mEditButton, 7, 7, 0, 1 );
+
+ connect( mAnonymous, SIGNAL( toggled(bool) ), mUser, SLOT( setDisabled(bool) ) );
+ connect( mAnonymous, SIGNAL( toggled(bool) ), mPassword, SLOT( setDisabled(bool) ) );
+ connect( mEditButton, SIGNAL( clicked() ), SLOT( editAttributes() ) );
+}
+
+void ResourceLDAPConfig::loadSettings( KRES::Resource *res )
+{
+//US ResourceLDAP *resource = dynamic_cast<ResourceLDAP*>( res );
+ ResourceLDAP *resource = (ResourceLDAP*)( res );
+
+ if ( !resource ) {
+ kdDebug(5700) << "ResourceLDAPConfig::loadSettings(): cast failed" << endl;
+ return;
+ }
+
+ mUser->setText( resource->user() );
+ mPassword->setText( resource->password() );
+ mHost->setText( resource->host() );
+ mPort->setValue( resource->port() );
+ mDn->setText( resource->dn() );
+ mFilter->setText( resource->filter() );
+ mAnonymous->setChecked( resource->isAnonymous() );
+ mAttributes = resource->attributes();
+}
+
+void ResourceLDAPConfig::saveSettings( KRES::Resource *res )
+{
+//US ResourceLDAP *resource = dynamic_cast<ResourceLDAP*>( res );
+ ResourceLDAP *resource = (ResourceLDAP*)( res );
+
+ if ( !resource ) {
+ kdDebug(5700) << "ResourceLDAPConfig::saveSettings(): cast failed" << endl;
+ return;
+ }
+
+ resource->setUser( mUser->text() );
+ resource->setPassword( mPassword->text() );
+ resource->setHost( mHost->text() );
+ resource->setPort( mPort->value() );
+ resource->setDn( mDn->text() );
+ resource->setFilter( mFilter->text() );
+ resource->setIsAnonymous( mAnonymous->isChecked() );
+ resource->setAttributes( mAttributes );
+}
+
+void ResourceLDAPConfig::editAttributes()
+{
+ AttributesDialog dlg( mAttributes, this );
+ if ( dlg.exec() )
+ mAttributes = dlg.attributes();
+}
+
+AttributesDialog::AttributesDialog( const QMap<QString, QString> &attributes,
+ QWidget *parent, const char *name )
+ : KDialogBase( Plain, i18n( "Attributes Configuration" ), Ok | Cancel,
+ Ok, parent, name, true, true )
+{
+ mNameDict.setAutoDelete( true );
+ mNameDict.insert( "commonName", new QString( i18n( "Common name" ) ) );
+ mNameDict.insert( "formattedName", new QString( i18n( "Formatted name" ) ) );
+ mNameDict.insert( "familyName", new QString( i18n( "Family name" ) ) );
+ mNameDict.insert( "givenName", new QString( i18n( "Given name" ) ) );
+ mNameDict.insert( "mail", new QString( i18n( "Email" ) ) );
+ mNameDict.insert( "mailAlias", new QString( i18n( "Email alias" ) ) );
+ mNameDict.insert( "phoneNumber", new QString( i18n( "Telephone number" ) ) );
+ mNameDict.insert( "uid", new QString( i18n( "UID" ) ) );
+
+ // overwrite the default values here
+ QMap<QString, QString> kolabMap, netscapeMap, evolutionMap, outlookMap;
+
+ // kolab
+ kolabMap.insert( "formattedName", "display-name" );
+ kolabMap.insert( "mailAlias", "mailalias" );
+
+ // evolution
+ evolutionMap.insert( "formattedName", "fileAs" );
+
+ mMapList.append( attributes );
+ mMapList.append( kolabMap );
+ mMapList.append( netscapeMap );
+ mMapList.append( evolutionMap );
+ mMapList.append( outlookMap );
+
+ QFrame *page = plainPage();
+ QGridLayout *layout = new QGridLayout( page, 2, attributes.count() + 1,
+ 0, spacingHint() );
+
+ QLabel *label = new QLabel( i18n( "Template:" ), page );
+ layout->addWidget( label, 0, 0 );
+ mMapCombo = new KComboBox( page );
+ layout->addWidget( mMapCombo, 0, 1 );
+
+ mMapCombo->insertItem( i18n( "User Defined" ) );
+ mMapCombo->insertItem( i18n( "Kolab" ) );
+ mMapCombo->insertItem( i18n( "Netscape" ) );
+ mMapCombo->insertItem( i18n( "Evolution" ) );
+ mMapCombo->insertItem( i18n( "Outlook" ) );
+ connect( mMapCombo, SIGNAL( activated( int ) ), SLOT( mapChanged( int ) ) );
+
+ QMap<QString, QString>::ConstIterator it;
+ int i;
+ for ( i = 1, it = attributes.begin(); it != attributes.end(); ++it, ++i ) {
+ label = new QLabel( *mNameDict[ it.key() ] + ":", page );
+ KLineEdit *lineedit = new KLineEdit( page );
+ mLineEditDict.insert( it.key(), lineedit );
+ lineedit->setText( it.data() );
+ label->setBuddy( lineedit );
+ layout->addWidget( label, i, 0 );
+ layout->addWidget( lineedit, i, 1 );
+ }
+
+//US KAcceleratorManager::manage( this );
+}
+
+AttributesDialog::~AttributesDialog()
+{
+}
+
+QMap<QString, QString> AttributesDialog::attributes() const
+{
+ QMap<QString, QString> map;
+
+ QDictIterator<KLineEdit> it( mLineEditDict );
+ for ( ; it.current(); ++it )
+ map.insert( it.currentKey(), it.current()->text() );
+
+ return map;
+}
+
+void AttributesDialog::mapChanged( int pos )
+{
+ // default map
+ QMap<QString, QString> defaultMap;
+ defaultMap.insert( "commonName", "cn" );
+ defaultMap.insert( "formattedName", "displayName" );
+ defaultMap.insert( "familyName", "sn" );
+ defaultMap.insert( "givenName", "givenName" );
+ defaultMap.insert( "mail", "mail" );
+ defaultMap.insert( "mailAlias", "" );
+ defaultMap.insert( "phoneNumber", "telephoneNumber" );
+ defaultMap.insert( "uid", "uid" );
+
+ // apply first the default and than the spezific changes
+ QMap<QString, QString>::Iterator it;
+ for ( it = defaultMap.begin(); it != defaultMap.end(); ++it )
+ mLineEditDict[ it.key() ]->setText( it.data() );
+
+ for ( it = mMapList[ pos ].begin(); it != mMapList[ pos ].end(); ++it ) {
+ if ( !it.data().isEmpty() )
+ mLineEditDict[ it.key() ]->setText( it.data() );
+ }
+}
+
+//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 @@
+/*
+ This file is part of libkabc.
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+/*
+Enhanced Version of the file for platform independent KDE tools.
+Copyright (c) 2004 Ulf Schenk
+
+$Id$
+*/
+
+#ifndef RESOURCELDAPCONFIG_H
+#define RESOURCELDAPCONFIG_H
+
+#include <qmap.h>
+//US
+#include <qdict.h>
+
+#include <kdialogbase.h>
+#include <kresources/configwidget.h>
+
+class QCheckBox;
+class QPushButton;
+class QSpinBox;
+class QString;
+
+class KComboBox;
+class KLineEdit;
+
+namespace KABC {
+
+class ResourceLDAPConfig : public KRES::ConfigWidget
+{
+ Q_OBJECT
+
+ public:
+ ResourceLDAPConfig( QWidget* parent = 0, const char* name = 0 );
+
+ public slots:
+ void loadSettings( KRES::Resource* );
+ void saveSettings( KRES::Resource* );
+
+ private slots:
+ void editAttributes();
+
+ private:
+ KLineEdit *mUser;
+ KLineEdit *mPassword;
+ KLineEdit *mHost;
+ QSpinBox *mPort;
+ KLineEdit *mDn;
+ KLineEdit *mFilter;
+ QCheckBox *mAnonymous;
+ QPushButton *mEditButton;
+ QMap<QString, QString> mAttributes;
+};
+
+class AttributesDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ AttributesDialog( const QMap<QString, QString> &attributes, QWidget *parent,
+ const char *name = 0 );
+ ~AttributesDialog();
+
+ QMap<QString, QString> attributes() const;
+
+ private slots:
+ void mapChanged( int pos );
+
+ private:
+ enum { UserMap, KolabMap, NetscapeMap, EvolutionMap, OutlookMap };
+
+ KComboBox *mMapCombo;
+ QValueList< QMap<QString, QString> > mMapList;
+
+ QDict<KLineEdit> mLineEditDict;
+ QDict<QString> mNameDict;
+};
+
+}
+
+#endif