mirror of
https://github.com/chatmail/core.git
synced 2026-04-28 19:06:35 +03:00
Resultify Peerstate::from_addr
This commit is contained in:
committed by
link2xt
parent
3577491b31
commit
cfd222a109
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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?;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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?;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user