Browse Source

reset iterator on found passphrase

synchronous Release_2.1.0-RC8
Volker Birk 5 years ago
parent
commit
5c7ea6171b
  1. 7
      callback_dispatcher.cc
  2. 14
      passphrase_cache.cc
  3. 21
      passphrase_cache.hh

7
callback_dispatcher.cc

@ -95,7 +95,7 @@ namespace pEp {
if (Adapter::on_sync_thread() && !msg) { if (Adapter::on_sync_thread() && !msg) {
semaphore.try_wait(); semaphore.try_wait();
PEP_STATUS status = PassphraseCache::messageToSend(passphrase_cache, Adapter::session()); PEP_STATUS status = PassphraseCache::config_next_passphrase();
// if the cache has no valid passphrase ask the app // if the cache has no valid passphrase ask the app
if (status == PEP_PASSPHRASE_REQUIRED || status == PEP_WRONG_PASSPHRASE) if (status == PEP_PASSPHRASE_REQUIRED || status == PEP_WRONG_PASSPHRASE)
@ -105,6 +105,11 @@ namespace pEp {
return status; return status;
} }
if (Adapter::on_sync_thread()) {
// a passphrase worked, reset passphrase_cache iterator
PassphraseCache::config_next_passphrase(true);
}
for (auto target : targets) { for (auto target : targets) {
::message *_msg = nullptr; ::message *_msg = nullptr;
if (msg) { if (msg) {

14
passphrase_cache.cc

@ -1,4 +1,5 @@
#include <cassert> #include <cassert>
#include "Adapter.hh"
#include "passphrase_cache.hh" #include "passphrase_cache.hh"
pEp::PassphraseCache pEp::passphrase_cache; pEp::PassphraseCache pEp::passphrase_cache;
@ -117,16 +118,23 @@ namespace pEp {
return _which->passphrase.c_str(); return _which->passphrase.c_str();
} }
PEP_STATUS PassphraseCache::messageToSend(PassphraseCache& cache, PEP_SESSION session) PEP_STATUS PassphraseCache::config_next_passphrase(bool reset)
{ {
static pEp::PassphraseCache _copy; static pEp::PassphraseCache _copy;
static bool new_copy = true; static bool new_copy = true;
if (reset) {
new_copy = true;
return PEP_STATUS_OK;
}
if (new_copy) { if (new_copy) {
_copy = cache; _copy = passphrase_cache;
new_copy = false; new_copy = false;
} }
try { try {
::config_passphrase(session, _copy.latest_passphrase()); ::config_passphrase(Adapter::session(), _copy.latest_passphrase());
return PEP_STATUS_OK; return PEP_STATUS_OK;
} }
catch (pEp::PassphraseCache::Empty&) { catch (pEp::PassphraseCache::Empty&) {

21
passphrase_cache.hh

@ -53,26 +53,12 @@ namespace pEp {
// adds the stored passphrase to the cache, which will not timeout // adds the stored passphrase to the cache, which will not timeout
const char *add_stored(const std::string& passphrase); const char *add_stored(const std::string& passphrase);
// get all passphrases in cache from latest to oldest one by each call
// this function is throwing PassphraseCache::Empty when cache is empty
// and PassphraseCache::Exhausted when no passphrases are left, then
// starts over
const char *latest_passphrase();
// call this function inside the messageToSend() implementation of the adapter // call this function inside the messageToSend() implementation of the adapter
// this function is using latest_passphrase() to test one passphrase after the // this function is using latest_passphrase() to test one passphrase after the
// other until the cache is exhausted // other until the cache is exhausted
// call with reset = true to reset the iterator
static PEP_STATUS messageToSend(PassphraseCache& cache, PEP_SESSION session); static PEP_STATUS config_next_passphrase(bool reset=false);
// for each passphrase call the callee until it returns true for a
// matching passphrase or no passphrases are left
// always tests empty passphrase first
// returns true if a passphrase was matching, false otherwise
using passphrase_callee = std::function<bool(std::string)>;
bool for_each_passphrase(const passphrase_callee& callee);
// convenience functions // convenience functions
// i.e. // i.e.
@ -87,6 +73,9 @@ namespace pEp {
protected: protected:
void cleanup(); void cleanup();
void refresh(cache::iterator entry); void refresh(cache::iterator entry);
const char *latest_passphrase();
using passphrase_callee = std::function<bool(std::string)>;
bool for_each_passphrase(const passphrase_callee& callee);
}; };
extern PassphraseCache passphrase_cache; extern PassphraseCache passphrase_cache;

Loading…
Cancel
Save