aboutsummaryrefslogtreecommitdiff
path: root/src/imap/command
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2024-01-03 12:29:19 +0100
committerQuentin Dufour <quentin@deuxfleurs.fr>2024-01-03 12:29:19 +0100
commit6d37924399dd5d04f5be2506e3e044dd165f6399 (patch)
tree9d6030ed892dbf2518bf5fea5bd323ce9cfed6e8 /src/imap/command
parenta059585cb423d527763ef0131773d6620ebcafd5 (diff)
downloadaerogramme-6d37924399dd5d04f5be2506e3e044dd165f6399.tar.gz
aerogramme-6d37924399dd5d04f5be2506e3e044dd165f6399.zip
rework capability
Diffstat (limited to 'src/imap/command')
-rw-r--r--src/imap/command/anonymous.rs8
-rw-r--r--src/imap/command/anystate.rs14
-rw-r--r--src/imap/command/authenticated.rs6
-rw-r--r--src/imap/command/examined.rs8
-rw-r--r--src/imap/command/selected.rs8
5 files changed, 31 insertions, 13 deletions
diff --git a/src/imap/command/anonymous.rs b/src/imap/command/anonymous.rs
index fbd10e9..fda78c2 100644
--- a/src/imap/command/anonymous.rs
+++ b/src/imap/command/anonymous.rs
@@ -1,10 +1,12 @@
use anyhow::Result;
use imap_codec::imap_types::command::{Command, CommandBody};
use imap_codec::imap_types::core::AString;
+use imap_codec::imap_types::response::Code;
use imap_codec::imap_types::secret::Secret;
use crate::imap::command::anystate;
use crate::imap::flow;
+use crate::imap::capability::ServerCapability;
use crate::imap::response::Response;
use crate::login::ArcLoginProvider;
use crate::mail::user::User;
@@ -13,6 +15,7 @@ use crate::mail::user::User;
pub struct AnonymousContext<'a> {
pub req: &'a Command<'static>,
+ pub server_capabilities: &'a ServerCapability,
pub login_provider: &'a ArcLoginProvider,
}
@@ -20,7 +23,9 @@ pub async fn dispatch(ctx: AnonymousContext<'_>) -> Result<(Response<'static>, f
match &ctx.req.body {
// Any State
CommandBody::Noop => anystate::noop_nothing(ctx.req.tag.clone()),
- CommandBody::Capability => anystate::capability(ctx.req.tag.clone()),
+ CommandBody::Capability => anystate::capability(
+ ctx.req.tag.clone(),
+ ctx.server_capabilities),
CommandBody::Logout => anystate::logout(),
// Specific to anonymous context (3 commands)
@@ -69,6 +74,7 @@ impl<'a> AnonymousContext<'a> {
Ok((
Response::build()
.to_req(self.req)
+ .code(Code::Capability(self.server_capabilities.to_vec()))
.message("Completed")
.ok()?,
flow::Transition::Authenticate(user),
diff --git a/src/imap/command/anystate.rs b/src/imap/command/anystate.rs
index f326852..7d7c0b2 100644
--- a/src/imap/command/anystate.rs
+++ b/src/imap/command/anystate.rs
@@ -1,20 +1,16 @@
use anyhow::Result;
-use imap_codec::imap_types::core::{NonEmptyVec, Tag};
-use imap_codec::imap_types::response::{Capability, Data};
+use imap_codec::imap_types::core::Tag;
+use imap_codec::imap_types::response::Data;
use crate::imap::flow;
+use crate::imap::capability::ServerCapability;
use crate::imap::response::Response;
-pub(crate) fn capability(tag: Tag<'static>) -> Result<(Response<'static>, flow::Transition)> {
- let capabilities: NonEmptyVec<Capability> = (vec![
- Capability::Imap4Rev1,
- Capability::try_from("UNSELECT").unwrap(),
- ])
- .try_into()?;
+pub(crate) fn capability(tag: Tag<'static>, cap: &ServerCapability) -> Result<(Response<'static>, flow::Transition)> {
let res = Response::build()
.tag(tag)
.message("Server capabilities")
- .data(Data::Capability(capabilities))
+ .data(Data::Capability(cap.to_vec()))
.ok()?;
Ok((res, flow::Transition::None))
diff --git a/src/imap/command/authenticated.rs b/src/imap/command/authenticated.rs
index 1bb4c6d..a6a5203 100644
--- a/src/imap/command/authenticated.rs
+++ b/src/imap/command/authenticated.rs
@@ -14,6 +14,7 @@ use crate::imap::command::{anystate, MailboxName};
use crate::imap::flow;
use crate::imap::mailbox_view::MailboxView;
use crate::imap::response::Response;
+use crate::imap::capability::ServerCapability;
use crate::mail::mailbox::Mailbox;
use crate::mail::uidindex::*;
@@ -22,6 +23,7 @@ use crate::mail::IMF;
pub struct AuthenticatedContext<'a> {
pub req: &'a Command<'static>,
+ pub server_capabilities: &'a ServerCapability,
pub user: &'a Arc<User>,
}
@@ -31,7 +33,9 @@ pub async fn dispatch<'a>(
match &ctx.req.body {
// Any state
CommandBody::Noop => anystate::noop_nothing(ctx.req.tag.clone()),
- CommandBody::Capability => anystate::capability(ctx.req.tag.clone()),
+ CommandBody::Capability => anystate::capability(
+ ctx.req.tag.clone(),
+ ctx.server_capabilities),
CommandBody::Logout => anystate::logout(),
// Specific to this state (11 commands)
diff --git a/src/imap/command/examined.rs b/src/imap/command/examined.rs
index 8876297..7cccf7b 100644
--- a/src/imap/command/examined.rs
+++ b/src/imap/command/examined.rs
@@ -11,19 +11,24 @@ use crate::imap::command::{anystate, authenticated};
use crate::imap::flow;
use crate::imap::mailbox_view::MailboxView;
use crate::imap::response::Response;
+use crate::imap::capability::ServerCapability;
use crate::mail::user::User;
pub struct ExaminedContext<'a> {
pub req: &'a Command<'static>,
pub user: &'a Arc<User>,
pub mailbox: &'a mut MailboxView,
+ pub server_capabilities: &'a ServerCapability,
}
pub async fn dispatch(ctx: ExaminedContext<'_>) -> Result<(Response<'static>, flow::Transition)> {
match &ctx.req.body {
// Any State
// noop is specific to this state
- CommandBody::Capability => anystate::capability(ctx.req.tag.clone()),
+ CommandBody::Capability => anystate::capability(
+ ctx.req.tag.clone(),
+ ctx.server_capabilities,
+ ),
CommandBody::Logout => anystate::logout(),
// Specific to the EXAMINE state (specialization of the SELECTED state)
@@ -55,6 +60,7 @@ pub async fn dispatch(ctx: ExaminedContext<'_>) -> Result<(Response<'static>, fl
_ => {
authenticated::dispatch(authenticated::AuthenticatedContext {
req: ctx.req,
+ server_capabilities: ctx.server_capabilities,
user: ctx.user,
})
.await
diff --git a/src/imap/command/selected.rs b/src/imap/command/selected.rs
index 0653226..681b509 100644
--- a/src/imap/command/selected.rs
+++ b/src/imap/command/selected.rs
@@ -14,6 +14,7 @@ use crate::imap::command::{anystate, authenticated, MailboxName};
use crate::imap::flow;
use crate::imap::mailbox_view::MailboxView;
use crate::imap::response::Response;
+use crate::imap::capability::ServerCapability;
use crate::mail::user::User;
@@ -21,6 +22,7 @@ pub struct SelectedContext<'a> {
pub req: &'a Command<'static>,
pub user: &'a Arc<User>,
pub mailbox: &'a mut MailboxView,
+ pub server_capabilities: &'a ServerCapability,
}
pub async fn dispatch<'a>(
@@ -29,7 +31,10 @@ pub async fn dispatch<'a>(
match &ctx.req.body {
// Any State
// noop is specific to this state
- CommandBody::Capability => anystate::capability(ctx.req.tag.clone()),
+ CommandBody::Capability => anystate::capability(
+ ctx.req.tag.clone(),
+ ctx.server_capabilities,
+ ),
CommandBody::Logout => anystate::logout(),
// Specific to this state (7 commands + NOOP)
@@ -66,6 +71,7 @@ pub async fn dispatch<'a>(
_ => {
authenticated::dispatch(authenticated::AuthenticatedContext {
req: ctx.req,
+ server_capabilities: ctx.server_capabilities,
user: ctx.user,
})
.await