/* 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 #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 #include #include #include #include #include #include #include #include #include #include #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( 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( 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( 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( mSignPref->currentItem() ); if ( signPref != Kleo::UnknownSigningPreference ) addr->insertCustom( "KADDRESSBOOK", "CRYPTOSIGNPREF", Kleo::signingPreferenceToString( signPref ) ); else addr->removeCustom( "KADDRESSBOOK", "CRYPTOSIGNPREF" ); Kleo::EncryptionPreference encryptPref = static_cast( 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"