From 0ffbdde7b598c7c3fff5d797e732dec07685f9be Mon Sep 17 00:00:00 2001 From: Krista Bennett Date: Fri, 26 Feb 2021 15:13:53 +0100 Subject: [PATCH] ENGINE-866: Add boolean for whether to set the sticky bit or not with set_own_imported_key. the adapter should filter this out for apps, I guess, according to Volker --- src/keymanagement.c | 8 +- src/keymanagement.h | 31 +- test/src/KeyResetMessageTest.cc | 4 +- test/src/StickyBitTest.cc | 2 +- .../check_reset_all_own_grouped_sticky.eml | 284 ++++++++++++++++++ 5 files changed, 321 insertions(+), 8 deletions(-) create mode 100644 test/test_mails/check_reset_all_own_grouped_sticky.eml diff --git a/src/keymanagement.c b/src/keymanagement.c index 092129c68..e83eb9a4f 100644 --- a/src/keymanagement.c +++ b/src/keymanagement.c @@ -2200,11 +2200,13 @@ DYNAMIC_API PEP_STATUS set_own_key( return status; } -// This differs from set_own_key because it sets a manually-imported bit in the trust DB +// This differs from set_own_key because it can set a manually-imported bit in the trust DB +// and tests to see if the key will encrypt DYNAMIC_API PEP_STATUS set_own_imported_key( PEP_SESSION session, pEp_identity* me, - const char* fpr) { + const char* fpr, + bool sticky) { PEP_STATUS status = PEP_STATUS_OK; @@ -2227,7 +2229,7 @@ DYNAMIC_API PEP_STATUS set_own_imported_key( if (status != PEP_STATUS_OK) return status; - status = update_key_sticky_bit_for_user(session, me, fpr, true); + status = update_key_sticky_bit_for_user(session, me, fpr, sticky); return status; } diff --git a/src/keymanagement.h b/src/keymanagement.h index 53a37bb5f..312122e2b 100644 --- a/src/keymanagement.h +++ b/src/keymanagement.h @@ -460,11 +460,38 @@ DYNAMIC_API PEP_STATUS set_own_key( const char *fpr ); - +/** + * + * + * @brief Mark a key as an own default key, test to be sure the private key is + * present and can be used, and + * + * @param[in] session session to use + * @param[in,out] me own identity this key is used for + * @param[in] fpr fingerprint of the key to mark as own key + * @param[in] sticky boolean, true if we should set a sticky bit so + * it will not be automatically reset by sync and should + * win sync key elections if no other competing key + * for the same identity has its sticky bit set, + * false otherwise + * + * @warning the key has to be in the key ring already + * me->address, me->user_id and me->username must be set to valid data + * myself() is called by set_own_key() from within this call without key generation + * me->flags are ignored + * me->address must not be an alias + * me->fpr will be ignored and replaced by fpr, but + * caller MUST surrender ownership of the me->fpr reference, because + * it may be freed and replaced within the myself call. caller owns + * me->fpr memory again upon return. + * CAN GENERATE A PASSPHRASE REQUEST + * + */ DYNAMIC_API PEP_STATUS set_own_imported_key( PEP_SESSION session, pEp_identity* me, - const char* fpr + const char* fpr, + bool sticky ); // diff --git a/test/src/KeyResetMessageTest.cc b/test/src/KeyResetMessageTest.cc index 2ca6b4330..e0b6e8129 100644 --- a/test/src/KeyResetMessageTest.cc +++ b/test/src/KeyResetMessageTest.cc @@ -1138,14 +1138,14 @@ TEST_F(KeyResetMessageTest, check_reset_all_own_grouped_with_sticky) { // sticky - true alex_id2->me = true; - status = set_own_imported_key(session, alex_id2, pubkey2); + status = set_own_imported_key(session, alex_id2, pubkey2, true); ASSERT_EQ(status, PEP_STATUS_OK); status = set_identity_flags(session, alex_id2, alex_id2->flags | PEP_idf_not_for_sync); ASSERT_EQ(status , PEP_STATUS_OK); // sticky - true alex_id3->me = true; - status = set_own_imported_key(session, alex_id3, pubkey3); + status = set_own_imported_key(session, alex_id3, pubkey3, true); ASSERT_EQ(status, PEP_STATUS_OK); status = set_identity_flags(session, alex_id3, alex_id3->flags | PEP_idf_devicegroup); ASSERT_EQ(status , PEP_STATUS_OK); diff --git a/test/src/StickyBitTest.cc b/test/src/StickyBitTest.cc index 774adab27..209932f54 100644 --- a/test/src/StickyBitTest.cc +++ b/test/src/StickyBitTest.cc @@ -87,7 +87,7 @@ TEST_F(StickyBitTest, check_set_sticky_bit_normal) { const char* bob_name = "STOP MESSING WITH ME ALICE"; const char* bob_fpr = "BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"; pEp_identity* me = new_identity("pep.test.bob@pep-project.org", NULL, PEP_OWN_USERID, bob_name); - status = set_own_imported_key(session, me, bob_fpr); + status = set_own_imported_key(session, me, bob_fpr, true); ASSERT_EQ(status , PEP_STATUS_OK); status = myself(session, me); ASSERT_EQ(status , PEP_STATUS_OK); diff --git a/test/test_mails/check_reset_all_own_grouped_sticky.eml b/test/test_mails/check_reset_all_own_grouped_sticky.eml new file mode 100644 index 000000000..ccf393e30 --- /dev/null +++ b/test/test_mails/check_reset_all_own_grouped_sticky.eml @@ -0,0 +1,284 @@ +Message-ID: +From: Alexander Braithwaite +To: Alexander Braithwaite +Subject: =?utf-8?Q?p=E2=89=A1p?= +In-Reply-To: +X-pEp-Version: 2.1 +pEp-auto-consume: yes +MIME-Version: 1.0 +Content-Type: multipart/encrypted; boundary="238e1f2946e87ccd3d1b58ba507ed7ab"; + protocol="application/pgp-encrypted" + +--238e1f2946e87ccd3d1b58ba507ed7ab +Content-Type: application/pgp-encrypted + +Version: 1 +--238e1f2946e87ccd3d1b58ba507ed7ab +Content-Type: application/octet-stream +Content-Transfer-Encoding: 7bit +Content-Disposition: inline; filename="msg.asc" + +-----BEGIN PGP MESSAGE----- + +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 +=ZYYo +-----END PGP MESSAGE----- + +--238e1f2946e87ccd3d1b58ba507ed7ab--