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() + + "
" + "
" + "" + "" + + i18n("Decrypt Message").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() - + "
" - "
" - "" - "" - + i18n("Decrypt Message").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,