diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 60e3c381..39cc2e74 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -56,7 +56,7 @@ use std::hash::Hasher; use std::pin::Pin; use std::str::FromStr; use std::sync::{Arc, Mutex, RwLock}; -use std::time::{Duration, Instant}; +use std::time::{Duration, SystemTime}; pub type ImapNum = usize; pub type UID = ImapNum; @@ -167,7 +167,7 @@ pub struct UIDStore { reverse_modseq: Arc>>>, highestmodseqs: Arc>>>, mailboxes: Arc>>, - is_online: Arc)>>, + is_online: Arc)>>, event_consumer: BackendEventConsumer, timeout: Option, } @@ -197,7 +197,7 @@ impl UIDStore { mailboxes: Arc::new(FutureMutex::new(Default::default())), tag_index: Arc::new(RwLock::new(Default::default())), is_online: Arc::new(Mutex::new(( - Instant::now(), + SystemTime::now(), Err(MeliError::new("Account is uninitialised.")), ))), event_consumer, diff --git a/melib/src/backends/imap/connection.rs b/melib/src/backends/imap/connection.rs index d13a5b7d..49f9a59d 100644 --- a/melib/src/backends/imap/connection.rs +++ b/melib/src/backends/imap/connection.rs @@ -34,7 +34,9 @@ use std::future::Future; use std::iter::FromIterator; use std::pin::Pin; use std::sync::Arc; -use std::time::{Duration, Instant}; +use std::time::{Duration, Instant, SystemTime}; + +const IMAP_PROTOCOL_TIMEOUT: Duration = Duration::from_secs(60 * 28); use super::protocol_parser; use super::{Capabilities, ImapServerConf, UIDStore}; @@ -540,8 +542,8 @@ impl ImapConnection { pub fn connect<'a>(&'a mut self) -> Pin> + Send + 'a>> { Box::pin(async move { - if let (instant, ref mut status @ Ok(())) = *self.uid_store.is_online.lock().unwrap() { - if Instant::now().duration_since(instant) >= Duration::new(60 * 30, 0) { + if let (time, ref mut status @ Ok(())) = *self.uid_store.is_online.lock().unwrap() { + if SystemTime::now().duration_since(time).unwrap_or_default() >= IMAP_PROTOCOL_TIMEOUT { let err = MeliError::new("Connection timed out").set_kind(ErrorKind::Timeout); *status = Err(err.clone()); self.stream = Err(err); @@ -569,7 +571,7 @@ impl ImapConnection { if let Err(err) = new_stream.as_ref() { self.uid_store.is_online.lock().unwrap().1 = Err(err.clone()); } else { - *self.uid_store.is_online.lock().unwrap() = (Instant::now(), Ok(())); + *self.uid_store.is_online.lock().unwrap() = (SystemTime::now(), Ok(())); } let (capabilities, stream) = new_stream?; self.stream = Ok(stream); @@ -654,7 +656,7 @@ impl ImapConnection { let mut response = Vec::new(); ret.clear(); self.stream.as_mut()?.read_response(&mut response).await?; - *self.uid_store.is_online.lock().unwrap() = (Instant::now(), Ok(())); + *self.uid_store.is_online.lock().unwrap() = (SystemTime::now(), Ok(())); match self.server_conf.protocol { ImapProtocol::IMAP { .. } => { @@ -756,7 +758,7 @@ impl ImapConnection { } Err(err) } else { - *self.uid_store.is_online.lock().unwrap() = (Instant::now(), Ok(())); + *self.uid_store.is_online.lock().unwrap() = (SystemTime::now(), Ok(())); Ok(()) } } @@ -1052,7 +1054,7 @@ impl ImapBlockingConnection { async fn read( conn: &mut ImapBlockingConnection, break_flag: &mut bool, - prev_failure: &mut Option, + prev_failure: &mut Option, ) -> Option> { let ImapBlockingConnection { ref mut prev_res_length, @@ -1080,7 +1082,7 @@ async fn read( debug!(&_err); *err = Some(Into::::into(_err).set_kind(crate::error::ErrorKind::Network)); *break_flag = true; - *prev_failure = Some(Instant::now()); + *prev_failure = Some(SystemTime::now()); } } None diff --git a/melib/src/backends/imap/managesieve.rs b/melib/src/backends/imap/managesieve.rs index 97f67655..4eb36955 100644 --- a/melib/src/backends/imap/managesieve.rs +++ b/melib/src/backends/imap/managesieve.rs @@ -29,7 +29,7 @@ use nom::{ }; use std::str::FromStr; use std::sync::{Arc, Mutex}; -use std::time::Instant; +use std::time::SystemTime; pub fn managesieve_capabilities(input: &[u8]) -> Result> { let (_, ret) = separated_nonempty_list( @@ -115,7 +115,7 @@ pub fn new_managesieve_connection( }; let uid_store = Arc::new(UIDStore { is_online: Arc::new(Mutex::new(( - Instant::now(), + SystemTime::now(), Err(MeliError::new("Account is uninitialised.")), ))), ..UIDStore::new(