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 );