From f210495d67311047d6c9acb6c2cdde17e212a628 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Tue, 4 Aug 2020 16:09:20 +0200 Subject: [PATCH 1/6] implementing ENGINE-781 --- Adapter.cc | 8 +++++++- Adapter.hh | 1 + passphrase_cache.cc | 16 ++++++++++++++++ passphrase_cache.hh | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Adapter.cc b/Adapter.cc index aa5bdb3..b545f54 100644 --- a/Adapter.cc +++ b/Adapter.cc @@ -7,6 +7,7 @@ #include #include "status_to_string.hh" #include "pEpLog.hh" +#include "passphrase_cache.hh" using namespace std; @@ -82,6 +83,11 @@ namespace pEp { return 0; } + PEP_STATUS _ensure_passphrase(PEP_SESSION session, const char *fpr) + { + return passphrase_cache.ensure_passphrase(session, fpr); + } + // threshold: max waiting time in seconds SYNC_EVENT _retrieve_next_sync_event(void *management, unsigned threshold) { @@ -120,7 +126,7 @@ namespace pEp { case init: if (!_session) - status = ::init(&_session, _messageToSend, _inject_sync_event); + status = ::init(&_session, _messageToSend, _inject_sync_event, _ensure_passphrase); break; default: diff --git a/Adapter.hh b/Adapter.hh index d5faac2..d71fb33 100644 --- a/Adapter.hh +++ b/Adapter.hh @@ -24,6 +24,7 @@ namespace pEp { namespace Adapter { int _inject_sync_event(SYNC_EVENT ev, void *management); + PEP_STATUS _ensure_passphrase(PEP_SESSION session, const char *fpr); template void startup( diff --git a/passphrase_cache.cc b/passphrase_cache.cc index 6c5a806..3d1815b 100644 --- a/passphrase_cache.cc +++ b/passphrase_cache.cc @@ -153,5 +153,21 @@ namespace pEp { return PEP_WRONG_PASSPHRASE; } } + + PEP_STATUS PassphraseCache::ensure_passphrase(PEP_SESSION session, std::string fpr) + { + PEP_STATUS status = PEP_STATUS_OK; + + for_each_passphrase([&](std::string passphrase) { + status = ::config_passphrase(session, passphrase.c_str()); + if (status) + return true; + + status = ::probe_encrypt(session, fpr.c_str()); + return status == PEP_STATUS_OK; + }); + + return status; + } }; diff --git a/passphrase_cache.hh b/passphrase_cache.hh index 08cc3a0..b857590 100644 --- a/passphrase_cache.hh +++ b/passphrase_cache.hh @@ -73,6 +73,7 @@ namespace pEp { static const char *latest_passphrase(PassphraseCache& _cache); using passphrase_callee = std::function; bool for_each_passphrase(const passphrase_callee& callee); + PEP_STATUS ensure_passphrase(PEP_SESSION session, std::string fpr); protected: void cleanup(); From 27ebfb3ba2e225875f1a00d99b1ddf62fe4a6ba3 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Wed, 5 Aug 2020 11:47:15 +0200 Subject: [PATCH 2/6] test/test_ensure_passphrase.cc --- Makefile.conf | 6 +++- passphrase_cache.cc | 2 +- passphrase_cache.hxx | 1 - test/Makefile | 27 +++++----------- test/test_ensure_passphrase.cc | 57 ++++++++++++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 23 deletions(-) create mode 100644 test/test_ensure_passphrase.cc diff --git a/Makefile.conf b/Makefile.conf index 28496ff..70e6875 100644 --- a/Makefile.conf +++ b/Makefile.conf @@ -7,7 +7,7 @@ HERE:=$(dir $(lastword $(MAKEFILE_LIST))) PREFIX=$(HOME) -CXXFLAGS=-std=c++11 -fPIC -O0 $(ENGINE_INC) +CXXFLAGS1=-std=c++11 -fPIC -O0 $(ENGINE_INC) # Build target BUILD_FOR:=$(shell uname) @@ -47,3 +47,7 @@ endif ifdef BUILD_CONFIG include $(BUILD_CONFIG) endif + +ifndef ENGINE_TEST + ENGINE_TEST = \"$(HOME)/dev/pEpEngine/test\" +endif diff --git a/passphrase_cache.cc b/passphrase_cache.cc index 3d1815b..c3b46e9 100644 --- a/passphrase_cache.cc +++ b/passphrase_cache.cc @@ -156,7 +156,7 @@ namespace pEp { PEP_STATUS PassphraseCache::ensure_passphrase(PEP_SESSION session, std::string fpr) { - PEP_STATUS status = PEP_STATUS_OK; + PEP_STATUS status; for_each_passphrase([&](std::string passphrase) { status = ::config_passphrase(session, passphrase.c_str()); diff --git a/passphrase_cache.hxx b/passphrase_cache.hxx index 17d9288..cb97d7a 100644 --- a/passphrase_cache.hxx +++ b/passphrase_cache.hxx @@ -1,4 +1,3 @@ -#pragma once #include "passphrase_cache.hh" namespace pEp { diff --git a/test/Makefile b/test/Makefile index 5dd5120..05b56dc 100644 --- a/test/Makefile +++ b/test/Makefile @@ -2,28 +2,15 @@ include ../Makefile.conf LDFLAGS=-L../ $(ENGINE_LIB) LDLIBS=-lstdc++ -lpEpEngine -lpEpAdapter -CXXFLAGS+=-I../ +CXXFLAGS+=-I../ $(ENGINE_INC) -std=c++11 -DENGINE_TEST=$(ENGINE_TEST) -.PHONY=all, test_adapter, test_adapter_cxx, test_library +SRC=$(wildcard test_*.cc) +TST=$(subst .cc,,$(SRC)) -all: test_adapter test_adapter_cxx test_library test_passphrase_cache test_semaphore test_message_cache +all: $(TST) -test_adapter: test_adapter.cc ../libpEpAdapter.a - -test_adapter_cxx: test_adapter_cxx.cc ../libpEpAdapter.a - -test_library: test_library.cc ../libpEpAdapter.a - -test_passphrase_cache: test_passphrase_cache.cc ../libpEpAdapter.a - -test_semaphore: test_semaphore.cc ../libpEpAdapter.a - -test_message_cache: test_message_cache.cc ../libpEpAdapter.a +%: %.cc ../libpEpAdapter.a clean: - rm -vf test_adapter - rm -rvf test_adapter.dSYM - rm -vf test_adapter_cxx - rm -rvf test_adapter_cxx.dSYM - rm -vf test_library - rm -rvf test_library.dSYM + rm -f $(TST) + rm -f *.dSYM diff --git a/test/test_ensure_passphrase.cc b/test/test_ensure_passphrase.cc new file mode 100644 index 0000000..907124e --- /dev/null +++ b/test/test_ensure_passphrase.cc @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include + +#include "Adapter.hh" +#include "passphrase_cache.hh" +#include "status_to_string.hh" + +#include +#include + +using namespace pEp; +using namespace pEp::Adapter; +using namespace std; + +void test() +{ + passphrase_cache.add("erwin"); + passphrase_cache.add("cathy"); + passphrase_cache.add("bob"); + + const char* bob_filename = ENGINE_TEST "/test_keys/bob-primary-with-password-bob-subkey-without.pgp"; + const char* bob_fpr = "5C76378A62B04CF3F41BEC8D4940FC9FA1878736"; + + const char* erwin_filename = ENGINE_TEST "/test_keys/erwin_normal_encrypted.pgp"; + const char* erwin_fpr = "CBA968BC01FCEB89F04CCF155C5E9E3F0420A570"; + + pEp_identity* bob = ::new_identity("bob@example.org", bob_fpr, "BOB", "Bob Dog"); + PEP_STATUS status = ::set_own_key(session(), bob, bob_fpr); + + pEp_identity* erwin = ::new_identity("erwin@example.org", erwin_fpr, "BOB", "Bob is Erwin"); + status = ::set_own_key(session(), erwin, erwin_fpr); + + ::free_identity(bob); + ::free_identity(erwin); + + session(Adapter::release); +} + +int main() +{ + char path[MAXPATHLEN+1]; + const char *templ = "/tmp/test_ensure_passphrase.XXXXXXXXXXXX"; + strcpy(path, templ); + char *tmpdir = mkdtemp(path); + assert(tmpdir); + chdir(tmpdir); + setenv("HOME", path, 1); + cerr << "test directory: " << path << endl; + + test(); + return 0; +} + From 10b0cfff158e8f7de4fbce353e38af76193b9ee5 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Wed, 5 Aug 2020 12:13:43 +0200 Subject: [PATCH 3/6] key import --- test/test_ensure_passphrase.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/test_ensure_passphrase.cc b/test/test_ensure_passphrase.cc index 907124e..990169b 100644 --- a/test/test_ensure_passphrase.cc +++ b/test/test_ensure_passphrase.cc @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include @@ -16,6 +18,16 @@ using namespace pEp; using namespace pEp::Adapter; using namespace std; +void import_key_from_file(string filename) +{ + ifstream f(filename, ifstream::in); + string key{istreambuf_iterator(f), istreambuf_iterator()}; + ::identity_list *il = NULL; + PEP_STATUS status = ::import_key(session(), key.c_str(), key.length(), &il); + assert(status == PEP_KEY_IMPORTED); + ::free_identity_list(il); +} + void test() { passphrase_cache.add("erwin"); @@ -28,6 +40,9 @@ void test() const char* erwin_filename = ENGINE_TEST "/test_keys/erwin_normal_encrypted.pgp"; const char* erwin_fpr = "CBA968BC01FCEB89F04CCF155C5E9E3F0420A570"; + import_key_from_file(bob_filename); + import_key_from_file(erwin_filename); + pEp_identity* bob = ::new_identity("bob@example.org", bob_fpr, "BOB", "Bob Dog"); PEP_STATUS status = ::set_own_key(session(), bob, bob_fpr); From ef605578cc13542407dd5d63a31d1c4ee2043ff7 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Wed, 5 Aug 2020 12:24:11 +0200 Subject: [PATCH 4/6] test with key_reset_all_own_keys() --- test/test_ensure_passphrase.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/test_ensure_passphrase.cc b/test/test_ensure_passphrase.cc index 990169b..9de9690 100644 --- a/test/test_ensure_passphrase.cc +++ b/test/test_ensure_passphrase.cc @@ -13,6 +13,7 @@ #include #include +#include using namespace pEp; using namespace pEp::Adapter; @@ -45,9 +46,14 @@ void test() pEp_identity* bob = ::new_identity("bob@example.org", bob_fpr, "BOB", "Bob Dog"); PEP_STATUS status = ::set_own_key(session(), bob, bob_fpr); + assert(status == PEP_STATUS_OK); pEp_identity* erwin = ::new_identity("erwin@example.org", erwin_fpr, "BOB", "Bob is Erwin"); status = ::set_own_key(session(), erwin, erwin_fpr); + assert(status == PEP_STATUS_OK); + + status = ::key_reset_all_own_keys(session()); + assert(status == PEP_STATUS_OK); ::free_identity(bob); ::free_identity(erwin); From 358e3ccc3c4da0fa1d4c7e0db45b44bea1bafbfc Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Wed, 5 Aug 2020 17:23:13 +0200 Subject: [PATCH 5/6] those are directories --- test/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Makefile b/test/Makefile index 05b56dc..df63afa 100644 --- a/test/Makefile +++ b/test/Makefile @@ -13,4 +13,4 @@ all: $(TST) clean: rm -f $(TST) - rm -f *.dSYM + rm -Rf *.dSYM From 48d6323ff5f910e47c527911a7907f2291984e7d Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Wed, 5 Aug 2020 17:57:10 +0200 Subject: [PATCH 6/6] tests are using tmp dirs --- Makefile | 2 -- Makefile.conf | 10 ++++++---- test/test_adapter.cc | 10 ++++++++++ test/test_library.cc | 3 --- test/test_message_cache.cc | 29 +++++++++++++++++++---------- test/test_passphrase_cache.cc | 24 +++++++++++++++--------- 6 files changed, 50 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index c6c2e17..d9848f8 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,6 @@ DEPENDS=$(subst .cc,.d,$(SOURCE)) all: $(TARGET) --include Makefile.protocols - %.d: %.cc @set -e; rm -f $@; \ $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< > $@.$$$$; \ diff --git a/Makefile.conf b/Makefile.conf index 70e6875..793b57d 100644 --- a/Makefile.conf +++ b/Makefile.conf @@ -6,8 +6,8 @@ HERE:=$(dir $(lastword $(MAKEFILE_LIST))) -PREFIX=$(HOME) -CXXFLAGS1=-std=c++11 -fPIC -O0 $(ENGINE_INC) +PREFIX?=$(HOME) +CXXFLAGS+=-std=c++11 -fPIC -O0 # Build target BUILD_FOR:=$(shell uname) @@ -29,8 +29,8 @@ else endif ######### Engine ######### -ENGINE_LIB_PATH=$(HOME)/lib -ENGINE_INC_PATH=$(HOME)/include +ENGINE_LIB_PATH=$(PREFIX)/lib +ENGINE_INC_PATH=$(PREFIX)/include ######### Overrides ######### -include $(HERE)/local.conf @@ -51,3 +51,5 @@ endif ifndef ENGINE_TEST ENGINE_TEST = \"$(HOME)/dev/pEpEngine/test\" endif + +CXXFLAGS += $(ENGINE_INC) diff --git a/test/test_adapter.cc b/test/test_adapter.cc index b0c6e5a..45e5c96 100644 --- a/test/test_adapter.cc +++ b/test/test_adapter.cc @@ -5,6 +5,7 @@ #include #include #include +#include #include #include "pEpLog.hh" @@ -25,6 +26,15 @@ PEP_STATUS notifyHandshake(pEp_identity *me, pEp_identity *partner, sync_handsha int main() { + char path[MAXPATHLEN+1]; + const char *templ = "/tmp/test_adapter.XXXXXXXXXXXX"; + strcpy(path, templ); + char *tmpdir = mkdtemp(path); + assert(tmpdir); + chdir(tmpdir); + setenv("HOME", path, 1); + cerr << "test directory: " << path << endl; + // Create new identity pEpLog("updating or creating identity for me"); pEp_identity *me = new_identity("alice@peptest.ch", NULL, "23", "Who the F* is Alice"); diff --git a/test/test_library.cc b/test/test_library.cc index 3b5a56f..5179cc2 100644 --- a/test/test_library.cc +++ b/test/test_library.cc @@ -1,6 +1,3 @@ -// small unittest program for libpEpAdapter -// TODO: use Gtest or the like for more modular unit tests! - #include "pc_container.hh" #include #include diff --git a/test/test_message_cache.cc b/test/test_message_cache.cc index 8ca7685..2c0b8ef 100644 --- a/test/test_message_cache.cc +++ b/test/test_message_cache.cc @@ -1,18 +1,26 @@ #include #include +#include +#include #include "message_cache.hh" +#include "Adapter.hh" using namespace std; using namespace pEp; int main() { - PEP_SESSION session; - PEP_STATUS status = ::init(&session, nullptr, nullptr); - assert(status == PEP_STATUS_OK); + char path[MAXPATHLEN+1]; + const char *templ = "/tmp/test_message_cache.XXXXXXXXXXXX"; + strcpy(path, templ); + char *tmpdir = mkdtemp(path); + assert(tmpdir); + chdir(tmpdir); + setenv("HOME", path, 1); + cerr << "test directory: " << path << endl; pEp_identity *alice = ::new_identity("alice@mail.com", nullptr, PEP_OWN_USERID, "Alice"); - ::myself(session, alice); + ::myself(pEp::Adapter::session(), alice); char *mime = strdup("From: Alice \n" "To: Bob \n" @@ -24,20 +32,20 @@ int main() ::message *src = nullptr; bool has_possible_pEp_msg; - status = MessageCache::cache_mime_decode_message(mime, strlen(mime), &src, &has_possible_pEp_msg); + PEP_STATUS status = MessageCache::cache_mime_decode_message(mime, strlen(mime), &src, &has_possible_pEp_msg); assert(status == PEP_STATUS_OK); - status = ::myself(session, src->from); + status = ::myself(pEp::Adapter::session(), src->from); assert(status == PEP_STATUS_OK); - ::update_identity(session, src->to->ident); + ::update_identity(pEp::Adapter::session(), src->to->ident); assert(status == PEP_STATUS_OK); pEp_identity *bob = identity_dup(src->to->ident); src->dir = PEP_dir_outgoing; ::message *dst = nullptr; - status = MessageCache::cache_encrypt_message(session, src, nullptr, &dst, PEP_enc_PEP, 0); + status = MessageCache::cache_encrypt_message(pEp::Adapter::session(), src, nullptr, &dst, PEP_enc_PEP, 0); assert(status != PEP_ILLEGAL_VALUE); assert(src->longmsg == nullptr); @@ -68,7 +76,7 @@ int main() PEP_decrypt_flags_t flags = 0; stringlist_t *keylist = nullptr; - status = MessageCache::cache_decrypt_message(session, src, &dst, &keylist, &rating, &flags); + status = MessageCache::cache_decrypt_message(pEp::Adapter::session(), src, &dst, &keylist, &rating, &flags); assert(status != PEP_ILLEGAL_VALUE); assert(src->longmsg == nullptr); @@ -90,7 +98,8 @@ int main() ::free_message(dst); ::free_identity(bob); ::free_identity(alice); - ::release(session); + + pEp::Adapter::session(pEp::Adapter::release); return 0; } diff --git a/test/test_passphrase_cache.cc b/test/test_passphrase_cache.cc index a94aa62..4d51d75 100644 --- a/test/test_passphrase_cache.cc +++ b/test/test_passphrase_cache.cc @@ -1,7 +1,9 @@ #include #include #include +#include +#include "Adapter.hh" #include "passphrase_cache.hh" #include "status_to_string.hh" @@ -21,10 +23,14 @@ extern "C" { int main() { - PEP_SESSION session; - PEP_STATUS status = ::init(&session, NULL, NULL); - assert(status == PEP_STATUS_OK); - assert(session); + char path[MAXPATHLEN+1]; + const char *templ = "/tmp/test_passphrase_cache.XXXXXXXXXXXX"; + strcpy(path, templ); + char *tmpdir = mkdtemp(path); + assert(tmpdir); + chdir(tmpdir); + setenv("HOME", path, 1); + std::cerr << "test directory: " << path << std::endl; const char *str = "23"; char *bytes = NULL; @@ -45,9 +51,9 @@ int main() std::cout << "expected: two passphrases but reverse order\n"; cache.for_each_passphrase([&](std::string passphrase){std::cout << "'" << passphrase << "'\n"; return false;}); - status = cache.api(api_test1, session, "23", bytes, n, (::stringlist_t *) NULL); + PEP_STATUS status = cache.api(api_test1, pEp::Adapter::session(), "23", bytes, n, (::stringlist_t *) NULL); assert(status == PEP_WRONG_PASSPHRASE); - status = cache.api(api_test2, session, n, str, bytes, sl); + status = cache.api(api_test2, pEp::Adapter::session(), n, str, bytes, sl); assert(status == PEP_STATUS_OK); cache.add("hello"); @@ -74,12 +80,12 @@ int main() std::cout << "expected: no passphrase\n"; cache.for_each_passphrase([&](std::string passphrase){std::cout << "'" << passphrase << "'\n"; return false;}); - status = cache.api(api_test1, session, str, bytes, n, sl); + status = cache.api(api_test1, pEp::Adapter::session(), str, bytes, n, sl); assert(status == PEP_WRONG_PASSPHRASE); - status = cache.api(api_test2, session, 23, str, bytes, sl); + status = cache.api(api_test2, pEp::Adapter::session(), 23, str, bytes, sl); assert(status == PEP_STATUS_OK); - ::release(session); + pEp::Adapter::session(pEp::Adapter::release); return 0; }