From 3cb7c65b70250a6a7837291386d0f7f9ebd43ec6 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 2 Jun 2022 17:59:29 +0200 Subject: [PATCH] Working server --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 5 ++-- src/server.rs | 73 +++++++++++++++++++++++++++++++-------------------- 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 29a60d0..dd65fea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -973,6 +973,7 @@ dependencies = [ "futures", "hex", "im", + "imap-codec", "itertools", "k2v-client", "ldap3", diff --git a/Cargo.toml b/Cargo.toml index 53a9f40..416e470 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ tracing-subscriber = "0.3" tracing = "0.1" tower = "0.4" futures = "0.3" +imap-codec = "0.5" k2v-client = { git = "https://git.deuxfleurs.fr/Deuxfleurs/garage.git", branch = "main" } diff --git a/src/main.rs b/src/main.rs index ada94fc..3c2ef7f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -111,9 +111,10 @@ struct UserSecretsArgs { #[tokio::main] async fn main() -> Result<()> { if std::env::var("RUST_LOG").is_err() { - std::env::set_var("RUST_LOG", "mailrage=info,k2v_client=info") + std::env::set_var("RUST_LOG", "main=info,mailrage=info,k2v_client=info") } - pretty_env_logger::init(); + + tracing_subscriber::fmt::init(); let args = Args::parse(); diff --git a/src/server.rs b/src/server.rs index b06299c..cd15bef 100644 --- a/src/server.rs +++ b/src/server.rs @@ -10,14 +10,10 @@ use crate::mailbox::Mailbox; use boitalettres::proto::{Request, Response}; use boitalettres::server::accept::addr::{AddrIncoming, AddrStream}; use boitalettres::server::Server as ImapServer; -use tracing_subscriber; +use std::pin::Pin; use std::task::{Context, Poll}; use tower::Service; -use std::future::Future; -use std::pin::Pin; - -use std::error::Error; pub struct Server { pub login_provider: Box, @@ -25,38 +21,57 @@ pub struct Server { struct Connection; impl Service for Connection { - type Response = Response; - type Error = anyhow::Error; - type Future = Pin> + Send>>; + type Response = Response; + type Error = anyhow::Error; + type Future = Pin> + Send>>; - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } - fn call(&mut self, req: Request) -> Self::Future { - Box::pin(async move { - println!("Got request: {:#?}", req); - Ok(Response::ok("Done")?) - }) - } + fn call(&mut self, req: Request) -> Self::Future { + tracing::debug!("Got request: {:#?}", req); + 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: _, + } => Response::ok("Logged in")?, + _ => Response::bad("Error in IMAP command received by server.")?, + }; + + Ok(r) + }) + } } struct Instance; impl<'a> Service<&'a AddrStream> for Instance { - type Response = Connection; - type Error = anyhow::Error; - type Future = Pin> + Send>>; + type Response = Connection; + type Error = anyhow::Error; + type Future = Pin> + Send>>; - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } - fn call(&mut self, addr: &'a AddrStream) -> Self::Future { - println!("{}, {}", addr.remote_addr, addr.local_addr); - Box::pin(async { - Ok(Connection) - }) - } + fn call(&mut self, addr: &'a AddrStream) -> Self::Future { + tracing::info!(remote_addr = %addr.remote_addr, local_addr = %addr.local_addr, "accept"); + Box::pin(async { Ok(Connection) }) + } } impl Server {