diff --git a/src/contact.rs b/src/contact.rs index 27ea3a628..1fe9451fc 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -678,7 +678,7 @@ impl Contact { let mut ret = String::new(); if let Ok(contact) = Contact::load_from_db(context, contact_id).await { - let peerstate = Peerstate::from_addr(context, &contact.addr).await; + let peerstate = Peerstate::from_addr(context, &contact.addr).await?; let loginparam = LoginParam::from_database(context, "configured_").await; if peerstate.is_some() @@ -939,7 +939,17 @@ impl Contact { } } - let peerstate = Peerstate::from_addr(context, &self.addr).await; + let peerstate = match Peerstate::from_addr(context, &self.addr).await { + Ok(peerstate) => peerstate, + Err(err) => { + warn!( + context, + "Failed to load peerstate for address {}: {}", self.addr, err + ); + return VerifiedStatus::Unverified; + } + }; + if let Some(ps) = peerstate { if ps.verified_key.is_some() { return VerifiedStatus::BidirectVerified; diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index fb6661bbb..7d0100a23 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1618,7 +1618,7 @@ async fn check_verified_properties( // this check is skipped for SELF as there is no proper SELF-peerstate // and results in group-splits otherwise. if from_id != DC_CONTACT_ID_SELF { - let peerstate = Peerstate::from_addr(context, contact.get_addr()).await; + let peerstate = Peerstate::from_addr(context, contact.get_addr()).await?; if peerstate.is_none() || contact.is_verified_ex(context, peerstate.as_ref()).await @@ -1672,7 +1672,7 @@ async fn check_verified_properties( context.is_self_addr(&to_addr).await ); let mut is_verified = _is_verified != 0; - let peerstate = Peerstate::from_addr(context, &to_addr).await; + let peerstate = Peerstate::from_addr(context, &to_addr).await?; // mark gossiped keys (if any) as verified if mimeparser.gossipped_addr.contains(&to_addr) { diff --git a/src/e2ee.rs b/src/e2ee.rs index 70e400e7b..d683fbdfc 100644 --- a/src/e2ee.rs +++ b/src/e2ee.rs @@ -140,7 +140,7 @@ pub async fn try_decrypt( let autocryptheader = Aheader::from_headers(context, &from, &mail.headers); if message_time > 0 { - peerstate = Peerstate::from_addr(context, &from).await; + peerstate = Peerstate::from_addr(context, &from).await?; if let Some(ref mut peerstate) = peerstate { if let Some(ref header) = autocryptheader { @@ -163,7 +163,7 @@ pub async fn try_decrypt( let mut signatures = HashSet::default(); if peerstate.as_ref().map(|p| p.last_seen).unwrap_or_else(|| 0) == 0 { - peerstate = Peerstate::from_addr(&context, &from).await; + peerstate = Peerstate::from_addr(&context, &from).await?; } if let Some(peerstate) = peerstate { if peerstate.degrade_event.is_some() { diff --git a/src/mimefactory.rs b/src/mimefactory.rs index bdfa58174..b84048ac2 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -221,7 +221,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> { .filter(|(_, addr)| addr != &self_addr) { res.push(( - Peerstate::from_addr(self.context, addr).await, + Peerstate::from_addr(self.context, addr).await?, addr.as_str(), )); } diff --git a/src/mimeparser.rs b/src/mimeparser.rs index e8e71fa68..66c875e06 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -1036,7 +1036,7 @@ async fn update_gossip_peerstates( .iter() .any(|info| info.addr == header.addr.to_lowercase()) { - let mut peerstate = Peerstate::from_addr(context, &header.addr).await; + let mut peerstate = Peerstate::from_addr(context, &header.addr).await?; if let Some(ref mut peerstate) = peerstate { peerstate.apply_gossip(header, message_time); peerstate.save_to_db(&context.sql, false).await?; diff --git a/src/peerstate.rs b/src/peerstate.rs index 1b1e4f2a0..d8369304a 100644 --- a/src/peerstate.rs +++ b/src/peerstate.rs @@ -143,22 +143,13 @@ impl<'a> Peerstate<'a> { res } - pub async fn from_addr(context: &'a Context, addr: &str) -> Option> { + pub async fn from_addr(context: &'a Context, addr: &str) -> Result>> { let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \ gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \ verified_key, verified_key_fingerprint \ FROM acpeerstates \ WHERE addr=? COLLATE NOCASE;"; - match Self::from_stmt(context, query, paramsv![addr]).await { - Ok(peerstate) => peerstate, - Err(err) => { - warn!( - context, - "Can't load peerstate for address {}: {}", addr, err - ); - None - } - } + Self::from_stmt(context, query, paramsv![addr]).await } pub async fn from_fingerprint( @@ -524,7 +515,8 @@ mod tests { let peerstate_new = Peerstate::from_addr(&ctx.ctx, addr) .await - .expect("failed to load peerstate from db"); + .expect("failed to load peerstate from db") + .expect("no peerstate found in the database"); // clear to_save, as that is not persissted peerstate.to_save = None; @@ -604,7 +596,7 @@ mod tests { // clear to_save, as that is not persissted peerstate.to_save = None; - assert_eq!(peerstate, peerstate_new); + assert_eq!(Some(peerstate), peerstate_new); } // TODO: don't copy this from stress.rs diff --git a/src/securejoin.rs b/src/securejoin.rs index ef2901ef3..5979da87e 100644 --- a/src/securejoin.rs +++ b/src/securejoin.rs @@ -366,7 +366,20 @@ async fn fingerprint_equals_sender( ) -> bool { if let [contact_id] = chat::get_chat_contacts(context, contact_chat_id).await[..] { if let Ok(contact) = Contact::load_from_db(context, contact_id).await { - if let Some(peerstate) = Peerstate::from_addr(context, contact.get_addr()).await { + let peerstate = match Peerstate::from_addr(context, contact.get_addr()).await { + Ok(peerstate) => peerstate, + Err(err) => { + warn!( + context, + "Failed to sender peerstate for {}: {}", + contact.get_addr(), + err + ); + return false; + } + }; + + if let Some(peerstate) = peerstate { if peerstate.public_key_fingerprint.is_some() && fingerprint == peerstate.public_key_fingerprint.as_ref().unwrap() { diff --git a/src/sql.rs b/src/sql.rs index 3af1df87f..53077f248 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -1303,7 +1303,7 @@ async fn open( ) .await?; for addr in &addrs { - if let Some(ref mut peerstate) = Peerstate::from_addr(context, addr).await { + if let Some(ref mut peerstate) = Peerstate::from_addr(context, addr).await? { peerstate.recalc_fingerprint(); peerstate.save_to_db(sql, false).await?; }