CONDSTORE #71

Merged
quentin merged 21 commits from feat/condstore-try-2 into main 2024-01-15 07:07:07 +00:00
4 changed files with 33 additions and 7 deletions
Showing only changes of commit 184328ebcf - Show all commits

2
Cargo.lock generated
View file

@ -1807,7 +1807,6 @@ dependencies = [
[[package]] [[package]]
name = "imap-codec" name = "imap-codec"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/duesee/imap-codec?branch=v2#1f490146bb6197eee6032205e3aa7f297efd9b39"
dependencies = [ dependencies = [
"abnf-core", "abnf-core",
"base64 0.21.5", "base64 0.21.5",
@ -1834,7 +1833,6 @@ dependencies = [
[[package]] [[package]]
name = "imap-types" name = "imap-types"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/duesee/imap-codec?branch=v2#1f490146bb6197eee6032205e3aa7f297efd9b39"
dependencies = [ dependencies = [
"base64 0.21.5", "base64 0.21.5",
"bounded-static", "bounded-static",

View file

@ -64,8 +64,10 @@ imap-flow = { git = "https://github.com/duesee/imap-flow.git", rev = "e45ce7bb6a
[dev-dependencies] [dev-dependencies]
[patch.crates-io] [patch.crates-io]
imap-types = { git = "https://github.com/duesee/imap-codec", branch = "v2" } #imap-types = { git = "https://github.com/duesee/imap-codec", branch = "v2" }
imap-codec = { git = "https://github.com/duesee/imap-codec", branch = "v2" } #imap-codec = { git = "https://github.com/duesee/imap-codec", branch = "v2" }
imap-types = { path = "../../imap-codec/imap-types" }
imap-codec = { path = "../../imap-codec/imap-codec" }
[[test]] [[test]]
name = "behavior" name = "behavior"

View file

@ -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::extensions::enable::{CapabilityEnable, Utf8Kind};
use imap_codec::imap_types::response::Capability; use imap_codec::imap_types::response::Capability;
use std::collections::HashSet; use std::collections::HashSet;
@ -48,6 +48,7 @@ impl ServerCapability {
} }
} }
#[derive(Clone)]
pub enum ClientStatus { pub enum ClientStatus {
NotSupportedByServer, NotSupportedByServer,
Disabled, Disabled,
@ -57,6 +58,13 @@ impl ClientStatus {
pub fn is_enabled(&self) -> bool { pub fn is_enabled(&self) -> bool {
matches!(self, Self::Enabled) 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( pub fn try_enable(
&mut self, &mut self,
caps: &[CapabilityEnable<'static>], caps: &[CapabilityEnable<'static>],

View file

@ -58,8 +58,8 @@ pub async fn dispatch<'a>(
} => ctx.status(mailbox, item_names).await, } => ctx.status(mailbox, item_names).await,
CommandBody::Subscribe { mailbox } => ctx.subscribe(mailbox).await, CommandBody::Subscribe { mailbox } => ctx.subscribe(mailbox).await,
CommandBody::Unsubscribe { mailbox } => ctx.unsubscribe(mailbox).await, CommandBody::Unsubscribe { mailbox } => ctx.unsubscribe(mailbox).await,
CommandBody::Select { mailbox } => ctx.select(mailbox).await, CommandBody::Select { mailbox, parameters } => ctx.select(mailbox, parameters).await,
CommandBody::Examine { mailbox } => ctx.examine(mailbox).await, CommandBody::Examine { mailbox, parameters } => ctx.examine(mailbox, parameters).await,
CommandBody::Append { CommandBody::Append {
mailbox, mailbox,
flags, flags,
@ -421,7 +421,12 @@ impl<'a> AuthenticatedContext<'a> {
async fn select( async fn select(
self, self,
mailbox: &MailboxCodec<'a>, mailbox: &MailboxCodec<'a>,
parameters: &Option<NonEmptyVec<Atom<'a>>>,
) -> Result<(Response<'static>, flow::Transition)> { ) -> 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 name: &str = MailboxName(mailbox).try_into()?;
let mb_opt = self.user.open_mailbox(&name).await?; let mb_opt = self.user.open_mailbox(&name).await?;
@ -456,7 +461,12 @@ impl<'a> AuthenticatedContext<'a> {
async fn examine( async fn examine(
self, self,
mailbox: &MailboxCodec<'a>, mailbox: &MailboxCodec<'a>,
parameters: &Option<NonEmptyVec<Atom<'a>>>,
) -> Result<(Response<'static>, flow::Transition)> { ) -> 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 name: &str = MailboxName(mailbox).try_into()?;
let mb_opt = self.user.open_mailbox(&name).await?; let mb_opt = self.user.open_mailbox(&name).await?;