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