You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/kaddressbook/editors/cryptowidget.cpp

228 lines
8.1 KiB

/*
This file is part of KAddressBook.
Copyright (c) 2004 Klar<61>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"