diff --git a/objecttreeparser.cpp b/objecttreeparser.cpp
index bf8f276b4..87cc40d55 100644
--- a/objecttreeparser.cpp
+++ b/objecttreeparser.cpp
@@ -652,6 +652,32 @@ namespace KMail {
return bIsOpaqueSigned;
}
+void ObjectTreeParser::writeDeferredDecryptionBlock()
+{
+ kDebug();
+ assert( mReader );
+ const QString iconName = KIconLoader::global()->iconPath( "document-decrypt",
+ KIconLoader::Small );
+ const QString decryptedData = "
"
+ + i18n("This message is encrypted.").toUtf8()
+ + "
"
+ "";
+ PartMetaData messagePart;
+ messagePart.isDecryptable = true;
+ messagePart.isEncrypted = true;
+ messagePart.isSigned = false;
+ mRawReplyString += decryptedData.toUtf8();
+ htmlWriter()->queue( writeSigstatHeader( messagePart,
+ cryptoProtocol(),
+ QString() ) );
+ htmlWriter()->queue( decryptedData );
+ htmlWriter()->queue( writeSigstatFooter( messagePart ) );
+}
bool ObjectTreeParser::okDecryptMIME( partNode& data,
QByteArray& decryptedData,
@@ -678,20 +704,7 @@ bool ObjectTreeParser::okDecryptMIME( partNode& data,
if ( cryptProto )
cryptPlugLibName = cryptProto->name();
- if ( mReader && !mReader->decryptMessage() ) {
- QString iconName = KIconLoader::global()->iconPath( "document-decrypt",
- KIconLoader::Small );
- decryptedData = ""
- + i18n("This message is encrypted.").toUtf8()
- + "
"
- "";
- return false;
- }
+ assert( !mReader || mReader->decryptMessage() );
const QString errorMsg = i18n( "Could not decrypt the data." );
if ( cryptProto && !kmkernel->contextMenuShown() ) {
@@ -1274,8 +1287,15 @@ namespace KMail {
return true;
}
- PartMetaData messagePart;
node->setEncryptionState( KMMsgFullyEncrypted );
+
+ if ( mReader && !mReader->decryptMessage() ) {
+ writeDeferredDecryptionBlock();
+ data->setProcessed( true, false ); // Set the data node to done to prevent it from being processed
+ return true;
+ }
+
+ PartMetaData messagePart;
QByteArray decryptedData;
bool signatureFound;
std::vector signatures;
@@ -1416,6 +1436,8 @@ namespace KMail {
writeBodyString( cstr, node->trueFromAddress(),
codecFor( node ), result, false );
mRawReplyString += cstr;
+ } else if ( mReader && !mReader->decryptMessage() ) {
+ writeDeferredDecryptionBlock();
} else {
/*
ATTENTION: This code is to be replaced by the planned 'auto-detect' feature.
@@ -1592,7 +1614,10 @@ namespace KMail {
bool passphraseError;
bool actuallyEncrypted = true;
- if ( okDecryptMIME( *node,
+ if ( mReader && !mReader->decryptMessage() ) {
+ writeDeferredDecryptionBlock();
+ isEncrypted = true;
+ } else if ( okDecryptMIME( *node,
decryptedData,
signatureFound,
signatures,
@@ -1635,10 +1660,8 @@ namespace KMail {
htmlWriter()->queue( writeSigstatHeader( messagePart,
cryptoProtocol(),
node->trueFromAddress() ) );
- if ( mReader->decryptMessage() )
- writePartIcon( &node->msgPart(), node->nodeId() );
- else
- htmlWriter()->queue( QString::fromUtf8( decryptedData ) );
+ assert( mReader->decryptMessage() ); // handled above
+ writePartIcon( &node->msgPart(), node->nodeId() );
htmlWriter()->queue( writeSigstatFooter( messagePart ) );
}
} else {
diff --git a/objecttreeparser.h b/objecttreeparser.h
index e1bd35e33..8e99883f2 100644
--- a/objecttreeparser.h
+++ b/objecttreeparser.h
@@ -190,6 +190,10 @@ namespace KMail {
const std::vector & paramSignatures = std::vector(),
bool hideErrors=false );
+ /** Writes out the block that we use when the node is encrypted,
+ but we're deferring decryption for later. */
+ void writeDeferredDecryptionBlock();
+
/** Returns the contents of the given multipart/encrypted
object. Data is decypted. May contain body parts. */
bool okDecryptMIME( partNode& data,