diff --git a/objecttreeparser.cpp b/objecttreeparser.cpp
index c55899364..0189dac32 100644
--- a/objecttreeparser.cpp
+++ b/objecttreeparser.cpp
@@ -644,6 +644,30 @@ namespace KMail {
return bIsOpaqueSigned;
}
+void ObjectTreeParser::writeDeferredDecryptionBlock() {
+ kdDebug(5006) << k_funcinfo << endl;
+ assert( mReader );
+ const QString iconName = KGlobal::instance()->iconLoader()->iconPath( "decrypted", KIcon::Small );
+ const QString decryptedData =
+ "
" +
+ i18n("This message is encrypted.") +
+ "
"
+ "";
+ PartMetaData messagePart;
+ messagePart.isDecryptable = true;
+ messagePart.isEncrypted = true;
+ messagePart.isSigned = false;
+ mRawReplyString += decryptedData.utf8();
+ htmlWriter()->queue( writeSigstatHeader( messagePart,
+ cryptoProtocol(),
+ QString() ) );
+ htmlWriter()->queue( decryptedData );
+ htmlWriter()->queue( writeSigstatFooter( messagePart ) );
+}
bool ObjectTreeParser::okDecryptMIME( partNode& data,
QCString& decryptedData,
@@ -670,19 +694,7 @@ bool ObjectTreeParser::okDecryptMIME( partNode& data,
if ( cryptProto )
cryptPlugLibName = cryptProto->name();
- if ( mReader && !mReader->decryptMessage() ) {
- QString iconName = KGlobal::instance()->iconLoader()->iconPath( "decrypted", KIcon::Small );
- decryptedData = ""
- + i18n("This message is encrypted.").utf8()
- + "
"
- "";
- return false;
- }
+ assert( !mReader || mReader->decryptMessage() );
if ( cryptProto && !kmkernel->contextMenuShown() ) {
QByteArray ciphertext( data.msgPart().bodyDecodedBinary() );
@@ -1223,9 +1235,16 @@ namespace KMail {
return true;
}
+ 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;
+ }
+
kdDebug(5006) << "\n-----> Initially processing encrypted data\n" << endl;
PartMetaData messagePart;
- node->setEncryptionState( KMMsgFullyEncrypted );
QCString decryptedData;
bool signatureFound;
std::vector signatures;
@@ -1373,6 +1392,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.
@@ -1549,7 +1570,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,
@@ -1592,10 +1616,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 800a74cc0..28c3088e9 100644
--- a/objecttreeparser.h
+++ b/objecttreeparser.h
@@ -193,6 +193,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,