diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2022-06-03 17:26:25 +0200 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2022-06-03 17:26:25 +0200 |
commit | 3589b0fa4b290ebbe416d793b9f82673754ab6f9 (patch) | |
tree | 32f04b17befe9b4031c65e960045567e76e9a90b /src/connection.rs | |
parent | c6f0118ef8fea9185fbbe77bb449c38c9664d5ba (diff) | |
download | aerogramme-3589b0fa4b290ebbe416d793b9f82673754ab6f9.tar.gz aerogramme-3589b0fa4b290ebbe416d793b9f82673754ab6f9.zip |
Split in multiple files
Diffstat (limited to 'src/connection.rs')
-rw-r--r-- | src/connection.rs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/connection.rs b/src/connection.rs new file mode 100644 index 0000000..aed11fa --- /dev/null +++ b/src/connection.rs @@ -0,0 +1,71 @@ +use std::sync::Arc; +use std::task::{Context, Poll}; + +use boitalettres::errors::Error as BalError; +use boitalettres::proto::{Request,Response}; +use futures::future::BoxFuture; +use tower::Service; + +use crate::mailstore::Mailstore; + +pub struct Connection { + pub mailstore: Arc<Mailstore>, +} +impl Connection { + pub fn new(mailstore: Arc<Mailstore>) -> Self { + Self { mailstore } + } +} +impl Service<Request> for Connection { + type Response = Response; + type Error = BalError; + type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: Request) -> Self::Future { + tracing::debug!("Got request: {:#?}", req); + let mailstore = self.mailstore.clone(); + Box::pin(async move { + use imap_codec::types::{ + command::CommandBody, + response::{Capability, Data}, + }; + + let r = match req.body { + CommandBody::Capability => { + let capabilities = vec![Capability::Imap4Rev1, Capability::Idle]; + let body = vec![Data::Capability(capabilities)]; + Response::ok( + "Pre-login capabilities listed, post-login capabilities have more.", + )? + .with_body(body) + } + CommandBody::Login { + username, + password, + } => { + 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 mailstore.login_provider.login(&u, &p).await { + Err(_) => { return Response::no("[AUTHENTICATIONFAILED] Authentication failed.") } + Ok(c) => c, + }; + + Response::ok("Logged in")? + } + _ => Response::bad("Error in IMAP command received by server.")?, + }; + + Ok(r) + }) + } +} + + |