diff options
Diffstat (limited to 'crates/pop3/src/op')
-rw-r--r-- | crates/pop3/src/op/authenticate.rs | 35 | ||||
-rw-r--r-- | crates/pop3/src/op/delete.rs | 13 | ||||
-rw-r--r-- | crates/pop3/src/op/fetch.rs | 6 | ||||
-rw-r--r-- | crates/pop3/src/op/mod.rs | 4 |
4 files changed, 37 insertions, 21 deletions
diff --git a/crates/pop3/src/op/authenticate.rs b/crates/pop3/src/op/authenticate.rs index fe7ca09d..1924d4f2 100644 --- a/crates/pop3/src/op/authenticate.rs +++ b/crates/pop3/src/op/authenticate.rs @@ -4,10 +4,15 @@ * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL */ -use common::listener::{limiter::ConcurrencyLimiter, SessionStream}; +use common::{ + listener::{limiter::ConcurrencyLimiter, SessionStream}, + ConcurrencyLimiters, +}; use directory::Permission; use imap::op::authenticate::{decode_challenge_oauth, decode_challenge_plain}; -use jmap::auth::rate_limit::ConcurrencyLimiters; +use jmap::auth::{ + authenticate::Authenticator, oauth::token::TokenHandler, rate_limit::RateLimiter, +}; use mail_parser::decoders::base64::base64_decode; use mail_send::Credentials; use std::sync::Arc; @@ -60,22 +65,22 @@ impl<T: SessionStream> Session<T> { pub async fn handle_auth(&mut self, credentials: Credentials<String>) -> trc::Result<()> { // Throttle authentication requests - self.jmap.is_auth_allowed_soft(&self.remote_addr).await?; + self.server.is_auth_allowed_soft(&self.remote_addr).await?; // Authenticate let access_token = match credentials { Credentials::Plain { username, secret } | Credentials::XOauth2 { username, secret } => { - self.jmap + self.server .authenticate_plain(&username, &secret, self.remote_addr, self.session_id) .await } Credentials::OAuthBearer { token } => { match self - .jmap + .server .validate_access_token("access_token", &token) .await { - Ok((account_id, _, _)) => self.jmap.core.get_access_token(account_id).await, + Ok((account_id, _, _)) => self.server.get_access_token(account_id).await, Err(err) => Err(err), } } @@ -86,7 +91,7 @@ impl<T: SessionStream> Session<T> { State::NotAuthenticated { auth_failures, username, - } if *auth_failures < self.jmap.core.imap.max_auth_failures => { + } if *auth_failures < self.server.core.imap.max_auth_failures => { self.state = State::NotAuthenticated { auth_failures: auth_failures + 1, username: username.clone(), @@ -118,7 +123,7 @@ impl<T: SessionStream> Session<T> { // Cache access token let access_token = Arc::new(access_token); - self.jmap.core.cache_access_token(access_token.clone()); + self.server.cache_access_token(access_token.clone()); // Fetch mailbox let mailbox = self.fetch_mailbox(access_token.primary_id()).await?; @@ -133,9 +138,11 @@ impl<T: SessionStream> Session<T> { } pub fn get_concurrency_limiter(&self, account_id: u32) -> Option<Arc<ConcurrencyLimiters>> { - let rate = self.jmap.core.imap.rate_concurrent?; - self.imap - .rate_limiter + let rate = self.server.core.imap.rate_concurrent?; + self.server + .inner + .data + .imap_limiter .get(&account_id) .map(|limiter| limiter.clone()) .unwrap_or_else(|| { @@ -143,7 +150,11 @@ impl<T: SessionStream> Session<T> { concurrent_requests: ConcurrencyLimiter::new(rate), concurrent_uploads: ConcurrencyLimiter::new(rate), }); - self.imap.rate_limiter.insert(account_id, limiter.clone()); + self.server + .inner + .data + .imap_limiter + .insert(account_id, limiter.clone()); limiter }) .into() diff --git a/crates/pop3/src/op/delete.rs b/crates/pop3/src/op/delete.rs index 4e7799b2..e8b53c49 100644 --- a/crates/pop3/src/op/delete.rs +++ b/crates/pop3/src/op/delete.rs @@ -8,6 +8,9 @@ use std::time::Instant; use common::listener::SessionStream; use directory::Permission; +use jmap::{ + changes::write::ChangeLog, email::delete::EmailDeletion, services::state::StateManager, +}; use jmap_proto::types::{state::StateChange, type_state::DataType}; use store::roaring::RoaringBitmap; use trc::AddContext; @@ -87,16 +90,18 @@ impl<T: SessionStream> Session<T> { if !deleted.is_empty() { let num_deleted = deleted.len(); let (changes, not_deleted) = self - .jmap + .server .emails_tombstone(mailbox.account_id, deleted) .await .caused_by(trc::location!())?; if !changes.is_empty() { - if let Ok(change_id) = - self.jmap.commit_changes(mailbox.account_id, changes).await + if let Ok(change_id) = self + .server + .commit_changes(mailbox.account_id, changes) + .await { - self.jmap + self.server .broadcast_state_change( StateChange::new(mailbox.account_id) .with_change(DataType::Email, change_id) diff --git a/crates/pop3/src/op/fetch.rs b/crates/pop3/src/op/fetch.rs index be322723..9d58cf45 100644 --- a/crates/pop3/src/op/fetch.rs +++ b/crates/pop3/src/op/fetch.rs @@ -8,7 +8,7 @@ use std::time::Instant; use common::listener::SessionStream; use directory::Permission; -use jmap::email::metadata::MessageMetadata; +use jmap::{blob::download::BlobDownload, email::metadata::MessageMetadata, JmapMethods}; use jmap_proto::types::{collection::Collection, property::Property}; use store::write::Bincode; use trc::AddContext; @@ -26,7 +26,7 @@ impl<T: SessionStream> Session<T> { let mailbox = self.state.mailbox(); if let Some(message) = mailbox.messages.get(msg.saturating_sub(1) as usize) { if let Some(metadata) = self - .jmap + .server .get_property::<Bincode<MessageMetadata>>( mailbox.account_id, Collection::Email, @@ -37,7 +37,7 @@ impl<T: SessionStream> Session<T> { .caused_by(trc::location!())? { if let Some(bytes) = self - .jmap + .server .get_blob(&metadata.inner.blob_hash, 0..usize::MAX) .await .caused_by(trc::location!())? diff --git a/crates/pop3/src/op/mod.rs b/crates/pop3/src/op/mod.rs index 0488caa8..bfc1db7d 100644 --- a/crates/pop3/src/op/mod.rs +++ b/crates/pop3/src/op/mod.rs @@ -18,7 +18,7 @@ pub mod list; impl<T: SessionStream> Session<T> { pub async fn handle_capa(&mut self) -> trc::Result<()> { - let mechanisms = if self.stream.is_tls() || self.jmap.core.imap.allow_plain_auth { + let mechanisms = if self.stream.is_tls() || self.server.core.imap.allow_plain_auth { vec![Mechanism::Plain, Mechanism::OAuthBearer] } else { vec![Mechanism::OAuthBearer] @@ -28,7 +28,7 @@ impl<T: SessionStream> Session<T> { Pop3(trc::Pop3Event::Capabilities), SpanId = self.session_id, Tls = self.stream.is_tls(), - Strict = !self.jmap.core.imap.allow_plain_auth, + Strict = !self.server.core.imap.allow_plain_auth, Elapsed = trc::Value::Duration(0) ); |