diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch) | |
tree | 67208f7c145782a7e90b123b982ca78d88cc2c87 /kaddressbook/editors/cryptowidget.cpp | |
download | tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kaddressbook/editors/cryptowidget.cpp')
-rw-r--r-- | kaddressbook/editors/cryptowidget.cpp | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/kaddressbook/editors/cryptowidget.cpp b/kaddressbook/editors/cryptowidget.cpp new file mode 100644 index 000000000..d2d5917f9 --- /dev/null +++ b/kaddressbook/editors/cryptowidget.cpp @@ -0,0 +1,227 @@ +/* + This file is part of KAddressBook. + Copyright (c) 2004 Klar�vdalens Datakonsult AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <config.h> +#include "certmanager/lib/ui/keyrequester.h" +#include "certmanager/lib/cryptplugfactory.h" +#include "certmanager/lib/cryptplugwrapper.h" +#include "certmanager/lib/kleo/enum.h" + +#include "gpgmepp/data.h" +#include "gpgmepp/key.h" + +#include <kdebug.h> +#include <kdialog.h> +#include <kiconloader.h> +#include <klocale.h> + +#include <qlayout.h> +#include <qlabel.h> +#include <qcheckbox.h> +#include <qcombobox.h> +#include <qpushbutton.h> +#include <qvgroupbox.h> +#include <qhbox.h> + +#include "cryptowidget.h" + +extern "C" { + void *init_libkaddrbk_cryptosettings() + { + return ( new CryptoWidgetFactory ); + } +} + +CryptoWidgetFactory::CryptoWidgetFactory() +{ + KGlobal::locale()->insertCatalogue( "libkleopatra" ); + KGlobal::iconLoader()->addAppDir( "libkleopatra" ); +} + +QString CryptoWidgetFactory::pageTitle() const +{ + return i18n( "Crypto Settings" ); +} + +QString CryptoWidgetFactory::pageIdentifier() const +{ + return "crypto"; +} + +CryptoWidget::CryptoWidget( KABC::AddressBook *ab, QWidget *parent, const char *name ) + : KAB::ContactEditorWidget( ab, parent, name ), mReadOnly( false ) +{ + QGridLayout *topLayout = new QGridLayout( this, 2, 5, KDialog::marginHint(), + KDialog::spacingHint() ); + topLayout->setColStretch( 1, 1 ); + topLayout->setRowStretch( 4, 1 ); + + QVGroupBox* protGB = new QVGroupBox( i18n( "Allowed Protocols" ), this ); + topLayout->addMultiCellWidget( protGB, 0, 0, 0, 1 ); + + uint msgFormat = 1; + for ( uint i = 0 ; i < NumberOfProtocols ; ++i ) { + Kleo::CryptoMessageFormat f = static_cast<Kleo::CryptoMessageFormat>( msgFormat ); + mProtocolCB[ i ] = new QCheckBox( Kleo::cryptoMessageFormatToLabel( f ), protGB ); + connect( mProtocolCB[i], SIGNAL( clicked() ), this, SLOT( setModified() ) ); + + // Iterating over a bitfield means *2 every time + msgFormat *= 2; + } + + QLabel* l = new QLabel( i18n( "Preferred OpenPGP encryption key:" ), this ); + topLayout->addWidget( l, 1, 0 ); + + mPgpKey = new Kleo::EncryptionKeyRequester( true, Kleo::EncryptionKeyRequester::OpenPGP, this ); + topLayout->addWidget( mPgpKey, 1, 1 ); + + l = new QLabel( i18n( "Preferred S/MIME encryption certificate:" ), this ); + topLayout->addWidget( l, 2, 0 ); + + mSmimeCert = new Kleo::EncryptionKeyRequester( true, Kleo::EncryptionKeyRequester::SMIME, this ); + topLayout->addWidget( mSmimeCert, 2, 1 ); + + QGroupBox* box = new QVGroupBox( i18n( "Message Preference" ), this ); + topLayout->addMultiCellWidget( box, 3, 3, 0, 1 ); + + + // Send preferences/sign (see certmanager/lib/kleo/enum.h) + QHBox* hbox = new QHBox( box ); + + l = new QLabel( i18n( "Sign:" ), hbox ); + + mSignPref = new QComboBox( false, hbox ); + for ( unsigned int i = Kleo::UnknownSigningPreference; i < Kleo::MaxSigningPreference ; ++i ) + mSignPref->insertItem( Kleo::signingPreferenceToLabel( + static_cast<Kleo::SigningPreference>( i ) ) ); + + // Send preferences/encrypt (see certmanager/lib/kleo/enum.h) + hbox = new QHBox( box ); + + l = new QLabel( i18n("Encrypt:"), hbox ); + + mCryptPref = new QComboBox( false, hbox ); + for ( unsigned int i = Kleo::UnknownPreference; i < Kleo::MaxEncryptionPreference ; ++i ) + mCryptPref->insertItem( Kleo::encryptionPreferenceToLabel( + static_cast<Kleo::EncryptionPreference>( i ) ) ); + + // Emit "changed()" signal + connect( mSignPref, SIGNAL( activated(int) ), this, SLOT( setModified() ) ); + connect( mCryptPref, SIGNAL( activated(int) ), this, SLOT( setModified() ) ); + // Not optimal, but KeyRequester doesn't emit any signals when the key changes + connect( mPgpKey->eraseButton(), SIGNAL( clicked() ), this, SLOT( setModified() ) ); + connect( mPgpKey->dialogButton(), SIGNAL( clicked() ), this, SLOT( setModified() ) ); + connect( mSmimeCert->eraseButton(), SIGNAL( clicked() ), this, SLOT( setModified() ) ); + connect( mSmimeCert->dialogButton(), SIGNAL( clicked() ), this, SLOT( setModified() ) ); +} + +CryptoWidget::~CryptoWidget() +{ +} + +void CryptoWidget::loadContact( KABC::Addressee *addr ) +{ + bool blocked = signalsBlocked(); + blockSignals( true ); + + QStringList lst = QStringList::split( ',', addr->custom( "KADDRESSBOOK", + "CRYPTOPROTOPREF" ) ); + uint cryptoFormats = Kleo::stringListToCryptoMessageFormats( lst ); + + uint msgFormat = 1; + for ( uint i = 0 ; i < NumberOfProtocols ; ++i, msgFormat *= 2 ) { + mProtocolCB[i]->setChecked( cryptoFormats & msgFormat ); + } + + mSignPref->setCurrentItem( Kleo::stringToSigningPreference( addr->custom( "KADDRESSBOOK", + "CRYPTOSIGNPREF" ) ) ); + mCryptPref->setCurrentItem( Kleo::stringToEncryptionPreference( addr->custom( "KADDRESSBOOK", + "CRYPTOENCRYPTPREF" ) ) ); + + // We dont use the contents of addr->key(...) because we want just a ref. + // to the key/cert. stored elsewhere. + + mPgpKey->setFingerprints( QStringList::split( ",", addr->custom( "KADDRESSBOOK", "OPENPGPFP" ) ) ); + mSmimeCert->setFingerprints( QStringList::split( ",", addr->custom( "KADDRESSBOOK", "SMIMEFP" ) ) ); + + blockSignals( blocked ); +} + +void CryptoWidget::storeContact( KABC::Addressee *addr ) +{ + uint cryptoFormats = 0; + uint msgFormat = 1; + for ( uint i = 0 ; i < NumberOfProtocols ; ++i, msgFormat *= 2 ) { + if ( mProtocolCB[ i ]->isChecked() ) + cryptoFormats |= msgFormat; + } + + QStringList lst = Kleo::cryptoMessageFormatsToStringList( cryptoFormats ); + if ( !lst.isEmpty() ) + addr->insertCustom( "KADDRESSBOOK", "CRYPTOPROTOPREF", lst.join( "," ) ); + else + addr->removeCustom( "KADDRESSBOOK", "CRYPTOPROTOPREF" ); + + Kleo::SigningPreference signPref = + static_cast<Kleo::SigningPreference>( mSignPref->currentItem() ); + if ( signPref != Kleo::UnknownSigningPreference ) + addr->insertCustom( "KADDRESSBOOK", "CRYPTOSIGNPREF", + Kleo::signingPreferenceToString( signPref ) ); + else + addr->removeCustom( "KADDRESSBOOK", "CRYPTOSIGNPREF" ); + + Kleo::EncryptionPreference encryptPref = + static_cast<Kleo::EncryptionPreference>( mCryptPref->currentItem() ); + if ( encryptPref != Kleo::UnknownPreference ) + addr->insertCustom( "KADDRESSBOOK", "CRYPTOENCRYPTPREF", + Kleo::encryptionPreferenceToString( encryptPref ) ); + else + addr->removeCustom( "KADDRESSBOOK", "CRYPTOENCRYPTPREF" ); + + QStringList pfp = mPgpKey->fingerprints(); + QStringList sfp = mSmimeCert->fingerprints(); + + if ( !pfp.isEmpty() ) + addr->insertCustom( "KADDRESSBOOK", "OPENPGPFP", pfp.join( "," ) ); + else + addr->removeCustom( "KADDRESSBOOK", "OPENPGPFP" ); + + if ( !sfp.isEmpty() ) + addr->insertCustom( "KADDRESSBOOK", "SMIMEFP", sfp.join( "," ) ); + else + addr->removeCustom( "KADDRESSBOOK", "SMIMEFP" ); +} + +void CryptoWidget::setReadOnly( bool readOnly ) +{ + mReadOnly = readOnly; + for ( uint i = 0 ; i < NumberOfProtocols ; ++i ) + mProtocolCB[ i ]->setEnabled( !readOnly ); + + mSignPref->setEnabled( !readOnly ); + mCryptPref->setEnabled( !readOnly ); + mPgpKey->setEnabled( !readOnly ); + mSmimeCert->setEnabled( !readOnly ); +} + +#include "cryptowidget.moc" |