mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
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.
This commit is contained in:
committed by
Floris Bruynooghe
parent
22d2097132
commit
ee6d16f1b1
@@ -1672,7 +1672,7 @@ fn check_verified_properties(
|
|||||||
let fp = peerstate.gossip_key_fingerprint.clone();
|
let fp = peerstate.gossip_key_fingerprint.clone();
|
||||||
if let Some(fp) = fp {
|
if let Some(fp) = fp {
|
||||||
peerstate.set_verified(0, &fp, 2);
|
peerstate.set_verified(0, &fp, 2);
|
||||||
peerstate.save_to_db(&context.sql, false).unwrap();
|
peerstate.save_to_db(&context.sql, false)?;
|
||||||
is_verified = true;
|
is_verified = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -284,16 +284,16 @@ pub fn try_decrypt(
|
|||||||
if let Some(ref mut peerstate) = peerstate {
|
if let Some(ref mut peerstate) = peerstate {
|
||||||
if let Some(ref header) = autocryptheader {
|
if let Some(ref header) = autocryptheader {
|
||||||
peerstate.apply_header(&header, message_time);
|
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
|
} else if message_time > peerstate.last_seen_autocrypt
|
||||||
&& !contains_report(in_out_message)
|
&& !contains_report(in_out_message)
|
||||||
{
|
{
|
||||||
peerstate.degrade_encryption(message_time);
|
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 {
|
} else if let Some(ref header) = autocryptheader {
|
||||||
let p = Peerstate::from_header(context, header, message_time);
|
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);
|
peerstate = Some(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -400,7 +400,8 @@ impl<'a> Peerstate<'a> {
|
|||||||
&self.verified_key_fingerprint,
|
&self.verified_key_fingerprint,
|
||||||
&self.addr,
|
&self.addr,
|
||||||
],
|
],
|
||||||
)?
|
)?;
|
||||||
|
reset_gossiped_timestamp(self.context, 0);
|
||||||
} else if self.to_save == Some(ToSave::Timestamps) {
|
} else if self.to_save == Some(ToSave::Timestamps) {
|
||||||
sql::execute(
|
sql::execute(
|
||||||
self.context,
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,6 +484,44 @@ mod tests {
|
|||||||
assert_eq!(peerstate, peerstate_new2);
|
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]
|
#[test]
|
||||||
fn test_peerstate_with_empty_gossip_key_save_to_db() {
|
fn test_peerstate_with_empty_gossip_key_save_to_db() {
|
||||||
let ctx = crate::test_utils::dummy_context();
|
let ctx = crate::test_utils::dummy_context();
|
||||||
|
|||||||
@@ -794,7 +794,7 @@ fn open(
|
|||||||
if let Some(ref mut peerstate) = Peerstate::from_addr(context, sql, &addr?)
|
if let Some(ref mut peerstate) = Peerstate::from_addr(context, sql, &addr?)
|
||||||
{
|
{
|
||||||
peerstate.recalc_fingerprint();
|
peerstate.recalc_fingerprint();
|
||||||
peerstate.save_to_db(sql, false).unwrap();
|
peerstate.save_to_db(sql, false)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user