From d94b058cf48a1fe6277edf60727a5611c4a89157 Mon Sep 17 00:00:00 2001 From: Thomas McGuire Date: Wed, 17 Jun 2009 13:22:18 +0000 Subject: [PATCH] Merged revisions 982309 via svnmerge from svn+ssh://tmcguire@svn.kde.org/home/kde/branches/kdepim/enterprise4/kdepim ................ r982309 | winterz | 2009-06-15 15:37:29 +0200 (Mon, 15 Jun 2009) | 9 lines Merged revisions 982278 via svnmerge from https://svn.kde.org/home/kde/branches/kdepim/enterprise/kdepim ........ r982278 | mutz | 2009-06-15 08:42:59 -0400 (Mon, 15 Jun 2009) | 1 line Try to minimise the number of unnecessary key lookups. When there is no explicit request to encrypt, and opportunistic encryption is switched off, and no encryption preferences are found that would indicate encryption, then do not look up recipient's keys at all. kolab/issue3578 ........ ................ svn path=/trunk/KDE/kdepim/; revision=982996 --- keyresolver.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/keyresolver.cpp b/keyresolver.cpp index 8cc96db8f..e627a5d3d 100644 --- a/keyresolver.cpp +++ b/keyresolver.cpp @@ -409,6 +409,11 @@ public: } void operator()( Item & item ); + template + void process( Container & c ) { + *this = std::for_each( c.begin(), c.end(), *this ); + } + #define make_int_accessor(x) unsigned int num##x() const { return m##x; } make_int_accessor(NoKey) make_int_accessor(NeverEncrypt) @@ -421,6 +426,7 @@ public: #undef make_int_accessor private: EncryptionPreference mDefaultPreference; + bool mNoOps; unsigned int mTotal; unsigned int mNoKey; unsigned int mNeverEncrypt, mUnknownPreference, mAlwaysEncrypt, @@ -428,12 +434,14 @@ private: }; void Kleo::KeyResolver::EncryptionPreferenceCounter::operator()( Item & item ) { + if ( _this ) { if ( item.needKeys ) item.keys = _this->getEncryptionKeys( item.address, true ); if ( item.keys.empty() ) { ++mNoKey; return; } + } switch ( !item.pref ? mDefaultPreference : item.pref ) { #define CASE(x) case Kleo::x: ++m##x; break CASE(NeverEncrypt); @@ -980,6 +988,20 @@ Kleo::Action Kleo::KeyResolver::checkEncryptionPreferences( bool encryptionReque d->mOpenPGPEncryptToSelfKeys.empty() && d->mSMIMEEncryptToSelfKeys.empty() ) return Impossible; + if ( !encryptionRequested && !mOpportunisticEncyption ) { + // try to minimize crypto ops (including key lookups) by only + // looking up keys when at least one the the encryption + // preferences needs it: + EncryptionPreferenceCounter count( 0, UnknownPreference ); + count.process( d->mPrimaryEncryptionKeys ); + count.process( d->mSecondaryEncryptionKeys ); + if ( !count.numAlwaysEncrypt() && + !count.numAlwaysAskForEncryption() && // this guy might not need a lookup, when declined, but it's too complex to implement that here + !count.numAlwaysEncryptIfPossible() && + !count.numAskWheneverPossible() ) + return DontDoIt; + } + EncryptionPreferenceCounter count( this, mOpportunisticEncyption ? AskWheneverPossible : UnknownPreference ); count = std::for_each( d->mPrimaryEncryptionKeys.begin(), d->mPrimaryEncryptionKeys.end(), count );