[prev in list] [next in list] [prev in thread] [next in thread]
List: kmail-devel
Subject: Re: [PATCH v2] Use the Kpgp key handling also with the OpenPGP plugin
From: Ingo =?iso-8859-1?q?Kl=F6cker?= <kloecker () kde ! org>
Date: 2002-09-30 21:13:13
[Download RAW message or body]
[Attachment #2 (multipart/mixed)]
Hi!
Attached is an updated version of my patch which respects the new=20
alwaysEncryptToSelf option in the plugins.
Regards,
Ingo
["use-kpgp-key-selection-code-also-with-openpgp-plugin-2.diff" (text/x-diff)]
Index: kmcomposewin.cpp
===================================================================
RCS file: /home/kde/kdenetwork/kmail/kmcomposewin.cpp,v
retrieving revision 1.600
diff -u -3 -p -r1.600 kmcomposewin.cpp
--- kmcomposewin.cpp 2002/09/29 13:15:54 1.600
+++ kmcomposewin.cpp 2002/09/30 20:00:56
@@ -1399,19 +1399,22 @@ bool KMComposeWin::applyChanges(void)
kernel->identityManager()->identityForUoidOrDefault( \
mIdentity->currentIdentity() ); QCString pgpUserId = ident.pgpIdentity();
- Kpgp::Module *pgp = Kpgp::Module::getKpgp();
-
// check settings of composer buttons *and* attachment check boxes
bool doSignCompletely = doSign;
bool doEncryptCompletely = doEncrypt;
+ bool doEncryptPartially = doEncrypt;
if( mSelectedCryptPlug && (0 < mAtmList.count() ) ) {
int idx=0;
KMMessagePart *attachPart;
for( attachPart = mAtmList.first();
attachPart;
attachPart=mAtmList.next(), ++idx ) {
- if( !encryptFlagOfAttachment( idx ) )
+ if( encryptFlagOfAttachment( idx ) ) {
+ doEncryptPartially = true;
+ }
+ else {
doEncryptCompletely = false;
+ }
if( !signFlagOfAttachment( idx ) )
doSignCompletely = false;
}
@@ -1452,45 +1455,25 @@ bool KMComposeWin::applyChanges(void)
}
}
- if( bOk && !doEncryptCompletely ) {
- if( mSelectedCryptPlug ) {
- // note: only ask for encrypting if "Warn me" flag is set! (khz)
- if( mSelectedCryptPlug->warnSendUnencrypted() ) {
- int ret =
- KMessageBox::warningYesNoCancel( this,
- QString( "<qt><b>"
- + i18n("Warning:")
- + "</b><br>"
- + ((doEncrypt && !doEncryptCompletely)
- ? i18n("You specified not to encrypt some parts of this message, but"
- " you wanted to be warned not to send unencrypted messages!")
- : i18n("You specified not to encrypt this message, but"
- " you wanted to be warned not to send unencrypted messages!") )
- + "<br> <br><b>"
- + i18n("Encrypt all parts of this message?")
- + "</b></qt>" ),
- i18n("Encryption Warning"),
- KGuiItem( i18n("&Encrypt All Parts") ),
- KGuiItem( i18n("Send &as is") ) );
- if( ret == KMessageBox::Cancel )
- bOk = false;
- else if( ret == KMessageBox::Yes ) {
- doEncrypt = true;
- doEncryptCompletely = true;
- }
- }
-
- /*
- note: Processing the mSelectedCryptPlug->encryptEmail() flag here would
- be absolutely wrong: this is used for specifying
- if messages should be encrypted 'in general'.
- --> This sets the initial state of a freshly started Composer.
- --> This does *not* mean overriding user setting made while
- editing in that composer window! (khz, 2002/06/26)
- */
-
- } else if( mAutoPgpEncrypt && !pgpUserId.isEmpty() ) {
- // determine the complete list of recipients
+ if( bOk ) {
+ // check whether all encrypted message should be encrypted to self
+ bool bEncryptToSelf = mSelectedCryptPlug
+ ? mSelectedCryptPlug->alwaysEncryptToSelf()
+ : Kpgp::Module::getKpgp()->encryptToSelf();
+ // check whether we have the user's key if necessary
+ bool bEncryptionPossible = !bEncryptToSelf || !pgpUserId.isEmpty();
+ // check whether we are using OpenPGP (built-in or plug-in)
+ bool bUsingOpenPgp = !mSelectedCryptPlug || ( mSelectedCryptPlug &&
+ ( -1 != mSelectedCryptPlug->libName().find( "openpgp" ) ) );
+ // only try automatic encryption if all of the following conditions hold
+ // a) the user enabled automatic encryption
+ // b) we have the user's key if he wants to encrypt to himself
+ // c) we are using OpenPGP
+ // d) no message part is marked for encryption
+ if( mAutoPgpEncrypt && bEncryptionPossible && bUsingOpenPgp &&
+ !doEncryptPartially ) {
+ // check if encryption is possible and if yes suggest encryption
+ // first determine the complete list of recipients
QString _to = to().simplifyWhiteSpace();
if( !cc().isEmpty() ) {
if( !_to.endsWith(",") )
@@ -1502,12 +1485,13 @@ bool KMComposeWin::applyChanges(void)
_to += ",";
_to += mMsg->bcc().simplifyWhiteSpace();
}
- // check if the message should be encrypted via old build-in pgp code
QStringList allRecipients = KMMessage::splitEmailAddrList(_to);
+ // now check if encrypting to these recipients is possible and desired
+ Kpgp::Module *pgp = Kpgp::Module::getKpgp();
int status = pgp->encryptionPossible( allRecipients );
- if( status == 1 )
+ if( 1 == status )
doEncrypt = true;
- else if( status == 2 )
+ else if( 2 == status )
{ // the user wants to be asked or has to be asked
kernel->kbp()->idle();
int ret;
@@ -1532,7 +1516,10 @@ bool KMComposeWin::applyChanges(void)
kernel->kbp()->busy();
if( KMessageBox::Cancel == ret )
return false;
- doEncrypt = ( KMessageBox::Yes == ret );
+ else if( ret == KMessageBox::Yes ) {
+ doEncrypt = true;
+ doEncryptCompletely = true;
+ }
}
else if( status == -1 )
{ // warn the user that there are conflicting encryption preferences
@@ -1549,8 +1536,60 @@ bool KMComposeWin::applyChanges(void)
doEncrypt = ( ret == KMessageBox::Yes );
}
}
+ else if( !doEncryptCompletely && mSelectedCryptPlug ) {
+ // note: only ask for encrypting if "Warn me" flag is set! (khz)
+ if( mSelectedCryptPlug->warnSendUnencrypted() ) {
+ int ret =
+ KMessageBox::warningYesNoCancel( this,
+ QString( "<qt><b>"
+ + i18n("Warning:")
+ + "</b><br>"
+ + ((doEncrypt && !doEncryptCompletely)
+ ? i18n("You specified not to encrypt some parts of this message, but"
+ " you wanted to be warned not to send unencrypted messages!")
+ : i18n("You specified not to encrypt this message, but"
+ " you wanted to be warned not to send unencrypted messages!") )
+ + "<br> <br><b>"
+ + i18n("Encrypt all parts of this message?")
+ + "</b></qt>" ),
+ i18n("Encryption Warning"),
+ KGuiItem( i18n("&Encrypt All Parts") ),
+ KGuiItem( i18n("Send &as is") ) );
+ if( ret == KMessageBox::Cancel )
+ bOk = false;
+ else if( ret == KMessageBox::Yes ) {
+ doEncrypt = true;
+ doEncryptCompletely = true;
+ }
+ }
+
+ /*
+ note: Processing the mSelectedCryptPlug->encryptEmail() flag here would
+ be absolutely wrong: this is used for specifying
+ if messages should be encrypted 'in general'.
+ --> This sets the initial state of a freshly started Composer.
+ --> This does *not* mean overriding user setting made while
+ editing in that composer window! (khz, 2002/06/26)
+ */
+
+ }
}
+ if( bOk ) {
+ // if necessary mark all attachments for signing/encryption
+ if( mSelectedCryptPlug && ( 0 < mAtmList.count() ) &&
+ ( doSignCompletely || doEncryptCompletely ) ) {
+ for( KMAtmListViewItem* lvi = (KMAtmListViewItem*)mAtmItemList.first();
+ lvi;
+ lvi = (KMAtmListViewItem*)mAtmItemList.next() ) {
+ if( doSignCompletely )
+ lvi->setSign( true );
+ if( doEncryptCompletely )
+ lvi->setEncrypt( true );
+ }
+ }
+ }
+
// This c-string (init empty here) is set by *first* testing of expiring
// signature certificate and stops us from repeatedly asking same questions.
QCString signCertFingerprint;
@@ -2623,7 +2662,52 @@ QByteArray KMComposeWin::pgpSignedMsg( Q
bool bSign = true;
- if( signCertFingerprint.isEmpty() ){
+ if( signCertFingerprint.isEmpty() ) {
+ // find out whether we are dealing with the OpenPGP or the S/MIME plugin
+ if( -1 != mSelectedCryptPlug->libName().find( "openpgp" ) ) {
+ // We are dealing with the OpenPGP plugin. Use Kpgp to determine
+ // the signing key.
+ // get the OpenPGP key ID for the chosen identity
+ const KMIdentity & ident =
+ kernel->identityManager()->identityForUoidOrDefault( \
mIdentity->currentIdentity() ); + QCString userKeyId = ident.pgpIdentity();
+ if( !userKeyId.isEmpty() ) {
+ Kpgp::Module *pgp = Kpgp::Module::getKpgp();
+ Kpgp::Key* key = pgp->publicKey( userKeyId );
+ if( key ) {
+ signCertFingerprint = key->primaryFingerprint();
+ kdDebug(5006) << " Signer: " << from()
+ << "\nFingerprint of signature key: "
+ << QString( signCertFingerprint ) << endl;
+ }
+ else {
+ KMessageBox::sorry( this,
+ i18n("<qt>This message could not be signed "
+ "because the OpenPGP which should be "
+ "used for signing messages with this "
+ "identity couldn't be found in your "
+ "keyring.<br><br>"
+ "You can change the OpenPGP key "
+ "which should be used with the current "
+ "identity in the identity \
configuration.</qt>"), + i18n("Missing Signing Key") \
); + bSign = false;
+ }
+ }
+ else {
+ KMessageBox::sorry( this,
+ i18n("<qt>This message could not be signed "
+ "because you didn't define the OpenPGP "
+ "key which should be used for signing "
+ "messages with this identity.<br><br>"
+ "You can define the OpenPGP key "
+ "which should be used with the current "
+ "identity in the identity configuration.</qt>"),
+ i18n("Undefined Signing Key") );
+ bSign = false;
+ }
+ }
+ else { // S/MIME
int certSize = 0;
QByteArray certificate;
QString selectedCert;
@@ -2692,7 +2776,7 @@ QByteArray KMComposeWin::pgpSignedMsg( Q
bSign = false;
}
}
-
+ }
/* ----------------------------- */
#ifdef DEBUG
@@ -2968,220 +3052,73 @@ QByteArray KMComposeWin::pgpEncryptedMsg
if( encryptCertFingerprints.isEmpty() ){
-
- QString selectedCert;
- KListBoxDialog dialog( selectedCert, "", i18n( "&Select certificate:" ) );
- dialog.resize( 700, 200 );
- bool useDialog;
- int certSize = 0;
- QByteArray certificateList;
-
- for( QStringList::ConstIterator it = recipients.begin(); it != \
recipients.end(); ++it ) {
- QCString addressee = (*it).utf8();
- addressee.replace(QRegExp("\\x0001"), " ");
- kdDebug(5006) << "\n\n1st try: Retrieving keys for: " << *it << endl;
-
-
- bool askForDifferentSearchString = false;
- do {
-
- certSize = 0;
- char* certificatePtr = 0;
- bool findCertsOk;
- if( askForDifferentSearchString )
- findCertsOk = false;
- else {
- findCertsOk = mSelectedCryptPlug->findCertificates( &(*addressee),
- &certificatePtr,
- &certSize,
- false )
- && (0 < certSize);
- kdDebug(5006) << " keys retrieved successfully: " << findCertsOk \
<< "\n" << endl;
- kdDebug() << "findCertificates() 1st try returned " << certificatePtr << \
endl;
- if( findCertsOk )
- certificateList.assign( certificatePtr, certSize );
- }
- while( !findCertsOk ) {
- bool bOk = false;
- addressee = KLineEditDlg::getText(
- askForDifferentSearchString
- ? i18n("Look for other certificates")
- : i18n("No certificate found"),
- i18n("Enter different address for recipient %1 "
- "or enter \" * \" to see all certificates:").arg(*it),
- addressee, &bOk, this ).stripWhiteSpace().utf8();
- askForDifferentSearchString = false;
- if( bOk ) {
- addressee = addressee.simplifyWhiteSpace();
- if( ("\"*\"" == addressee) ||
- ("\" *\"" == addressee) ||
- ("\"* \"" == addressee) ||
- ("\" * \"" == addressee)) // You never know what users type. :-)
- addressee = "*";
- kdDebug(5006) << "\n\nnext try: Retrieving keys for: " << addressee << \
endl;
- certSize = 0;
- char* certificatePtr = 0;
- findCertsOk = mSelectedCryptPlug->findCertificates(
- &(*addressee),
- &certificatePtr,
- &certSize,
- false )
- && (0 < certSize);
- kdDebug(5006) << " keys retrieved successfully: " << \
findCertsOk << "\n" << endl;
- kdDebug() << "findCertificates() 2nd try returned " << certificatePtr \
<< endl;
- if( findCertsOk )
- certificateList.assign( certificatePtr, certSize );
- } else {
- bEncrypt = false;
- break;
- }
- }
- if( bEncrypt && findCertsOk ) {
-
- // fill selection dialog listbox
- dialog.entriesLB->clear();
- // show dialog even if only one entry to allow specifying of
- // another search string _instead_of_ the recipients address
- bool bAllwaysShowDialog = true;
+ // find out whether we are dealing with the OpenPGP or the S/MIME plugin
+ if( -1 != mSelectedCryptPlug->libName().find( "openpgp" ) ) {
+ // We are dealing with the OpenPGP plugin. Use Kpgp to determine
+ // the encryption keys.
+ // get the OpenPGP key ID for the chosen identity
+ const KMIdentity & ident =
+ kernel->identityManager()->identityForUoidOrDefault( \
mIdentity->currentIdentity() ); + QCString userKeyId = ident.pgpIdentity();
+ Kpgp::Module *pgp = Kpgp::Module::getKpgp();
+ Kpgp::KeyIDList encryptionKeyIds;
+
+ // temporarily set encrypt_to_self to the value specified in the
+ // plugin configuration. this value is used implicitely by the
+ // function which determines the encryption keys.
+ bool bEncryptToSelf_Old = pgp->encryptToSelf();
+ pgp->setEncryptToSelf( mSelectedCryptPlug->alwaysEncryptToSelf() );
+ Kpgp::Result result =
+ pgp->getEncryptionKeys( encryptionKeyIds, recipients, userKeyId );
+ // reset encrypt_to_self to the old value
+ pgp->setEncryptToSelf( bEncryptToSelf_Old );
- useDialog = false;
- int iA = 0;
- int iZ = 0;
- while( iZ < certSize ) {
- if( (certificateList.at(iZ) == '\1') || (certificateList.at(iZ) == \
'\0') ) {
- kdDebug(5006) << "iA=" << iA << " iZ=" << iZ << endl;
- char c = certificateList.at(iZ);
- if( (bAllwaysShowDialog || (c == '\1')) && !useDialog ) {
- // set up selection dialog
- useDialog = true;
- dialog.setCaption( i18n( "Select certificate for encryption "
- "[%1]" )
- .arg(*it) );
- dialog.setLabelAbove(
- i18n( "&Select certificate for recipient %1:" )
- .arg( *it ) );
- }
- certificateList.at(iZ) = '\0';
- QString s = QString::fromUtf8( &certificateList.at(iA) );
- certificateList.at(iZ) = c;
- if( useDialog )
- dialog.entriesLB->insertItem( s );
- else
- selectedCert = s;
- ++iZ;
- iA = iZ;
- }
- ++iZ;
- }
- // run selection dialog and retrieve user choice
- // OR take the single entry (if only one was found)
- if( useDialog ) {
- dialog.setCommentBelow(
- i18n("(Certificates matching address \"%1\", press "
- "[Cancel] to use different address for recipient %2.)")
- .arg(addressee)
- .arg(*it) );
- dialog.entriesLB->setFocus();
- dialog.entriesLB->setSelected( 0, true );
- askForDifferentSearchString = (dialog.exec() != QDialog::Accepted);
+ if( Kpgp::Ok == result ) {
+ // loop over all key IDs
+ for( Kpgp::KeyIDList::ConstIterator it = encryptionKeyIds.begin();
+ it != encryptionKeyIds.end(); ++it ) {
+ Kpgp::Key* key = pgp->publicKey( *it );
+ if( key ) {
+ QCString certFingerprint = key->primaryFingerprint();
+ kdDebug(5006) << "Fingerprint of encryption key: "
+ << QString( certFingerprint ) << endl;
+ // add this key to the list of encryption keys
+ if( !encryptCertFingerprints.isEmpty() )
+ encryptCertFingerprints += '\1';
+ encryptCertFingerprints += certFingerprint;
}
}
- } while ( askForDifferentSearchString );
-
-
- if( bEncrypt ) {
- QCString certFingerprint = selectedCert.utf8();
- certFingerprint.remove( 0, certFingerprint.findRev( '(' )+1 );
- certFingerprint.truncate( certFingerprint.length()-1 );
- kdDebug(5006) << "\n\n Recipient: " << *it
- << "\nFingerprint of encryption key: " << QString( \
certFingerprint ) << "\n\n" << endl;
-
- // Check for expiry of various certificates, but only if the
- // plugin supports this.
- if( mSelectedCryptPlug->hasFeature( Feature_WarnEncryptCertificateExpiry ) \
) {
- QString captionWarn = i18n( "Certificate Warning [%1]" )
- .arg( *it );
- if( bEncrypt ) {
- int encRecvDaysLeft = \
mSelectedCryptPlug->receiverCertificateDaysLeftToExpiry( \
certFingerprint );
- if( mSelectedCryptPlug->receiverCertificateExpiryNearWarning() &&
- encRecvDaysLeft <
- \
mSelectedCryptPlug->receiverCertificateExpiryNearWarningInterval() ) \
{
- QString txt1;
- if( 0 < encRecvDaysLeft )
- txt1 = i18n( "The certificate of the recipient you want to \
send this message to expires in %1 days.<br>This means that after this period, the \
recipient will not be able to read your message any longer." ).arg( encRecvDaysLeft \
);
- else if( 0 > encRecvDaysLeft )
- txt1 = i18n( "The certificate of the recipient you want to \
send this message to expired %1 days ago.<br>This means that the recipient will not \
be able to read your message." ).arg( -encRecvDaysLeft );
- else
- txt1 = i18n( "The certificate of the recipient you want to \
send this message to expires today.<br>This means that beginning from tomorrow, the \
recipient will not be able to read your message any longer." );
- int ret = KMessageBox::warningYesNo( this,
- i18n( "<qt><p>%1</p>"
- "<p>Do you still want to use this "
- "certificate?</p></qt>" )
- .arg( txt1 ),
- captionWarn,
- KGuiItem( i18n("&Use Certificate") ),
- KGuiItem( i18n("&Don't Use Certificate") ) );
- if( ret == KMessageBox::No )
- bEncrypt = false;
- }
- }
-
- if( bEncrypt ) {
- int certInChainDaysLeft = \
mSelectedCryptPlug->certificateInChainDaysLeftToExpiry( \
certFingerprint );
- if( mSelectedCryptPlug->certificateInChainExpiryNearWarning() &&
- certInChainDaysLeft <
- \
mSelectedCryptPlug->certificateInChainExpiryNearWarningInterval() ) {
- QString txt1;
- if( 0 < certInChainDaysLeft )
- txt1 = i18n( "One of the certificates in the chain of the \
certificate of the recipient you want to send this message to expires in %1 \
days.<br>This means that after this period, the recipient might not be able to read \
your message any longer." ).arg( certInChainDaysLeft );
- else if( 0 > certInChainDaysLeft )
- txt1 = i18n( "One of the certificates in the chain of the \
certificate of the recipient you want to send this message to expired %1 days \
ago.<br>This means that the recipient might not be able to read your message." ).arg( \
-certInChainDaysLeft );
- else
- txt1 = i18n( "One of the certificates in the chain of the \
certificate of the recipient you want to send this message to expires today.<br>This \
means that beginning from tomorrow, the recipient might not be able to read your \
message any longer." );
- int ret = KMessageBox::warningYesNo( this,
- i18n( "<qt><p>%1</p>"
- "<p>Do you still want to use this "
- "certificate?</p></qt>" )
- .arg( txt1 ),
- captionWarn,
- KGuiItem( i18n("&Use Certificate") ),
- KGuiItem( i18n("&Don't Use Certificate") ) );
- if( ret == KMessageBox::No )
- bEncrypt = false;
- }
- }
-
- /* The following test is not neccessary, since we _got_ the \
certificate
- by looking for all certificates of our addressee - so it _must_ be \
valid
- for the respective address!
-
- // Check whether the receiver address is contained in
- // the certificate.
- if( bEncrypt && \
mSelectedCryptPlug->receiverEmailAddressNotInCertificateWarning() &&
- !mSelectedCryptPlug->isEmailInCertificate( QString( \
KMMessage::getEmailAddr( recipient ) ).utf8(),
- certFingerprint ) ) {
- int ret = KMessageBox::warningYesNo( this,
- i18n( "The certificate does not contain the email address of the \
sender.\nThis means that it will not be possible for the recipient to read this \
message.\n\nDo you still want to use this certificate?" ),
- captionWarn );
- if( ret == KMessageBox::No )
- bEncrypt = false;
- }
- */
- }
+ }
+ else {
+ bEncrypt = false;
+ }
+ }
+ else {
+ for( QStringList::ConstIterator it = recipients.begin();
+ ( bEncrypt && it != recipients.end() );
+ ++it ) {
+ QCString certFingerprint = getEncryptionCertificate( *it );
+
+ bEncrypt = !certFingerprint.isEmpty();
if( bEncrypt ) {
- if( !encryptCertFingerprints.isEmpty() )
- encryptCertFingerprints += '\1';
- encryptCertFingerprints += certFingerprint;
+ certFingerprint.remove( 0, certFingerprint.findRev( '(' )+1 );
+ certFingerprint.truncate( certFingerprint.length()-1 );
+ kdDebug(5006) << "\n\n Recipient: " << *it
+ << "\nFingerprint of encryption key: "
+ << QString( certFingerprint ) << "\n\n" << endl;
+
+ bEncrypt = checkForEncryptCertificateExpiry( *it,
+ certFingerprint );
+
+ if( bEncrypt ) {
+ if( !encryptCertFingerprints.isEmpty() )
+ encryptCertFingerprints += '\1';
+ encryptCertFingerprints += certFingerprint;
+ }
}
- else
- break;
}
-
- if( !bEncrypt ) break;
-
}
-
} // if( encryptCertFingerprints.isEmpty() )
@@ -3237,7 +3174,241 @@ QByteArray KMComposeWin::pgpEncryptedMsg
}
+//-----------------------------------------------------------------------------
+QCString
+KMComposeWin::getEncryptionCertificate( const QString& recipient )
+{
+ bool bEncrypt = true;
+
+ QCString addressee = recipient.utf8();
+ addressee.replace(QRegExp("\\x0001"), " ");
+ kdDebug(5006) << "\n\n1st try: Retrieving keys for: " << recipient << endl;
+
+
+ QString selectedCert;
+ KListBoxDialog dialog( selectedCert, "", i18n( "&Select certificate:" ) );
+ dialog.resize( 700, 200 );
+ bool useDialog;
+ int certSize = 0;
+ QByteArray certificateList;
+
+ bool askForDifferentSearchString = false;
+ do {
+
+ certSize = 0;
+ char* certificatePtr = 0;
+ bool findCertsOk;
+ if( askForDifferentSearchString )
+ findCertsOk = false;
+ else {
+ findCertsOk = mSelectedCryptPlug->findCertificates( &(*addressee),
+ &certificatePtr,
+ &certSize,
+ false )
+ && (0 < certSize);
+ kdDebug(5006) << " keys retrieved successfully: " << findCertsOk << \
"\n" << endl; + kdDebug() << "findCertificates() 1st try returned " << \
certificatePtr << endl; + if( findCertsOk )
+ certificateList.assign( certificatePtr, certSize );
+ }
+ while( !findCertsOk ) {
+ bool bOk = false;
+ addressee = KLineEditDlg::getText(
+ askForDifferentSearchString
+ ? i18n("Look for other certificates")
+ : i18n("No certificate found"),
+ i18n("Enter different address for recipient %1 "
+ "or enter \" * \" to see all certificates:")
+ .arg(recipient),
+ addressee, &bOk, this ).stripWhiteSpace().utf8();
+ askForDifferentSearchString = false;
+ if( bOk ) {
+ addressee = addressee.simplifyWhiteSpace();
+ if( ("\"*\"" == addressee) ||
+ ("\" *\"" == addressee) ||
+ ("\"* \"" == addressee) ||
+ ("\" * \"" == addressee)) // You never know what users type. :-)
+ addressee = "*";
+ kdDebug(5006) << "\n\nnext try: Retrieving keys for: " << addressee << endl;
+ certSize = 0;
+ char* certificatePtr = 0;
+ findCertsOk = mSelectedCryptPlug->findCertificates(
+ &(*addressee),
+ &certificatePtr,
+ &certSize,
+ false )
+ && (0 < certSize);
+ kdDebug(5006) << " keys retrieved successfully: " << findCertsOk << \
"\n" << endl; + kdDebug() << "findCertificates() 2nd try returned " << \
certificatePtr << endl; + if( findCertsOk )
+ certificateList.assign( certificatePtr, certSize );
+ } else {
+ bEncrypt = false;
+ break;
+ }
+ }
+ if( bEncrypt && findCertsOk ) {
+
+ // fill selection dialog listbox
+ dialog.entriesLB->clear();
+ // show dialog even if only one entry to allow specifying of
+ // another search string _instead_of_ the recipients address
+ bool bAlwaysShowDialog = true;
+
+ useDialog = false;
+ int iA = 0;
+ int iZ = 0;
+ while( iZ < certSize ) {
+ if( (certificateList.at(iZ) == '\1') || (certificateList.at(iZ) == '\0') ) {
+ kdDebug(5006) << "iA=" << iA << " iZ=" << iZ << endl;
+ char c = certificateList.at(iZ);
+ if( (bAlwaysShowDialog || (c == '\1')) && !useDialog ) {
+ // set up selection dialog
+ useDialog = true;
+ dialog.setCaption( i18n( "Select certificate for encryption [%1]" )
+ .arg( recipient ) );
+ dialog.setLabelAbove(
+ i18n( "&Select certificate for recipient %1:" )
+ .arg( recipient ) );
+ }
+ certificateList.at(iZ) = '\0';
+ QString s = QString::fromUtf8( &certificateList.at(iA) );
+ certificateList.at(iZ) = c;
+ if( useDialog )
+ dialog.entriesLB->insertItem( s );
+ else
+ selectedCert = s;
+ ++iZ;
+ iA = iZ;
+ }
+ ++iZ;
+ }
+ // run selection dialog and retrieve user choice
+ // OR take the single entry (if only one was found)
+ if( useDialog ) {
+ dialog.setCommentBelow(
+ i18n("(Certificates matching address \"%1\", "
+ "press [Cancel] to use different address for recipient %2.)")
+ .arg( addressee )
+ .arg( recipient ) );
+ dialog.entriesLB->setFocus();
+ dialog.entriesLB->setSelected( 0, true );
+ askForDifferentSearchString = (dialog.exec() != QDialog::Accepted);
+ }
+ }
+ } while ( askForDifferentSearchString );
+
+ if( bEncrypt )
+ return selectedCert.utf8();
+ else
+ return QCString();
+}
+
+
+bool KMComposeWin::checkForEncryptCertificateExpiry( const QString& recipient,
+ const QCString& certFingerprint \
) +{
+ bool bEncrypt = true;
+
+ // Check for expiry of various certificates, but only if the
+ // plugin supports this.
+ if( mSelectedCryptPlug->hasFeature( Feature_WarnEncryptCertificateExpiry ) ) {
+ QString captionWarn = i18n( "Certificate Warning [%1]" ).arg( recipient );
+
+ int encRecvDaysLeft =
+ mSelectedCryptPlug->receiverCertificateDaysLeftToExpiry( certFingerprint );
+ if( mSelectedCryptPlug->receiverCertificateExpiryNearWarning() &&
+ encRecvDaysLeft <
+ mSelectedCryptPlug->receiverCertificateExpiryNearWarningInterval() ) {
+ QString txt1;
+ if( 0 < encRecvDaysLeft )
+ txt1 = i18n( "The certificate of the recipient you want to send this "
+ "message to expires in %1 days.<br>This means that after "
+ "this period, the recipient will not be able to read "
+ "your message any longer." )
+ .arg( encRecvDaysLeft );
+ else if( 0 > encRecvDaysLeft )
+ txt1 = i18n( "The certificate of the recipient you want to send this "
+ "message to expired %1 days ago.<br>This means that the "
+ "recipient will not be able to read your message." )
+ .arg( -encRecvDaysLeft );
+ else
+ txt1 = i18n( "The certificate of the recipient you want to send this "
+ "message to expires today.<br>This means that beginning "
+ "from tomorrow, the recipient will not be able to read "
+ "your message any longer." );
+ int ret = KMessageBox::warningYesNo( this,
+ i18n( "<qt><p>%1</p>"
+ "<p>Do you still want to use "
+ "this certificate?</p></qt>" )
+ .arg( txt1 ),
+ captionWarn,
+ KGuiItem( i18n("&Use Certificate") ),
+ KGuiItem( i18n("&Don't Use Certificate") ) );
+ if( ret == KMessageBox::No )
+ bEncrypt = false;
+ }
+ if( bEncrypt ) {
+ int certInChainDaysLeft =
+ mSelectedCryptPlug->certificateInChainDaysLeftToExpiry( certFingerprint );
+ if( mSelectedCryptPlug->certificateInChainExpiryNearWarning() &&
+ certInChainDaysLeft <
+ mSelectedCryptPlug->certificateInChainExpiryNearWarningInterval() ) {
+ QString txt1;
+ if( 0 < certInChainDaysLeft )
+ txt1 = i18n( "One of the certificates in the chain of the "
+ "certificate of the recipient you want to send this "
+ "message to expires in %1 days.<br>"
+ "This means that after this period, the recipient "
+ "might not be able to read your message any longer." )
+ .arg( certInChainDaysLeft );
+ else if( 0 > certInChainDaysLeft )
+ txt1 = i18n( "One of the certificates in the chain of the "
+ "certificate of the recipient you want to send this "
+ "message to expired %1 days ago.<br>"
+ "This means that the recipient might not be able to "
+ "read your message." )
+ .arg( -certInChainDaysLeft );
+ else
+ txt1 = i18n( "One of the certificates in the chain of the "
+ "certificate of the recipient you want to send this "
+ "message to expires today.<br>This means that "
+ "beginning from tomorrow, the recipient might not be "
+ "able to read your message any longer." );
+ int ret = KMessageBox::warningYesNo( this,
+ i18n( "<qt><p>%1</p>"
+ "<p>Do you still want to use this "
+ "certificate?</p></qt>" )
+ .arg( txt1 ),
+ captionWarn,
+ KGuiItem( i18n("&Use Certificate") ),
+ KGuiItem( i18n("&Don't Use Certificate") ) );
+ if( ret == KMessageBox::No )
+ bEncrypt = false;
+ }
+ }
+
+ /* The following test is not neccessary, since we _got_ the certificate
+ by looking for all certificates of our addressee - so it _must_ be valid
+ for the respective address!
+
+ // Check whether the receiver address is contained in
+ // the certificate.
+ if( bEncrypt && \
mSelectedCryptPlug->receiverEmailAddressNotInCertificateWarning() && + \
!mSelectedCryptPlug->isEmailInCertificate( QString( KMMessage::getEmailAddr( \
recipient ) ).utf8(), + certFingerprint ) ) {
+ int ret = KMessageBox::warningYesNo( this,
+ i18n( "The certificate does not contain the email address of the \
sender.\nThis means that it will not be possible for the recipient to read this \
message.\n\nDo you still want to use this certificate?" ), + captionWarn );
+ if( ret == KMessageBox::No )
+ bEncrypt = false;
+ }
+ */
+ }
+
+ return bEncrypt;
+}
Index: kmcomposewin.h
===================================================================
RCS file: /home/kde/kdenetwork/kmail/kmcomposewin.h,v
retrieving revision 1.173
diff -u -3 -p -r1.173 kmcomposewin.h
--- kmcomposewin.h 2002/09/11 22:52:48 1.173
+++ kmcomposewin.h 2002/09/30 20:00:57
@@ -590,6 +590,17 @@ private:
QCString& encryptCertFingerprints );
/**
+ * Get encryption certificate for a recipient (the Aegypten way).
+ */
+ QCString getEncryptionCertificate( const QString& recipient );
+
+ /**
+ * Check for expiry of various certificates.
+ */
+ bool checkForEncryptCertificateExpiry( const QString& recipient,
+ const QCString& certFingerprint );
+
+ /**
* Build a MIME object (or a flat text resp.) based upon
* structuring information returned by a crypto plugin that was
* called via pgpSignedMsg() (or pgpEncryptedMsg(), resp.).
[Attachment #6 (application/pgp-signature)]
_______________________________________________
KMail Developers mailing list
kmail@mail.kde.org
http://mail.kde.org/mailman/listinfo/kmail
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic