summaryrefslogtreecommitdiffstats
path: root/kmail/identitydialog.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch)
tree67208f7c145782a7e90b123b982ca78d88cc2c87 /kmail/identitydialog.cpp
downloadtdepim-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 'kmail/identitydialog.cpp')
-rw-r--r--kmail/identitydialog.cpp700
1 files changed, 700 insertions, 0 deletions
diff --git a/kmail/identitydialog.cpp b/kmail/identitydialog.cpp
new file mode 100644
index 000000000..1283047e2
--- /dev/null
+++ b/kmail/identitydialog.cpp
@@ -0,0 +1,700 @@
+/* -*- mode: C++; c-file-style: "gnu" -*-
+ identitydialog.cpp
+
+ This file is part of KMail, the KDE mail client.
+ Copyright (c) 2002 Marc Mutz <mutz@kde.org>
+
+ KMail 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.
+
+ KMail 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.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "identitydialog.h"
+
+// other KMail headers:
+#include "signatureconfigurator.h"
+#include "xfaceconfigurator.h"
+#include "folderrequester.h"
+using KMail::FolderRequester;
+#include "kmfoldermgr.h"
+#include "transportmanager.h"
+#include "dictionarycombobox.h"
+#include "kleo_util.h"
+#include "kmmainwidget.h"
+#include "kmfolder.h"
+#include "templatesconfiguration.h"
+#include "templatesconfiguration_kfg.h"
+
+// other kdepim headers:
+// libkdepim
+#include <libkpimidentities/identity.h>
+#include <libkdepim/addresseelineedit.h>
+// libkleopatra:
+#include <ui/keyrequester.h>
+#include <kleo/cryptobackendfactory.h>
+
+#include <libemailfunctions/email.h>
+
+// other KDE headers:
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kconfig.h>
+#include <kfileitem.h>
+#include <kurl.h>
+#include <kdebug.h>
+#include <kpushbutton.h>
+
+// Qt headers:
+#include <qtabwidget.h>
+#include <qlabel.h>
+#include <qwhatsthis.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+
+// other headers:
+#include <gpgmepp/key.h>
+#include <iterator>
+#include <algorithm>
+
+using namespace KPIM;
+
+namespace KMail {
+
+ IdentityDialog::IdentityDialog( QWidget * parent, const char * name )
+ : KDialogBase( Plain, i18n("Edit Identity"), Ok|Cancel|Help, Ok,
+ parent, name )
+ {
+ // tmp. vars:
+ QWidget * tab;
+ QLabel * label;
+ int row;
+ QGridLayout * glay;
+ QString msg;
+
+ //
+ // Tab Widget: General
+ //
+ row = -1;
+ QVBoxLayout * vlay = new QVBoxLayout( plainPage(), 0, spacingHint() );
+ QTabWidget *tabWidget = new QTabWidget( plainPage(), "config-identity-tab" );
+ vlay->addWidget( tabWidget );
+
+ tab = new QWidget( tabWidget );
+ tabWidget->addTab( tab, i18n("&General") );
+ glay = new QGridLayout( tab, 4, 2, marginHint(), spacingHint() );
+ glay->setRowStretch( 3, 1 );
+ glay->setColStretch( 1, 1 );
+
+ // "Name" line edit and label:
+ ++row;
+ mNameEdit = new KLineEdit( tab );
+ glay->addWidget( mNameEdit, row, 1 );
+ label = new QLabel( mNameEdit, i18n("&Your name:"), tab );
+ glay->addWidget( label, row, 0 );
+ msg = i18n("<qt><h3>Your name</h3>"
+ "<p>This field should contain your name as you would like "
+ "it to appear in the email header that is sent out;</p>"
+ "<p>if you leave this blank your real name will not "
+ "appear, only the email address.</p></qt>");
+ QWhatsThis::add( label, msg );
+ QWhatsThis::add( mNameEdit, msg );
+
+ // "Organization" line edit and label:
+ ++row;
+ mOrganizationEdit = new KLineEdit( tab );
+ glay->addWidget( mOrganizationEdit, row, 1 );
+ label = new QLabel( mOrganizationEdit, i18n("Organi&zation:"), tab );
+ glay->addWidget( label, row, 0 );
+ msg = i18n("<qt><h3>Organization</h3>"
+ "<p>This field should have the name of your organization "
+ "if you'd like it to be shown in the email header that "
+ "is sent out.</p>"
+ "<p>It is safe (and normal) to leave this blank.</p></qt>");
+ QWhatsThis::add( label, msg );
+ QWhatsThis::add( mOrganizationEdit, msg );
+
+ // "Email Address" line edit and label:
+ // (row 3: spacer)
+ ++row;
+ mEmailEdit = new KLineEdit( tab );
+ glay->addWidget( mEmailEdit, row, 1 );
+ label = new QLabel( mEmailEdit, i18n("&Email address:"), tab );
+ glay->addWidget( label, row, 0 );
+ msg = i18n("<qt><h3>Email address</h3>"
+ "<p>This field should have your full email address.</p>"
+ "<p>If you leave this blank, or get it wrong, people "
+ "will have trouble replying to you.</p></qt>");
+ QWhatsThis::add( label, msg );
+ QWhatsThis::add( mEmailEdit, msg );
+
+ //
+ // Tab Widget: Cryptography
+ //
+ row = -1;
+ mCryptographyTab = tab = new QWidget( tabWidget );
+ tabWidget->addTab( tab, i18n("Cryptograph&y") );
+ glay = new QGridLayout( tab, 6, 2, marginHint(), spacingHint() );
+ glay->setColStretch( 1, 1 );
+
+ // "OpenPGP Signature Key" requester and label:
+ ++row;
+ mPGPSigningKeyRequester = new Kleo::SigningKeyRequester( false, Kleo::SigningKeyRequester::OpenPGP, tab );
+ mPGPSigningKeyRequester->dialogButton()->setText( i18n("Chang&e...") );
+ mPGPSigningKeyRequester->setDialogCaption( i18n("Your OpenPGP Signature Key") );
+ msg = i18n("Select the OpenPGP key which should be used to "
+ "digitally sign your messages.");
+ mPGPSigningKeyRequester->setDialogMessage( msg );
+
+ msg = i18n("<qt><p>The OpenPGP key you choose here will be used "
+ "to digitally sign messages. You can also use GnuPG keys.</p>"
+ "<p>You can leave this blank, but KMail will not be able "
+ "to digitally sign emails using OpenPGP; "
+ "normal mail functions will not be affected.</p>"
+ "<p>You can find out more about keys at <a>http://www.gnupg.org</a></p></qt>");
+
+ label = new QLabel( mPGPSigningKeyRequester, i18n("OpenPGP signing key:"), tab );
+ QWhatsThis::add( mPGPSigningKeyRequester, msg );
+ QWhatsThis::add( label, msg );
+
+ glay->addWidget( label, row, 0 );
+ glay->addWidget( mPGPSigningKeyRequester, row, 1 );
+
+
+ // "OpenPGP Encryption Key" requester and label:
+ ++row;
+ mPGPEncryptionKeyRequester = new Kleo::EncryptionKeyRequester( false, Kleo::EncryptionKeyRequester::OpenPGP, tab );
+ mPGPEncryptionKeyRequester->dialogButton()->setText( i18n("Chang&e...") );
+ mPGPEncryptionKeyRequester->setDialogCaption( i18n("Your OpenPGP Encryption Key") );
+ msg = i18n("Select the OpenPGP key which should be used when encrypting "
+ "to yourself and for the \"Attach My Public Key\" "
+ "feature in the composer.");
+ mPGPEncryptionKeyRequester->setDialogMessage( msg );
+
+ msg = i18n("<qt><p>The OpenPGP key you choose here will be used "
+ "to encrypt messages to yourself and for the \"Attach My Public Key\" "
+ "feature in the composer. You can also use GnuPG keys.</p>"
+ "<p>You can leave this blank, but KMail will not be able "
+ "to encrypt copies of outgoing messages to you using OpenPGP; "
+ "normal mail functions will not be affected.</p>"
+ "<p>You can find out more about keys at <a>http://www.gnupg.org</a></qt>");
+ label = new QLabel( mPGPEncryptionKeyRequester, i18n("OpenPGP encryption key:"), tab );
+ QWhatsThis::add( mPGPEncryptionKeyRequester, msg );
+ QWhatsThis::add( label, msg );
+
+ glay->addWidget( label, row, 0 );
+ glay->addWidget( mPGPEncryptionKeyRequester, row, 1 );
+
+
+ // "S/MIME Signature Key" requester and label:
+ ++row;
+ mSMIMESigningKeyRequester = new Kleo::SigningKeyRequester( false, Kleo::SigningKeyRequester::SMIME, tab );
+ mSMIMESigningKeyRequester->dialogButton()->setText( i18n("Chang&e...") );
+ mSMIMESigningKeyRequester->setDialogCaption( i18n("Your S/MIME Signature Certificate") );
+ msg = i18n("Select the S/MIME certificate which should be used to "
+ "digitally sign your messages.");
+ mSMIMESigningKeyRequester->setDialogMessage( msg );
+
+ msg = i18n("<qt><p>The S/MIME (X.509) certificate you choose here will be used "
+ "to digitally sign messages.</p>"
+ "<p>You can leave this blank, but KMail will not be able "
+ "to digitally sign emails using S/MIME; "
+ "normal mail functions will not be affected.</p></qt>");
+ label = new QLabel( mSMIMESigningKeyRequester, i18n("S/MIME signing certificate:"), tab );
+ QWhatsThis::add( mSMIMESigningKeyRequester, msg );
+ QWhatsThis::add( label, msg );
+ glay->addWidget( label, row, 0 );
+ glay->addWidget( mSMIMESigningKeyRequester, row, 1 );
+
+ const Kleo::CryptoBackend::Protocol * smimeProtocol
+ = Kleo::CryptoBackendFactory::instance()->smime();
+
+ label->setEnabled( smimeProtocol );
+ mSMIMESigningKeyRequester->setEnabled( smimeProtocol );
+
+ // "S/MIME Encryption Key" requester and label:
+ ++row;
+ mSMIMEEncryptionKeyRequester = new Kleo::EncryptionKeyRequester( false, Kleo::EncryptionKeyRequester::SMIME, tab );
+ mSMIMEEncryptionKeyRequester->dialogButton()->setText( i18n("Chang&e...") );
+ mSMIMEEncryptionKeyRequester->setDialogCaption( i18n("Your S/MIME Encryption Certificate") );
+ msg = i18n("Select the S/MIME certificate which should be used when encrypting "
+ "to yourself and for the \"Attach My Certificate\" "
+ "feature in the composer.");
+ mSMIMEEncryptionKeyRequester->setDialogMessage( msg );
+
+ msg = i18n("<qt><p>The S/MIME certificate you choose here will be used "
+ "to encrypt messages to yourself and for the \"Attach My Certificate\" "
+ "feature in the composer.</p>"
+ "<p>You can leave this blank, but KMail will not be able "
+ "to encrypt copies of outgoing messages to you using S/MIME; "
+ "normal mail functions will not be affected.</p></qt>");
+ label = new QLabel( mSMIMEEncryptionKeyRequester, i18n("S/MIME encryption certificate:"), tab );
+ QWhatsThis::add( mSMIMEEncryptionKeyRequester, msg );
+ QWhatsThis::add( label, msg );
+
+ glay->addWidget( label, row, 0 );
+ glay->addWidget( mSMIMEEncryptionKeyRequester, row, 1 );
+
+ label->setEnabled( smimeProtocol );
+ mSMIMEEncryptionKeyRequester->setEnabled( smimeProtocol );
+
+ // "Preferred Crypto Message Format" combobox and label:
+ ++row;
+ mPreferredCryptoMessageFormat = new QComboBox( false, tab );
+ QStringList l;
+ l << Kleo::cryptoMessageFormatToLabel( Kleo::AutoFormat )
+ << Kleo::cryptoMessageFormatToLabel( Kleo::InlineOpenPGPFormat )
+ << Kleo::cryptoMessageFormatToLabel( Kleo::OpenPGPMIMEFormat )
+ << Kleo::cryptoMessageFormatToLabel( Kleo::SMIMEFormat )
+ << Kleo::cryptoMessageFormatToLabel( Kleo::SMIMEOpaqueFormat );
+ mPreferredCryptoMessageFormat->insertStringList( l );
+ label = new QLabel( mPreferredCryptoMessageFormat,
+ i18n("Preferred crypto message format:"), tab );
+
+ glay->addWidget( label, row, 0 );
+ glay->addWidget( mPreferredCryptoMessageFormat, row, 1 );
+
+ ++row;
+ glay->setRowStretch( row, 1 );
+
+ //
+ // Tab Widget: Advanced
+ //
+ row = -1;
+ tab = new QWidget( tabWidget );
+ tabWidget->addTab( tab, i18n("&Advanced") );
+ glay = new QGridLayout( tab, 8, 2, marginHint(), spacingHint() );
+ // the last (empty) row takes all the remaining space
+ glay->setRowStretch( 8-1, 1 );
+ glay->setColStretch( 1, 1 );
+
+ // "Reply-To Address" line edit and label:
+ ++row;
+ mReplyToEdit = new KPIM::AddresseeLineEdit( tab, true, "mReplyToEdit" );
+ glay->addWidget( mReplyToEdit, row, 1 );
+ label = new QLabel ( mReplyToEdit, i18n("&Reply-To address:"), tab);
+ glay->addWidget( label , row, 0 );
+ msg = i18n("<qt><h3>Reply-To addresses</h3>"
+ "<p>This sets the <tt>Reply-to:</tt> header to contain a "
+ "different email address to the normal <tt>From:</tt> "
+ "address.</p>"
+ "<p>This can be useful when you have a group of people "
+ "working together in similar roles. For example, you "
+ "might want any emails sent to have your email in the "
+ "<tt>From:</tt> field, but any responses to go to "
+ "a group address.</p>"
+ "<p>If in doubt, leave this field blank.</p></qt>");
+ QWhatsThis::add( label, msg );
+ QWhatsThis::add( mReplyToEdit, msg );
+
+ // "BCC addresses" line edit and label:
+ ++row;
+ mBccEdit = new KPIM::AddresseeLineEdit( tab, true, "mBccEdit" );
+ glay->addWidget( mBccEdit, row, 1 );
+ label = new QLabel( mBccEdit, i18n("&BCC addresses:"), tab );
+ glay->addWidget( label, row, 0 );
+ msg = i18n("<qt><h3>BCC (Blind Carbon Copy) addresses</h3>"
+ "<p>The addresses that you enter here will be added to each "
+ "outgoing mail that is sent with this identity. They will not "
+ "be visible to other recipients.</p>"
+ "<p>This is commonly used to send a copy of each sent message to "
+ "another account of yours.</p>"
+ "<p>To specify more than one address, use commas to separate "
+ "the list of BCC recipients.</p>"
+ "<p>If in doubt, leave this field blank.</p></qt>");
+ QWhatsThis::add( label, msg );
+ QWhatsThis::add( mBccEdit, msg );
+
+ // "Dictionary" combo box and label:
+ ++row;
+ mDictionaryCombo = new DictionaryComboBox( tab );
+ glay->addWidget( mDictionaryCombo, row, 1 );
+ glay->addWidget( new QLabel( mDictionaryCombo, i18n("D&ictionary:"), tab ),
+ row, 0 );
+
+ // "Sent-mail Folder" combo box and label:
+ ++row;
+ mFccCombo = new FolderRequester( tab,
+ kmkernel->getKMMainWidget()->folderTree() );
+ mFccCombo->setShowOutbox( false );
+ glay->addWidget( mFccCombo, row, 1 );
+ glay->addWidget( new QLabel( mFccCombo, i18n("Sent-mail &folder:"), tab ),
+ row, 0 );
+
+ // "Drafts Folder" combo box and label:
+ ++row;
+ mDraftsCombo = new FolderRequester( tab,
+ kmkernel->getKMMainWidget()->folderTree() );
+ mDraftsCombo->setShowOutbox( false );
+ glay->addWidget( mDraftsCombo, row, 1 );
+ glay->addWidget( new QLabel( mDraftsCombo, i18n("&Drafts folder:"), tab ),
+ row, 0 );
+
+ // "Templates Folder" combo box and label:
+ ++row;
+ mTemplatesCombo = new FolderRequester( tab,
+ kmkernel->getKMMainWidget()->folderTree() );
+ mTemplatesCombo->setShowOutbox( false );
+ glay->addWidget( mTemplatesCombo, row, 1 );
+ glay->addWidget( new QLabel( mTemplatesCombo, i18n("&Templates folder:"), tab ),
+ row, 0 );
+
+ // "Special transport" combobox and label:
+ ++row;
+ mTransportCheck = new QCheckBox( i18n("Special &transport:"), tab );
+ glay->addWidget( mTransportCheck, row, 0 );
+ mTransportCombo = new QComboBox( true, tab );
+ mTransportCombo->setEnabled( false ); // since !mTransportCheck->isChecked()
+ mTransportCombo->insertStringList( KMail::TransportManager::transportNames() );
+ glay->addWidget( mTransportCombo, row, 1 );
+ connect( mTransportCheck, SIGNAL(toggled(bool)),
+ mTransportCombo, SLOT(setEnabled(bool)) );
+
+ // the last row is a spacer
+
+ //
+ // Tab Widget: Templates
+ //
+ tab = new QWidget( tabWidget );
+ tabWidget->addTab( tab, i18n("&Templates") );
+ vlay = new QVBoxLayout( tab, marginHint(), spacingHint() );
+ mCustom = new QCheckBox( i18n("&Use custom message templates"), tab );
+ vlay->addWidget( mCustom );
+ mWidget = new TemplatesConfiguration( tab , "identity-templates" );
+ mWidget->setEnabled( false );
+ vlay->addWidget( mWidget );
+ QHBoxLayout *btns = new QHBoxLayout( vlay, spacingHint() );
+ mCopyGlobal = new KPushButton( i18n("&Copy global templates"), tab );
+ mCopyGlobal->setEnabled( false );
+ btns->addWidget( mCopyGlobal );
+ connect( mCustom, SIGNAL( toggled( bool ) ),
+ mWidget, SLOT( setEnabled( bool ) ) );
+ connect( mCustom, SIGNAL( toggled( bool ) ),
+ mCopyGlobal, SLOT( setEnabled( bool ) ) );
+ connect( mCopyGlobal, SIGNAL(clicked()),
+ this, SLOT(slotCopyGlobal()) );
+
+ //
+ // Tab Widget: Signature
+ //
+ mSignatureConfigurator = new SignatureConfigurator( tabWidget );
+ mSignatureConfigurator->layout()->setMargin( KDialog::marginHint() );
+ tabWidget->addTab( mSignatureConfigurator, i18n("&Signature") );
+
+ mXFaceConfigurator = new XFaceConfigurator( tabWidget );
+ mXFaceConfigurator->layout()->setMargin( KDialog::marginHint() );
+ tabWidget->addTab( mXFaceConfigurator, i18n("&Picture") );
+
+ KConfigGroup geometry( KMKernel::config(), "Geometry" );
+ if ( geometry.hasKey( "Identity Dialog size" ) )
+ resize( geometry.readSizeEntry( "Identity Dialog size" ) );
+ mNameEdit->setFocus();
+
+ connect( tabWidget, SIGNAL(currentChanged(QWidget*)),
+ SLOT(slotAboutToShow(QWidget*)) );
+ }
+
+ IdentityDialog::~IdentityDialog() {
+ KConfigGroup geometry( KMKernel::config(), "Geometry" );
+ geometry.writeEntry( "Identity Dialog size", size() );
+ }
+
+ void IdentityDialog::slotAboutToShow( QWidget * w ) {
+ if ( w == mCryptographyTab ) {
+ // set the configured email address as inital query of the key
+ // requesters:
+ const QString email = mEmailEdit->text().stripWhiteSpace();
+ mPGPEncryptionKeyRequester->setInitialQuery( email );
+ mPGPSigningKeyRequester->setInitialQuery( email );
+ mSMIMEEncryptionKeyRequester->setInitialQuery( email );
+ mSMIMESigningKeyRequester->setInitialQuery( email );
+ }
+ }
+
+ void IdentityDialog::slotCopyGlobal() {
+ mWidget->loadFromGlobal();
+ }
+
+ namespace {
+ struct DoesntMatchEMailAddress {
+ explicit DoesntMatchEMailAddress( const QString & s )
+ : email( s.stripWhiteSpace().lower() ) {}
+ bool operator()( const GpgME::Key & key ) const;
+ private:
+ bool checkForEmail( const char * email ) const;
+ static QString extractEmail( const char * email );
+ const QString email;
+ };
+
+ bool DoesntMatchEMailAddress::operator()( const GpgME::Key & key ) const {
+ const std::vector<GpgME::UserID> uids = key.userIDs();
+ for ( std::vector<GpgME::UserID>::const_iterator it = uids.begin() ; it != uids.end() ; ++it )
+ if ( checkForEmail( it->email() ? it->email() : it->id() ) )
+ return false;
+ return true; // note the negation!
+ }
+
+ bool DoesntMatchEMailAddress::checkForEmail( const char * e ) const {
+ const QString em = extractEmail( e );
+ return !em.isEmpty() && email == em;
+ }
+
+ QString DoesntMatchEMailAddress::extractEmail( const char * e ) {
+ if ( !e || !*e )
+ return QString::null;
+ const QString em = QString::fromUtf8( e );
+ if ( e[0] == '<' )
+ return em.mid( 1, em.length() - 2 );
+ else
+ return em;
+ }
+ }
+
+bool IdentityDialog::validateAddresses( const QString & addresses )
+{
+ QString brokenAddress;
+ KPIM::EmailParseResult errorCode = KMMessage::isValidEmailAddressList( KMMessage::expandAliases( addresses ), brokenAddress );
+ if ( !( errorCode == KPIM::AddressOk || errorCode == KPIM::AddressEmpty ) ) {
+ QString errorMsg( "<qt><p><b>" + brokenAddress +
+ "</b></p><p>" + KPIM::emailParseResultToString( errorCode ) +
+ "</p></qt>" );
+ KMessageBox::sorry( this, errorMsg, i18n("Invalid Email Address") );
+ return false;
+ }
+ return true;
+}
+
+void IdentityDialog::slotOk() {
+ const QString email = mEmailEdit->text().stripWhiteSpace();
+
+ // Validate email addresses
+ if ( !isValidSimpleEmailAddress( email )) {
+ QString errorMsg( simpleEmailAddressErrorMsg());
+ KMessageBox::sorry( this, errorMsg, i18n("Invalid Email Address") );
+ return;
+ }
+
+ if ( !validateAddresses( mReplyToEdit->text().stripWhiteSpace() ) ) {
+ return;
+ }
+
+ if ( !validateAddresses( mBccEdit->text().stripWhiteSpace() ) ) {
+ return;
+ }
+
+ const std::vector<GpgME::Key> & pgpSigningKeys = mPGPSigningKeyRequester->keys();
+ const std::vector<GpgME::Key> & pgpEncryptionKeys = mPGPEncryptionKeyRequester->keys();
+ const std::vector<GpgME::Key> & smimeSigningKeys = mSMIMESigningKeyRequester->keys();
+ const std::vector<GpgME::Key> & smimeEncryptionKeys = mSMIMEEncryptionKeyRequester->keys();
+ QString msg;
+ bool err = false;
+ if ( std::find_if( pgpSigningKeys.begin(), pgpSigningKeys.end(),
+ DoesntMatchEMailAddress( email ) ) != pgpSigningKeys.end() ) {
+ msg = i18n("One of the configured OpenPGP signing keys does not contain "
+ "any user ID with the configured email address for this "
+ "identity (%1).\n"
+ "This might result in warning messages on the receiving side "
+ "when trying to verify signatures made with this configuration.");
+ err = true;
+ }
+ else if ( std::find_if( pgpEncryptionKeys.begin(), pgpEncryptionKeys.end(),
+ DoesntMatchEMailAddress( email ) ) != pgpEncryptionKeys.end() ) {
+ msg = i18n("One of the configured OpenPGP encryption keys does not contain "
+ "any user ID with the configured email address for this "
+ "identity (%1).");
+ err = true;
+ }
+ else if ( std::find_if( smimeSigningKeys.begin(), smimeSigningKeys.end(),
+ DoesntMatchEMailAddress( email ) ) != smimeSigningKeys.end() ) {
+ msg = i18n("One of the configured S/MIME signing certificates does not contain "
+ "the configured email address for this "
+ "identity (%1).\n"
+ "This might result in warning messages on the receiving side "
+ "when trying to verify signatures made with this configuration.");
+ err = true;
+ }
+ else if ( std::find_if( smimeEncryptionKeys.begin(), smimeEncryptionKeys.end(),
+ DoesntMatchEMailAddress( email ) ) != smimeEncryptionKeys.end() ) {
+ msg = i18n("One of the configured S/MIME encryption certificates does not contain "
+ "the configured email address for this "
+ "identity (%1).");
+ err = true;
+ }
+
+ if ( err )
+ if ( KMessageBox::warningContinueCancel( this, msg.arg( email ),
+ i18n("Email Address Not Found in Key/Certificates"),
+ KStdGuiItem::cont(), "warn_email_not_in_certificate" )
+ != KMessageBox::Continue)
+ return;
+
+
+ if ( mSignatureConfigurator->isSignatureEnabled() &&
+ mSignatureConfigurator->signatureType()==Signature::FromFile ) {
+ KURL url( mSignatureConfigurator->fileURL() );
+ KFileItem signatureFile( KFileItem::Unknown, KFileItem::Unknown, url );
+ if ( !signatureFile.isFile() || !signatureFile.isReadable() || !signatureFile.isLocalFile() ) {
+ KMessageBox::error( this, i18n( "The signature file is not valid" ) );
+ return;
+ }
+ }
+
+ return KDialogBase::slotOk();
+ }
+
+ bool IdentityDialog::checkFolderExists( const QString & folderID,
+ const QString & msg ) {
+ KMFolder * folder = kmkernel->findFolderById( folderID );
+ if ( !folder ) {
+ KMessageBox::sorry( this, msg );
+ return false;
+ }
+ return true;
+ }
+
+ void IdentityDialog::setIdentity( KPIM::Identity & ident ) {
+
+ setCaption( i18n("Edit Identity \"%1\"").arg( ident.identityName() ) );
+
+ // "General" tab:
+ mNameEdit->setText( ident.fullName() );
+ mOrganizationEdit->setText( ident.organization() );
+ mEmailEdit->setText( ident.emailAddr() );
+
+ // "Cryptography" tab:
+ mPGPSigningKeyRequester->setFingerprint( ident.pgpSigningKey() );
+ mPGPEncryptionKeyRequester->setFingerprint( ident.pgpEncryptionKey() );
+ mSMIMESigningKeyRequester->setFingerprint( ident.smimeSigningKey() );
+ mSMIMEEncryptionKeyRequester->setFingerprint( ident.smimeEncryptionKey() );
+ mPreferredCryptoMessageFormat->setCurrentItem( format2cb( ident.preferredCryptoMessageFormat() ) );
+
+ // "Advanced" tab:
+ mReplyToEdit->setText( ident.replyToAddr() );
+ mBccEdit->setText( ident.bcc() );
+ mTransportCheck->setChecked( !ident.transport().isEmpty() );
+ mTransportCombo->setEditText( ident.transport() );
+ mTransportCombo->setEnabled( !ident.transport().isEmpty() );
+ mDictionaryCombo->setCurrentByDictionary( ident.dictionary() );
+
+ if ( ident.fcc().isEmpty() ||
+ !checkFolderExists( ident.fcc(),
+ i18n("The custom sent-mail folder for identity "
+ "\"%1\" does not exist (anymore); "
+ "therefore, the default sent-mail folder "
+ "will be used.")
+ .arg( ident.identityName() ) ) )
+ mFccCombo->setFolder( kmkernel->sentFolder() );
+ else
+ mFccCombo->setFolder( ident.fcc() );
+
+ if ( ident.drafts().isEmpty() ||
+ !checkFolderExists( ident.drafts(),
+ i18n("The custom drafts folder for identity "
+ "\"%1\" does not exist (anymore); "
+ "therefore, the default drafts folder "
+ "will be used.")
+ .arg( ident.identityName() ) ) )
+ mDraftsCombo->setFolder( kmkernel->draftsFolder() );
+ else
+ mDraftsCombo->setFolder( ident.drafts() );
+
+ if ( ident.templates().isEmpty() ||
+ !checkFolderExists( ident.templates(),
+ i18n("The custom templates folder for identity "
+ "\"%1\" does not exist (anymore); "
+ "therefore, the default templates folder "
+ "will be used.")
+ .arg( ident.identityName() ) ) )
+ mTemplatesCombo->setFolder( kmkernel->templatesFolder() );
+ else
+ mTemplatesCombo->setFolder( ident.templates() );
+
+ // "Templates" tab:
+ uint identity = ident.uoid();
+ QString iid = QString("IDENTITY_%1").arg( identity );
+ Templates t( iid );
+ mCustom->setChecked(t.useCustomTemplates());
+ mWidget->loadFromIdentity( identity );
+
+ // "Signature" tab:
+ mSignatureConfigurator->setSignature( ident.signature() );
+ mXFaceConfigurator->setXFace( ident.xface() );
+ mXFaceConfigurator->setXFaceEnabled( ident.isXFaceEnabled() );
+ }
+
+ void IdentityDialog::updateIdentity( KPIM::Identity & ident ) {
+ // "General" tab:
+ ident.setFullName( mNameEdit->text() );
+ ident.setOrganization( mOrganizationEdit->text() );
+ QString email = mEmailEdit->text();
+ ident.setEmailAddr( email );
+ // "Cryptography" tab:
+ ident.setPGPSigningKey( mPGPSigningKeyRequester->fingerprint().latin1() );
+ ident.setPGPEncryptionKey( mPGPEncryptionKeyRequester->fingerprint().latin1() );
+ ident.setSMIMESigningKey( mSMIMESigningKeyRequester->fingerprint().latin1() );
+ ident.setSMIMEEncryptionKey( mSMIMEEncryptionKeyRequester->fingerprint().latin1() );
+ ident.setPreferredCryptoMessageFormat( cb2format( mPreferredCryptoMessageFormat->currentItem() ) );
+ // "Advanced" tab:
+ ident.setReplyToAddr( mReplyToEdit->text() );
+ ident.setBcc( mBccEdit->text() );
+ ident.setTransport( ( mTransportCheck->isChecked() ) ?
+ mTransportCombo->currentText() : QString::null );
+ ident.setDictionary( mDictionaryCombo->currentDictionary() );
+ ident.setFcc( mFccCombo->folder() ?
+ mFccCombo->folder()->idString() : QString::null );
+ ident.setDrafts( mDraftsCombo->folder() ?
+ mDraftsCombo->folder()->idString() : QString::null );
+ ident.setTemplates( mTemplatesCombo->folder() ?
+ mTemplatesCombo->folder()->idString() : QString::null );
+ // "Templates" tab:
+ uint identity = ident.uoid();
+ QString iid = QString("IDENTITY_%1").arg( identity );
+ Templates t( iid );
+ kdDebug() << "use custom templates for identity " << identity << ": " << mCustom->isChecked() << endl;
+ t.setUseCustomTemplates(mCustom->isChecked());
+ t.writeConfig();
+ mWidget->saveToIdentity( identity );
+ // "Signature" tab:
+ ident.setSignature( mSignatureConfigurator->signature() );
+ ident.setXFace( mXFaceConfigurator->xface() );
+ ident.setXFaceEnabled( mXFaceConfigurator->isXFaceEnabled() );
+ }
+
+ void IdentityDialog::slotUpdateTransportCombo( const QStringList & sl ) {
+ // save old setting:
+ QString content = mTransportCombo->currentText();
+ // update combo box:
+ mTransportCombo->clear();
+ mTransportCombo->insertStringList( sl );
+ // restore saved setting:
+ mTransportCombo->setEditText( content );
+ }
+
+}
+
+#include "identitydialog.moc"