00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <kdebug.h>
00022
#include <kglobal.h>
00023
#include <klineedit.h>
00024
#include <klocale.h>
00025
#include <kconfig.h>
00026
#include <kstringhandler.h>
00027
00028
#include <stdlib.h>
00029
00030
#include <kabc/ldifconverter.h>
00031
00032
#include "resourceldapkio.h"
00033
#include "resourceldapkioconfig.h"
00034
00035
using namespace KABC;
00036
00037 ResourceLDAPKIO::ResourceLDAPKIO(
const KConfig *config )
00038 : Resource( config ), mGetCounter( 0 ), mErrorOccured( false )
00039 {
00040
if ( config ) {
00041
QMap<QString, QString> attrList;
00042
QStringList attributes = config->
readListEntry(
"LdapAttributes" );
00043
for ( uint pos = 0; pos < attributes.count(); pos += 2 )
00044 mAttributes.insert( attributes[ pos ], attributes[ pos + 1 ] );
00045
00046 mUser = config->
readEntry(
"LdapUser" );
00047 mPassword =
KStringHandler::obscure( config->
readEntry(
"LdapPassword" ) );
00048 mDn = config->
readEntry(
"LdapDn" );
00049 mHost = config->
readEntry(
"LdapHost" );
00050 mPort = config->
readNumEntry(
"LdapPort", 389 );
00051 mFilter = config->
readEntry(
"LdapFilter" );
00052 mAnonymous = config->
readBoolEntry(
"LdapAnonymous" );
00053 }
else {
00054 mPort = 389;
00055 mAnonymous =
true;
00056 }
00057
00058 init();
00059 }
00060
00061
void ResourceLDAPKIO::init()
00062 {
00069
if ( mPort == 0 ) mPort = 389;
00070
if ( mUser.isEmpty() && mPassword.isEmpty() ) mAnonymous =
true;
00071
00072
if ( mAttributes.count() == 0 ) {
00073 mAttributes.insert(
"commonName",
"cn" );
00074 mAttributes.insert(
"formattedName",
"displayName" );
00075 mAttributes.insert(
"familyName",
"sn" );
00076 mAttributes.insert(
"givenName",
"givenName" );
00077 mAttributes.insert(
"mail",
"mail" );
00078 mAttributes.insert(
"mailAlias",
"" );
00079 mAttributes.insert(
"phoneNumber",
"telephoneNumber" );
00080 mAttributes.insert(
"uid",
"uid" );
00081 }
00082
00083 mLDAPUrl.setProtocol(
"ldap" );
00084
if ( !mAnonymous ) {
00085 mLDAPUrl.setUser( mUser );
00086 mLDAPUrl.setPass( mPassword );
00087 }
00088 mLDAPUrl.setHost( mHost );
00089 mLDAPUrl.setPort( mPort );
00090 mLDAPUrl.setPath(
"/" + mDn );
00091
00092
QString query =
"?dn?sub";
00093
if ( !mFilter.isEmpty() )
00094 query +=
"?" + mFilter;
00095
00096 mLDAPUrl.setQuery( query );
00097 }
00098
00099
void ResourceLDAPKIO::writeConfig(
KConfig *config )
00100 {
00101 Resource::writeConfig( config );
00102
00103 config->
writeEntry(
"LdapUser", mUser );
00104 config->
writeEntry(
"LdapPassword", KStringHandler::obscure( mPassword ) );
00105 config->
writeEntry(
"LdapDn", mDn );
00106 config->
writeEntry(
"LdapHost", mHost );
00107 config->
writeEntry(
"LdapPort", mPort );
00108 config->
writeEntry(
"LdapFilter", mFilter );
00109 config->
writeEntry(
"LdapAnonymous", mAnonymous );
00110
00111
QStringList attributes;
00112
QMap<QString, QString>::Iterator it;
00113
for ( it = mAttributes.begin(); it != mAttributes.end(); ++it )
00114 attributes << it.key() << it.data();
00115
00116 config->
writeEntry(
"LdapAttributes", attributes );
00117 }
00118
00119
Ticket *ResourceLDAPKIO::requestSaveTicket()
00120 {
00121
if ( !addressBook() ) {
00122
kdDebug(5700) <<
"no addressbook" <<
endl;
00123
return 0;
00124 }
00125
00126
return createTicket(
this );
00127 }
00128
00129
void ResourceLDAPKIO::releaseSaveTicket(
Ticket *ticket )
00130 {
00131
delete ticket;
00132 }
00133
00134
bool ResourceLDAPKIO::doOpen()
00135 {
00136
return true;
00137 }
00138
00139
void ResourceLDAPKIO::doClose()
00140 {
00141 }
00142
00143
bool ResourceLDAPKIO::load()
00144 {
00145
return true;
00146 }
00147
00148
bool ResourceLDAPKIO::asyncLoad()
00149 {
00150 KIO::Job *job = KIO::listDir( mLDAPUrl,
false,
false );
00151
00152 connect( job, SIGNAL( entries( KIO::Job*,
const KIO::UDSEntryList& ) ),
00153
this, SLOT( entries( KIO::Job*,
const KIO::UDSEntryList& ) ) );
00154
00155
return true;
00156 }
00157
00158
void ResourceLDAPKIO::entries( KIO::Job*,
const KIO::UDSEntryList &list )
00159 {
00160 KIO::UDSEntryList::ConstIterator it;
00161
for ( it = list.begin(); it != list.end(); ++it ) {
00162 KIO::UDSEntry::ConstIterator atomIt;
00163
00164
bool isFile =
false;
00165
for ( atomIt = (*it).begin(); atomIt != (*it).end(); ++atomIt ) {
00166
if ( (*atomIt).m_uds == KIO::UDS_FILE_TYPE && (*atomIt).m_long == S_IFREG )
00167 isFile =
true;
00168 }
00169
00170
if ( isFile ) {
00171
for ( atomIt = (*it).begin(); atomIt != (*it).end(); ++atomIt ) {
00172
if ( (*atomIt).m_uds == KIO::UDS_URL ) {
00173 mGetCounter++;
00174 KIO::Job *job = KIO::get( (*atomIt).m_str,
true,
false );
00175 connect( job, SIGNAL( data( KIO::Job*,
const QByteArray& ) ),
00176
this, SLOT( data( KIO::Job*,
const QByteArray& ) ) );
00177 connect( job, SIGNAL( result( KIO::Job* ) ),
00178
this, SLOT( result( KIO::Job* ) ) );
00179
00180 mJobMap.insert( job,
QByteArray() );
00181 }
00182 }
00183 }
00184 }
00185 }
00186
00187
void ResourceLDAPKIO::data( KIO::Job *job,
const QByteArray &d )
00188 {
00189
QByteArray &data = mJobMap[ job ];
00190
00191
unsigned int oldSize = data.size();
00192 data.resize( oldSize + d.size() );
00193 memcpy( data.data() + oldSize, d.data(), d.size());
00194 }
00195
00196
void ResourceLDAPKIO::result( KIO::Job *job )
00197 {
00198 mGetCounter--;
00199
00200
if ( job->error() ) {
00201 mErrorOccured =
true;
00202 mErrorMsg = job->errorString();
00203 mJobMap.remove( job );
00204
return;
00205 }
00206
00207
QByteArray &data = mJobMap[ job ];
00208
00209
AddresseeList addrList;
00210
bool ok = LDIFConverter::LDIFToAddressee( data, addrList );
00211
00212
if ( !ok ) {
00213 mErrorOccured =
true;
00214 mErrorMsg = i18n(
"Error while parsing the LDIF file." );
00215 }
else {
00216 AddresseeList::Iterator it;
00217
for ( it = addrList.begin(); it != addrList.end(); ++it ) {
00218 (*it).setChanged(
false );
00219 (*it).setResource(
this );
00220 insertAddressee( *it );
00221 }
00222 }
00223
00224 mJobMap.remove( job );
00225
00226
if ( mGetCounter == 0 ) {
00227
if ( mErrorOccured )
00228 emit loadingError(
this, mErrorMsg );
00229
else
00230 emit loadingFinished(
this );
00231 }
00232 }
00233
00234
bool ResourceLDAPKIO::save(
Ticket* )
00235 {
00236
return false;
00237 }
00238
00239
bool ResourceLDAPKIO::asyncSave(
Ticket* )
00240 {
00241
return false;
00242 }
00243
00244
void ResourceLDAPKIO::removeAddressee(
const Addressee& )
00245 {
00246 }
00247
00248
void ResourceLDAPKIO::setUser(
const QString &user )
00249 {
00250 mUser = user;
00251 }
00252
00253
QString ResourceLDAPKIO::user()
const
00254
{
00255
return mUser;
00256 }
00257
00258
void ResourceLDAPKIO::setPassword(
const QString &password )
00259 {
00260 mPassword = password;
00261 }
00262
00263
QString ResourceLDAPKIO::password()
const
00264
{
00265
return mPassword;
00266 }
00267
00268
void ResourceLDAPKIO::setDn(
const QString &dn )
00269 {
00270 mDn = dn;
00271 }
00272
00273
QString ResourceLDAPKIO::dn()
const
00274
{
00275
return mDn;
00276 }
00277
00278
void ResourceLDAPKIO::setHost(
const QString &host )
00279 {
00280 mHost = host;
00281 }
00282
00283
QString ResourceLDAPKIO::host()
const
00284
{
00285
return mHost;
00286 }
00287
00288
void ResourceLDAPKIO::setPort(
int port )
00289 {
00290 mPort = port;
00291 }
00292
00293
int ResourceLDAPKIO::port()
const
00294
{
00295
return mPort;
00296 }
00297
00298
void ResourceLDAPKIO::setFilter(
const QString &filter )
00299 {
00300 mFilter = filter;
00301 }
00302
00303
QString ResourceLDAPKIO::filter()
const
00304
{
00305
return mFilter;
00306 }
00307
00308
void ResourceLDAPKIO::setIsAnonymous(
bool value )
00309 {
00310 mAnonymous = value;
00311 }
00312
00313
bool ResourceLDAPKIO::isAnonymous()
const
00314
{
00315
return mAnonymous;
00316 }
00317
00318
void ResourceLDAPKIO::setAttributes(
const QMap<QString, QString> &attributes )
00319 {
00320 mAttributes = attributes;
00321 }
00322
00323
QMap<QString, QString> ResourceLDAPKIO::attributes()
const
00324
{
00325
return mAttributes;
00326 }
00327
00328
#include "resourceldapkio.moc"