diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2024-01-09 19:16:55 +0100 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2024-01-09 19:16:55 +0100 |
commit | 184328ebcf100496d8b6df0cc570c773a2203a2e (patch) | |
tree | 11170ed6cfb1c91cd3a8fa5cb3815d4e4978880d /src/imap | |
parent | 6e798b90f590e21bb68535f0431fc547e5e2390c (diff) | |
download | aerogramme-184328ebcf100496d8b6df0cc570c773a2203a2e.tar.gz aerogramme-184328ebcf100496d8b6df0cc570c773a2203a2e.zip |
Optional Parameters with the SELECT/EXAMINE Commands
See: https://datatracker.ietf.org/doc/html/rfc4466#section-2.4
Diffstat (limited to 'src/imap')
-rw-r--r-- | src/imap/capability.rs | 18 | ||||
-rw-r--r-- | src/imap/command/authenticated.rs | 14 |
2 files changed, 29 insertions, 3 deletions
diff --git a/src/imap/capability.rs b/src/imap/capability.rs index d88673c..be1d4b6 100644 --- a/src/imap/capability.rs +++ b/src/imap/capability.rs @@ -1,4 +1,4 @@ -use imap_codec::imap_types::core::NonEmptyVec; +use imap_codec::imap_types::core::{Atom, NonEmptyVec}; use imap_codec::imap_types::extensions::enable::{CapabilityEnable, Utf8Kind}; use imap_codec::imap_types::response::Capability; use std::collections::HashSet; @@ -48,6 +48,7 @@ impl ServerCapability { } } +#[derive(Clone)] pub enum ClientStatus { NotSupportedByServer, Disabled, @@ -57,6 +58,13 @@ impl ClientStatus { pub fn is_enabled(&self) -> bool { matches!(self, Self::Enabled) } + + pub fn enable(&self) -> Self { + match self { + Self::Disabled => Self::Enabled, + other => other.clone(), + } + } } @@ -76,6 +84,14 @@ impl ClientCapability { } } + pub fn select_enable(&mut self, atoms: &[Atom]) { + for at in atoms.iter() { + if at.as_ref().to_uppercase() == "CONDSTORE" { + self.condstore = self.condstore.enable(); + } + } + } + pub fn try_enable( &mut self, caps: &[CapabilityEnable<'static>], diff --git a/src/imap/command/authenticated.rs b/src/imap/command/authenticated.rs index 954e758..5af8e98 100644 --- a/src/imap/command/authenticated.rs +++ b/src/imap/command/authenticated.rs @@ -58,8 +58,8 @@ pub async fn dispatch<'a>( } => ctx.status(mailbox, item_names).await, CommandBody::Subscribe { mailbox } => ctx.subscribe(mailbox).await, CommandBody::Unsubscribe { mailbox } => ctx.unsubscribe(mailbox).await, - CommandBody::Select { mailbox } => ctx.select(mailbox).await, - CommandBody::Examine { mailbox } => ctx.examine(mailbox).await, + CommandBody::Select { mailbox, parameters } => ctx.select(mailbox, parameters).await, + CommandBody::Examine { mailbox, parameters } => ctx.examine(mailbox, parameters).await, CommandBody::Append { mailbox, flags, @@ -421,7 +421,12 @@ impl<'a> AuthenticatedContext<'a> { async fn select( self, mailbox: &MailboxCodec<'a>, + parameters: &Option<NonEmptyVec<Atom<'a>>>, ) -> Result<(Response<'static>, flow::Transition)> { + parameters.as_ref().map(|plist| + self.client_capabilities.select_enable(plist.as_ref()) + ); + let name: &str = MailboxName(mailbox).try_into()?; let mb_opt = self.user.open_mailbox(&name).await?; @@ -456,7 +461,12 @@ impl<'a> AuthenticatedContext<'a> { async fn examine( self, mailbox: &MailboxCodec<'a>, + parameters: &Option<NonEmptyVec<Atom<'a>>>, ) -> Result<(Response<'static>, flow::Transition)> { + parameters.as_ref().map(|plist| + self.client_capabilities.select_enable(plist.as_ref()) + ); + let name: &str = MailboxName(mailbox).try_into()?; let mb_opt = self.user.open_mailbox(&name).await?; |