diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2022-06-03 17:56:47 +0200 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2022-06-03 17:56:47 +0200 |
commit | acc2ba390914cac1e977685c82a50510f11e151e (patch) | |
tree | 93466902f7c1cfd9c040baaad9bbad2dc76d7b12 /src/command.rs | |
parent | e950931c5f145c05353aa377f99fb2daac37d044 (diff) | |
download | aerogramme-acc2ba390914cac1e977685c82a50510f11e151e.tar.gz aerogramme-acc2ba390914cac1e977685c82a50510f11e151e.zip |
Put commands in a dedicated file
Diffstat (limited to 'src/command.rs')
-rw-r--r-- | src/command.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/command.rs b/src/command.rs new file mode 100644 index 0000000..56291ad --- /dev/null +++ b/src/command.rs @@ -0,0 +1,41 @@ +use std::sync::Arc; + +use boitalettres::errors::Error as BalError; +use boitalettres::proto::{Request, Response}; +use imap_codec::types::core::AString; +use imap_codec::types::response::{Capability, Data}; + +use crate::mailstore; + +pub struct Command { + mailstore: Arc<mailstore::Mailstore>, +} + +impl Command { + pub fn new(mailstore: Arc<mailstore::Mailstore>) -> Self { + Self { mailstore } + } + + pub async fn capability(self) -> Result<Response, BalError> { + let capabilities = vec![Capability::Imap4Rev1, Capability::Idle]; + let body = vec![Data::Capability(capabilities)]; + let r = Response::ok("Pre-login capabilities listed, post-login capabilities have more.")? + .with_body(body); + Ok(r) + } + + pub async fn login(self, username: AString, password: AString) -> Result<Response, BalError> { + let (u, p) = match (String::try_from(username), String::try_from(password)) { + (Ok(u), Ok(p)) => (u, p), + _ => return Response::bad("Invalid characters"), + }; + + tracing::debug!(user = %u, "command.login"); + let creds = match self.mailstore.login_provider.login(&u, &p).await { + Err(_) => return Response::no("[AUTHENTICATIONFAILED] Authentication failed."), + Ok(c) => c, + }; + + Response::ok("Logged in") + } +} |