Resultify Peerstate::from_addr

This commit is contained in:
Alexander Krotov
2020-08-05 00:00:00 +03:00
committed by link2xt
parent 3577491b31
commit cfd222a109
8 changed files with 38 additions and 23 deletions

View File

@@ -678,7 +678,7 @@ impl Contact {
let mut ret = String::new(); let mut ret = String::new();
if let Ok(contact) = Contact::load_from_db(context, contact_id).await { 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; let loginparam = LoginParam::from_database(context, "configured_").await;
if peerstate.is_some() 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 let Some(ps) = peerstate {
if ps.verified_key.is_some() { if ps.verified_key.is_some() {
return VerifiedStatus::BidirectVerified; return VerifiedStatus::BidirectVerified;

View File

@@ -1618,7 +1618,7 @@ async fn check_verified_properties(
// this check is skipped for SELF as there is no proper SELF-peerstate // this check is skipped for SELF as there is no proper SELF-peerstate
// and results in group-splits otherwise. // and results in group-splits otherwise.
if from_id != DC_CONTACT_ID_SELF { 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() if peerstate.is_none()
|| contact.is_verified_ex(context, peerstate.as_ref()).await || 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 context.is_self_addr(&to_addr).await
); );
let mut is_verified = _is_verified != 0; 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 // mark gossiped keys (if any) as verified
if mimeparser.gossipped_addr.contains(&to_addr) { if mimeparser.gossipped_addr.contains(&to_addr) {

View File

@@ -140,7 +140,7 @@ pub async fn try_decrypt(
let autocryptheader = Aheader::from_headers(context, &from, &mail.headers); let autocryptheader = Aheader::from_headers(context, &from, &mail.headers);
if message_time > 0 { 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 mut peerstate) = peerstate {
if let Some(ref header) = autocryptheader { if let Some(ref header) = autocryptheader {
@@ -163,7 +163,7 @@ pub async fn try_decrypt(
let mut signatures = HashSet::default(); let mut signatures = HashSet::default();
if peerstate.as_ref().map(|p| p.last_seen).unwrap_or_else(|| 0) == 0 { 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 let Some(peerstate) = peerstate {
if peerstate.degrade_event.is_some() { if peerstate.degrade_event.is_some() {

View File

@@ -221,7 +221,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
.filter(|(_, addr)| addr != &self_addr) .filter(|(_, addr)| addr != &self_addr)
{ {
res.push(( res.push((
Peerstate::from_addr(self.context, addr).await, Peerstate::from_addr(self.context, addr).await?,
addr.as_str(), addr.as_str(),
)); ));
} }

View File

@@ -1036,7 +1036,7 @@ async fn update_gossip_peerstates(
.iter() .iter()
.any(|info| info.addr == header.addr.to_lowercase()) .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 { if let Some(ref mut peerstate) = peerstate {
peerstate.apply_gossip(header, message_time); peerstate.apply_gossip(header, message_time);
peerstate.save_to_db(&context.sql, false).await?; peerstate.save_to_db(&context.sql, false).await?;

View File

@@ -143,22 +143,13 @@ impl<'a> Peerstate<'a> {
res res
} }
pub async fn from_addr(context: &'a Context, addr: &str) -> Option<Peerstate<'a>> { pub async fn from_addr(context: &'a Context, addr: &str) -> Result<Option<Peerstate<'a>>> {
let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \ let query = "SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, \
gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \ gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, \
verified_key, verified_key_fingerprint \ verified_key, verified_key_fingerprint \
FROM acpeerstates \ FROM acpeerstates \
WHERE addr=? COLLATE NOCASE;"; WHERE addr=? COLLATE NOCASE;";
match Self::from_stmt(context, query, paramsv![addr]).await { Self::from_stmt(context, query, paramsv![addr]).await
Ok(peerstate) => peerstate,
Err(err) => {
warn!(
context,
"Can't load peerstate for address {}: {}", addr, err
);
None
}
}
} }
pub async fn from_fingerprint( pub async fn from_fingerprint(
@@ -524,7 +515,8 @@ mod tests {
let peerstate_new = Peerstate::from_addr(&ctx.ctx, addr) let peerstate_new = Peerstate::from_addr(&ctx.ctx, addr)
.await .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 // clear to_save, as that is not persissted
peerstate.to_save = None; peerstate.to_save = None;
@@ -604,7 +596,7 @@ mod tests {
// clear to_save, as that is not persissted // clear to_save, as that is not persissted
peerstate.to_save = None; peerstate.to_save = None;
assert_eq!(peerstate, peerstate_new); assert_eq!(Some(peerstate), peerstate_new);
} }
// TODO: don't copy this from stress.rs // TODO: don't copy this from stress.rs

View File

@@ -366,7 +366,20 @@ async fn fingerprint_equals_sender(
) -> bool { ) -> bool {
if let [contact_id] = chat::get_chat_contacts(context, contact_chat_id).await[..] { 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 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() if peerstate.public_key_fingerprint.is_some()
&& fingerprint == peerstate.public_key_fingerprint.as_ref().unwrap() && fingerprint == peerstate.public_key_fingerprint.as_ref().unwrap()
{ {

View File

@@ -1303,7 +1303,7 @@ async fn open(
) )
.await?; .await?;
for addr in &addrs { 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.recalc_fingerprint();
peerstate.save_to_db(sql, false).await?; peerstate.save_to_db(sql, false).await?;
} }