summaryrefslogtreecommitdiff
path: root/crates/pop3/src/op
diff options
context:
space:
mode:
Diffstat (limited to 'crates/pop3/src/op')
-rw-r--r--crates/pop3/src/op/authenticate.rs35
-rw-r--r--crates/pop3/src/op/delete.rs13
-rw-r--r--crates/pop3/src/op/fetch.rs6
-rw-r--r--crates/pop3/src/op/mod.rs4
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)
);