From ee6d16f1b16cf09ec33e584ffb3eae7318a814e8 Mon Sep 17 00:00:00 2001 From: holger krekel Date: Tue, 1 Oct 2019 00:20:08 +0200 Subject: [PATCH] on some call sites: peerstate.save_to_db() should bubble up errors instead of crashing. also write a test that double-creation of an addr-row is fine. --- src/dc_receive_imf.rs | 2 +- src/e2ee.rs | 6 +++--- src/peerstate.rs | 45 ++++++++++++++++++++++++++++++++++++++----- src/sql.rs | 2 +- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index 5a6a40e8d..2a0d5c97d 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1672,7 +1672,7 @@ fn check_verified_properties( let fp = peerstate.gossip_key_fingerprint.clone(); if let Some(fp) = fp { peerstate.set_verified(0, &fp, 2); - peerstate.save_to_db(&context.sql, false).unwrap(); + peerstate.save_to_db(&context.sql, false)?; is_verified = true; } } diff --git a/src/e2ee.rs b/src/e2ee.rs index e5d78e3a8..4841af6ea 100644 --- a/src/e2ee.rs +++ b/src/e2ee.rs @@ -284,16 +284,16 @@ pub fn try_decrypt( if let Some(ref mut peerstate) = peerstate { if let Some(ref header) = autocryptheader { peerstate.apply_header(&header, message_time); - peerstate.save_to_db(&context.sql, false).unwrap(); + peerstate.save_to_db(&context.sql, false)?; } else if message_time > peerstate.last_seen_autocrypt && !contains_report(in_out_message) { peerstate.degrade_encryption(message_time); - peerstate.save_to_db(&context.sql, false).unwrap(); + peerstate.save_to_db(&context.sql, false)?; } } else if let Some(ref header) = autocryptheader { let p = Peerstate::from_header(context, header, message_time); - p.save_to_db(&context.sql, true).unwrap(); + p.save_to_db(&context.sql, true)?; peerstate = Some(p); } } diff --git a/src/peerstate.rs b/src/peerstate.rs index 6a5e21815..1365267e0 100644 --- a/src/peerstate.rs +++ b/src/peerstate.rs @@ -400,7 +400,8 @@ impl<'a> Peerstate<'a> { &self.verified_key_fingerprint, &self.addr, ], - )? + )?; + reset_gossiped_timestamp(self.context, 0); } else if self.to_save == Some(ToSave::Timestamps) { sql::execute( self.context, @@ -416,10 +417,6 @@ impl<'a> Peerstate<'a> { )?; } - if self.to_save == Some(ToSave::All) || create { - reset_gossiped_timestamp(self.context, 0); - } - Ok(()) } @@ -487,6 +484,44 @@ mod tests { assert_eq!(peerstate, peerstate_new2); } + #[test] + fn test_peerstate_double_create() { + let ctx = crate::test_utils::dummy_context(); + let addr = "hello@mail.com"; + + let pub_key = crate::key::Key::from_base64( + include_str!("../test-data/key/public.asc"), + KeyType::Public, + ) + .unwrap(); + + let peerstate = Peerstate { + context: &ctx.ctx, + addr: Some(addr.into()), + last_seen: 10, + last_seen_autocrypt: 11, + prefer_encrypt: EncryptPreference::Mutual, + public_key: Some(pub_key.clone()), + public_key_fingerprint: Some(pub_key.fingerprint()), + gossip_key: None, + gossip_timestamp: 12, + gossip_key_fingerprint: None, + verified_key: None, + verified_key_fingerprint: None, + to_save: Some(ToSave::All), + degrade_event: None, + }; + + assert!( + peerstate.save_to_db(&ctx.ctx.sql, true).is_ok(), + "failed to save" + ); + assert!( + peerstate.save_to_db(&ctx.ctx.sql, true).is_ok(), + "double-call with create failed" + ); + } + #[test] fn test_peerstate_with_empty_gossip_key_save_to_db() { let ctx = crate::test_utils::dummy_context(); diff --git a/src/sql.rs b/src/sql.rs index 22607c4cc..e4daf6a50 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -794,7 +794,7 @@ fn open( if let Some(ref mut peerstate) = Peerstate::from_addr(context, sql, &addr?) { peerstate.recalc_fingerprint(); - peerstate.save_to_db(sql, false).unwrap(); + peerstate.save_to_db(sql, false)?; } } Ok(())