[Kde-pim] branches/work/akonadi-ports/kdepim
Bertjan Broeksema
b.broeksema at home.nl
Tue Nov 17 12:07:11 GMT 2009
SVN commit 1050481 by bbroeksema:
Quick fix for broken signing/encryption of emails. See the comment in
kmail/newcomposerwin.cpp for a more correct fix of this issue.
CCMAIL: kde-pim at kde.org
M +57 -11 kmail/newcomposerwin.cpp
M +1 -2 messagecomposer/composer.cpp
M +7 -0 messagecomposer/signjob.cpp
--- branches/work/akonadi-ports/kdepim/kmail/newcomposerwin.cpp #1050480:1050481
@@ -2260,26 +2260,72 @@
}
kDebug() << "done resolving keys:";
+ // When the user has configured the preferred cryptography format to any, at this
+ // point it should be found out which format should be used for which recipient.
+ // This wasn't done at all first and the current implementation is a quick fix
+ // which isn't completely correct. It just uses the first concrete format that
+ // it finds and doesn't handle cases in which more formats are supported for
+ // a recipient. This also would need changes in Message::Composer as it seems
+ // to assume composing of one message and one encryption/signing format which
+ // isn't true always.
+ //
+ // Current Quick fix: Iterate over the concrete Crypto message format and take
+ // the first supported one.
+ // Correct fix: Iterate over all message formats and for any that return split infos
+ // create a message for every split info.
+ Kleo::CryptoMessageFormat concreteEncryptFormat = Kleo::AutoFormat;
if( encryptSomething ) {
- std::vector<Kleo::KeyResolver::SplitInfo> encData = keyResolver->encryptionItems( cryptoMessageFormat() );
- std::vector<Kleo::KeyResolver::SplitInfo>::iterator it;
- QList<QPair<QStringList, std::vector<GpgME::Key> > > data;
- for( it = encData.begin(); it != encData.end(); ++it ) {
- QPair<QStringList, std::vector<GpgME::Key> > p( it->recipients, it->keys );
- data.append( p );
- kDebug() << "got resolved keys for:" << it->recipients;
+ for ( unsigned int i = 0 ; i < numConcreteCryptoMessageFormats ; ++i ) {
+ if ( keyResolver->encryptionItems( concreteCryptoMessageFormats[i] ).empty() )
+ continue;
+
+ if ( !(concreteCryptoMessageFormats[i] & cryptoMessageFormat()) )
+ continue;
+
+ concreteEncryptFormat = concreteCryptoMessageFormats[i];
+
+ std::vector<Kleo::KeyResolver::SplitInfo> encData = keyResolver->encryptionItems( concreteEncryptFormat );
+ std::vector<Kleo::KeyResolver::SplitInfo>::iterator it;
+ QList<QPair<QStringList, std::vector<GpgME::Key> > > data;
+ for( it = encData.begin(); it != encData.end(); ++it ) {
+ QPair<QStringList, std::vector<GpgME::Key> > p( it->recipients, it->keys );
+ data.append( p );
+ kDebug() << "got resolved keys for:" << it->recipients;
+ }
+ composer->setEncryptionKeys( data );
+ break; // Quick fix, TODO: Implement correct fix.
}
- composer->setEncryptionKeys( data );
}
+ Kleo::CryptoMessageFormat concreteSignFormat = Kleo::AutoFormat;
if( signSomething ) {
- std::vector<GpgME::Key> signingKeys = keyResolver->signingKeys( cryptoMessageFormat() );
- composer->setSigningKeys( signingKeys );
+ for ( unsigned int i = 0 ; i < numConcreteCryptoMessageFormats ; ++i ) {
+ if ( keyResolver->encryptionItems( concreteCryptoMessageFormats[i] ).empty() )
+ continue;
+
+ if ( !(concreteCryptoMessageFormats[i] & cryptoMessageFormat()) )
+ continue;
+
+ concreteSignFormat = concreteCryptoMessageFormats[i];
+
+ std::vector<GpgME::Key> signingKeys = keyResolver->signingKeys( concreteSignFormat );
+ composer->setSigningKeys( signingKeys );
+
+ break; // Quick fix, TODO: Implement correct fix.
+ }
}
composer->setSignAndEncrypt( sign, encrypt );
- composer->setMessageCryptoFormat( cryptoMessageFormat() );
+ // TODO: Take in account that a composer can create more than one message which might
+ // have different formats.
+ if ( concreteEncryptFormat != Kleo::AutoFormat )
+ composer->setMessageCryptoFormat( concreteEncryptFormat );
+ else if ( concreteSignFormat != Kleo::AutoFormat )
+ composer->setMessageCryptoFormat( concreteSignFormat );
+ else if( signSomething || encryptSomething )
+ Q_ASSERT_X( false, "KMComposeWin::fillCryptoInfo" , "No concrete sign or encrypt method selected");
+
return true;
}
--- branches/work/akonadi-ports/kdepim/messagecomposer/composer.cpp #1050480:1050481
@@ -274,7 +274,7 @@
std::vector<GpgME::Key> keys;
QStringList recipients;
- Q_ASSERT( dynamic_cast<ContentJobBase*>( job ) );
+ Q_ASSERT( dynamic_cast<ContentJobBase*>( job ) == static_cast<ContentJobBase*>( job ) );
ContentJobBase* contentJob = static_cast<ContentJobBase*>( job );
// create the final headers and body,
@@ -312,7 +312,6 @@
headers = skeletonMessage;
resultContent = contentJob->content();
-
}
// manually remove the subjob so we can check if we have any left later
q->removeSubjob( job );
--- branches/work/akonadi-ports/kdepim/messagecomposer/signjob.cpp #1050480:1050481
@@ -98,6 +98,8 @@
{
Q_D( SignJob );
+ Q_ASSERT( content );
+
d->content = content;
}
@@ -105,6 +107,11 @@
{
Q_D( SignJob );
+ // There *must* be a concrete format set at this point.
+ Q_ASSERT( format == Kleo::OpenPGPMIMEFormat
+ || format == Kleo::InlineOpenPGPFormat
+ || format == Kleo::SMIMEFormat
+ || format == Kleo::SMIMEOpaqueFormat );
d->format = format;
}
_______________________________________________
KDE PIM mailing list kde-pim at kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
KDE PIM home page at http://pim.kde.org/
More information about the kde-pim
mailing list