diff options
Diffstat (limited to 'certmanager/conf/dirservconfigpage.cpp')
-rw-r--r-- | certmanager/conf/dirservconfigpage.cpp | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/certmanager/conf/dirservconfigpage.cpp b/certmanager/conf/dirservconfigpage.cpp new file mode 100644 index 000000000..7711ca2e2 --- /dev/null +++ b/certmanager/conf/dirservconfigpage.cpp @@ -0,0 +1,296 @@ +/* + dirservconfigpage.cpp + + This file is part of kleopatra + Copyright (c) 2004 Klarälvdalens Datakonsult AB + + Libkleopatra is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License, + version 2, as published by the Free Software Foundation. + + Libkleopatra 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 + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. +*/ + +#include "dirservconfigpage.h" +#include "directoryserviceswidget.h" + +#include <kleo/cryptobackendfactory.h> + +#include <kmessagebox.h> +#include <klocale.h> +#include <kdebug.h> +#include <kconfig.h> +#include <knuminput.h> +#include <kdialog.h> + +#include <qhbox.h> +#include <qlabel.h> +#include <qdatetimeedit.h> +#include <qcheckbox.h> +#include <qlayout.h> + +#include <kdepimmacros.h> + +#if 0 // disabled, since it is apparently confusing +// For sync'ing kabldaprc +class KABSynchronizer +{ +public: + KABSynchronizer() + : mConfig( "kabldaprc" ) { + mConfig.setGroup( "LDAP" ); + } + + KURL::List readCurrentList() const { + + KURL::List lst; + // stolen from kabc/ldapclient.cpp + const uint numHosts = mConfig.readUnsignedNumEntry( "NumSelectedHosts" ); + for ( uint j = 0; j < numHosts; j++ ) { + const QString num = QString::number( j ); + + KURL url; + url.setProtocol( "ldap" ); + url.setPath( "/" ); // workaround KURL parsing bug + const QString host = mConfig.readEntry( QString( "SelectedHost" ) + num ).stripWhiteSpace(); + url.setHost( host ); + + const int port = mConfig.readUnsignedNumEntry( QString( "SelectedPort" ) + num ); + if ( port != 0 ) + url.setPort( port ); + + const QString base = mConfig.readEntry( QString( "SelectedBase" ) + num ).stripWhiteSpace(); + url.setQuery( base ); + + const QString bindDN = mConfig.readEntry( QString( "SelectedBind" ) + num ).stripWhiteSpace(); + url.setUser( bindDN ); + + const QString pwdBindDN = mConfig.readEntry( QString( "SelectedPwdBind" ) + num ).stripWhiteSpace(); + url.setPass( pwdBindDN ); + lst.append( url ); + } + return lst; + } + + void writeList( const KURL::List& lst ) { + + mConfig.writeEntry( "NumSelectedHosts", lst.count() ); + + KURL::List::const_iterator it = lst.begin(); + KURL::List::const_iterator end = lst.end(); + unsigned j = 0; + for( ; it != end; ++it, ++j ) { + const QString num = QString::number( j ); + KURL url = *it; + + Q_ASSERT( url.protocol() == "ldap" ); + mConfig.writeEntry( QString( "SelectedHost" ) + num, url.host() ); + mConfig.writeEntry( QString( "SelectedPort" ) + num, url.port() ); + + // KURL automatically encoded the query (e.g. for spaces inside it), + // so decode it before writing it out + const QString base = KURL::decode_string( url.query().mid(1) ); + mConfig.writeEntry( QString( "SelectedBase" ) + num, base ); + mConfig.writeEntry( QString( "SelectedBind" ) + num, url.user() ); + mConfig.writeEntry( QString( "SelectedPwdBind" ) + num, url.pass() ); + } + mConfig.sync(); + } + +private: + KConfig mConfig; +}; + +#endif + +static const char s_dirserv_componentName[] = "dirmngr"; +static const char s_dirserv_groupName[] = "LDAP"; +static const char s_dirserv_entryName[] = "LDAP Server"; + +static const char s_timeout_componentName[] = "dirmngr"; +static const char s_timeout_groupName[] = "LDAP"; +static const char s_timeout_entryName[] = "ldaptimeout"; + +static const char s_maxitems_componentName[] = "dirmngr"; +static const char s_maxitems_groupName[] = "LDAP"; +static const char s_maxitems_entryName[] = "max-replies"; + +static const char s_addnewservers_componentName[] = "dirmngr"; +static const char s_addnewservers_groupName[] = "LDAP"; +static const char s_addnewservers_entryName[] = "add-servers"; + +DirectoryServicesConfigurationPage::DirectoryServicesConfigurationPage( QWidget * parent, const char * name ) + : KCModule( parent, name ) +{ + mConfig = Kleo::CryptoBackendFactory::instance()->config(); + QVBoxLayout* lay = new QVBoxLayout( this, 0, KDialog::spacingHint() ); + Kleo::CryptoConfigEntry* entry = configEntry( s_dirserv_componentName, s_dirserv_groupName, s_dirserv_entryName, + Kleo::CryptoConfigEntry::ArgType_LDAPURL, true ); + mWidget = new Kleo::DirectoryServicesWidget( entry, this ); + lay->addWidget( mWidget ); + connect( mWidget, SIGNAL( changed() ), this, SLOT( slotChanged() ) ); + + // LDAP timeout + QHBox* box = new QHBox( this ); + box->setSpacing( KDialog::spacingHint() ); + lay->addWidget( box ); + QLabel* label = new QLabel( i18n( "LDAP &timeout (minutes:seconds)" ), box ); + mTimeout = new QTimeEdit( box ); + mTimeout->setDisplay( QTimeEdit::Minutes | QTimeEdit::Seconds ); + connect( mTimeout, SIGNAL( valueChanged( const QTime& ) ), this, SLOT( slotChanged() ) ); + label->setBuddy( mTimeout ); + QWidget* stretch = new QWidget( box ); + box->setStretchFactor( stretch, 2 ); + + // Max number of items returned by queries + box = new QHBox( this ); + box->setSpacing( KDialog::spacingHint() ); + lay->addWidget( box ); + mMaxItems = new KIntNumInput( box ); + mMaxItems->setLabel( i18n( "&Maximum number of items returned by query" ), Qt::AlignLeft | Qt::AlignVCenter ); + mMaxItems->setMinValue( 0 ); + connect( mMaxItems, SIGNAL( valueChanged(int) ), this, SLOT( slotChanged() ) ); + stretch = new QWidget( box ); + box->setStretchFactor( stretch, 2 ); + +#ifdef NOT_USEFUL_CURRENTLY + mAddNewServersCB = new QCheckBox( i18n( "Automatically add &new servers discovered in CRL distribution points" ), this ); + connect( mAddNewServersCB, SIGNAL( clicked() ), this, SLOT( slotChanged() ) ); + lay->addWidget( mAddNewServersCB ); +#endif + +#ifndef HAVE_UNBROKEN_KCMULTIDIALOG + load(); +#endif +} + +void DirectoryServicesConfigurationPage::load() +{ + mWidget->load(); + + mTimeoutConfigEntry = configEntry( s_timeout_componentName, s_timeout_groupName, s_timeout_entryName, Kleo::CryptoConfigEntry::ArgType_UInt, false ); + if ( mTimeoutConfigEntry ) { + QTime time = QTime().addSecs( mTimeoutConfigEntry->uintValue() ); + //kdDebug() << "timeout:" << mTimeoutConfigEntry->uintValue() << " -> " << time << endl; + mTimeout->setTime( time ); + } + + mMaxItemsConfigEntry = configEntry( s_maxitems_componentName, s_maxitems_groupName, s_maxitems_entryName, Kleo::CryptoConfigEntry::ArgType_UInt, false ); + if ( mMaxItemsConfigEntry ) { + mMaxItems->blockSignals( true ); // KNumInput emits valueChanged from setValue! + mMaxItems->setValue( mMaxItemsConfigEntry->uintValue() ); + mMaxItems->blockSignals( false ); + } + +#ifdef NOT_USEFUL_CURRENTLY + mAddNewServersConfigEntry = configEntry( s_addnewservers_componentName, s_addnewservers_groupName, s_addnewservers_entryName, Kleo::CryptoConfigEntry::ArgType_None, false ); + if ( mAddNewServersConfigEntry ) { + mAddNewServersCB->setChecked( mAddNewServersConfigEntry->boolValue() ); + } +#endif +} + +void DirectoryServicesConfigurationPage::save() +{ + mWidget->save(); + + QTime time( mTimeout->time() ); + unsigned int timeout = time.minute() * 60 + time.second(); + if ( mTimeoutConfigEntry && mTimeoutConfigEntry->uintValue() != timeout ) + mTimeoutConfigEntry->setUIntValue( timeout ); + if ( mMaxItemsConfigEntry && mMaxItemsConfigEntry->uintValue() != (uint)mMaxItems->value() ) + mMaxItemsConfigEntry->setUIntValue( mMaxItems->value() ); +#ifdef NOT_USEFUL_CURRENTLY + if ( mAddNewServersConfigEntry && mAddNewServersConfigEntry->boolValue() != mAddNewServersCB->isChecked() ) + mAddNewServersConfigEntry->setBoolValue( mAddNewServersCB->isChecked() ); +#endif + + mConfig->sync( true ); + +#if 0 + // Also write the LDAP URLs to kabldaprc so that they are used by kaddressbook + KABSynchronizer sync; + const KURL::List toAdd = mWidget->urlList(); + KURL::List currentList = sync.readCurrentList(); + + KURL::List::const_iterator it = toAdd.begin(); + KURL::List::const_iterator end = toAdd.end(); + for( ; it != end; ++it ) { + // check if the URL is already in currentList + if ( currentList.find( *it ) == currentList.end() ) + // if not, add it + currentList.append( *it ); + } + sync.writeList( currentList ); +#endif +} + +void DirectoryServicesConfigurationPage::defaults() +{ + mWidget->defaults(); + if ( mTimeoutConfigEntry ) + mTimeoutConfigEntry->resetToDefault(); + if ( mMaxItemsConfigEntry ) + mMaxItemsConfigEntry->resetToDefault(); +#ifdef NOT_USEFUL_CURRENTLY + if ( mAddNewServersConfigEntry ) + mAddNewServersConfigEntry->resetToDefault(); +#endif + load(); +} + +extern "C" +{ + KDE_EXPORT KCModule *create_kleopatra_config_dirserv( QWidget *parent, const char * ) + { + DirectoryServicesConfigurationPage *page = + new DirectoryServicesConfigurationPage( parent, "kleopatra_config_dirserv" ); + return page; + } +} + +// kdelibs-3.2 didn't have the changed signal in KCModule... +void DirectoryServicesConfigurationPage::slotChanged() +{ + emit changed(true); +} + + +// Find config entry for ldap servers. Implements runtime checks on the configuration option. +Kleo::CryptoConfigEntry* DirectoryServicesConfigurationPage::configEntry( const char* componentName, + const char* groupName, + const char* entryName, + Kleo::CryptoConfigEntry::ArgType argType, + bool isList ) +{ + Kleo::CryptoConfigEntry* entry = mConfig->entry( componentName, groupName, entryName ); + if ( !entry ) { + KMessageBox::error( this, i18n( "Backend error: gpgconf does not seem to know the entry for %1/%2/%3" ).arg( componentName, groupName, entryName ) ); + return 0; + } + if( entry->argType() != argType || entry->isList() != isList ) { + KMessageBox::error( this, i18n( "Backend error: gpgconf has wrong type for %1/%2/%3: %4 %5" ).arg( componentName, groupName, entryName ).arg( entry->argType() ).arg( entry->isList() ) ); + return 0; + } + return entry; +} + +#include "dirservconfigpage.moc" |