From 90183978167f873f61ac9f2dadd54e88cab6a4c7 Mon Sep 17 00:00:00 2001 From: Thomas McGuire Date: Wed, 18 Mar 2009 10:23:17 +0000 Subject: [PATCH] Merged revisions 938098 via svnmerge from svn+ssh://tmcguire@svn.kde.org/home/kde/branches/kdepim/enterprise4/kdepim ................ r938098 | tmcguire | 2009-03-11 11:07:10 +0100 (Wed, 11 Mar 2009) | 9 lines Merged revisions 936963 via svnmerge from svn+ssh://tmcguire@svn.kde.org/home/kde/branches/kdepim/enterprise/kdepim ........ r936963 | mutz | 2009-03-08 19:45:49 +0100 (Sun, 08 Mar 2009) | 1 line Fix kolab/issue2628 (For encrypted emails where no encryption was tried, it says "decryption impossible") ........ ................ svn path=/trunk/KDE/kdepim/; revision=940798 --- objecttreeparser.cpp | 63 ++++++++++++++++++++++++++++++-------------- objecttreeparser.h | 4 +++ 2 files changed, 47 insertions(+), 20 deletions(-) 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,