2023-11-01 08:20:36 +00:00
|
|
|
#![feature(async_fn_in_trait)]
|
|
|
|
|
2023-11-15 14:56:43 +00:00
|
|
|
mod timestamp;
|
2022-05-18 10:24:37 +00:00
|
|
|
mod bayou;
|
2022-05-19 10:10:48 +00:00
|
|
|
mod config;
|
2022-05-18 10:24:37 +00:00
|
|
|
mod cryptoblob;
|
2022-06-17 16:39:36 +00:00
|
|
|
mod imap;
|
2022-07-13 10:30:35 +00:00
|
|
|
mod k2v_util;
|
2022-05-31 15:07:34 +00:00
|
|
|
mod lmtp;
|
2022-05-19 10:10:48 +00:00
|
|
|
mod login;
|
2022-06-27 14:56:20 +00:00
|
|
|
mod mail;
|
2022-05-19 13:14:36 +00:00
|
|
|
mod server;
|
2023-10-30 17:07:40 +00:00
|
|
|
mod storage;
|
2022-05-18 10:24:37 +00:00
|
|
|
|
2022-05-19 13:14:36 +00:00
|
|
|
use std::path::PathBuf;
|
2022-05-18 12:54:48 +00:00
|
|
|
|
2023-11-23 14:04:47 +00:00
|
|
|
use anyhow::Result;
|
2022-05-19 13:14:36 +00:00
|
|
|
use clap::{Parser, Subcommand};
|
|
|
|
|
2022-05-19 10:10:48 +00:00
|
|
|
use config::*;
|
2022-05-19 12:33:49 +00:00
|
|
|
use server::Server;
|
2022-05-18 10:24:37 +00:00
|
|
|
|
2022-05-19 13:14:36 +00:00
|
|
|
#[derive(Parser, Debug)]
|
|
|
|
#[clap(author, version, about, long_about = None)]
|
|
|
|
struct Args {
|
|
|
|
#[clap(subcommand)]
|
|
|
|
command: Command,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Subcommand, Debug)]
|
|
|
|
enum Command {
|
|
|
|
/// Runs the IMAP+LMTP server daemon
|
|
|
|
Server {
|
2022-06-30 08:50:03 +00:00
|
|
|
#[clap(short, long, env = "CONFIG_FILE", default_value = "aerogramme.toml")]
|
2022-05-19 13:14:36 +00:00
|
|
|
config_file: PathBuf,
|
2023-11-24 10:44:42 +00:00
|
|
|
},
|
|
|
|
Test,
|
2022-05-19 13:14:36 +00:00
|
|
|
}
|
|
|
|
|
2022-05-23 15:31:53 +00:00
|
|
|
#[derive(Parser, Debug)]
|
|
|
|
struct UserSecretsArgs {
|
|
|
|
/// User secret
|
|
|
|
#[clap(short = 'U', long, env = "USER_SECRET")]
|
|
|
|
user_secret: String,
|
|
|
|
/// Alternate user secrets (comma-separated list of strings)
|
|
|
|
#[clap(long, env = "ALTERNATE_USER_SECRETS", default_value = "")]
|
|
|
|
alternate_user_secrets: String,
|
|
|
|
}
|
|
|
|
|
2022-05-18 10:24:37 +00:00
|
|
|
#[tokio::main]
|
2022-05-19 13:14:36 +00:00
|
|
|
async fn main() -> Result<()> {
|
2022-05-20 11:36:45 +00:00
|
|
|
if std::env::var("RUST_LOG").is_err() {
|
2022-06-30 08:50:03 +00:00
|
|
|
std::env::set_var("RUST_LOG", "main=info,aerogramme=info,k2v_client=info")
|
2022-05-20 11:36:45 +00:00
|
|
|
}
|
2022-06-02 15:59:29 +00:00
|
|
|
|
2022-06-29 18:00:38 +00:00
|
|
|
// Abort on panic (same behavior as in Go)
|
|
|
|
std::panic::set_hook(Box::new(|panic_info| {
|
2023-05-15 16:23:23 +00:00
|
|
|
eprintln!("{}", panic_info);
|
2022-07-15 14:15:48 +00:00
|
|
|
eprintln!("{:?}", backtrace::Backtrace::new());
|
2022-06-29 18:00:38 +00:00
|
|
|
std::process::abort();
|
|
|
|
}));
|
|
|
|
|
2022-06-02 15:59:29 +00:00
|
|
|
tracing_subscriber::fmt::init();
|
2022-05-20 11:36:45 +00:00
|
|
|
|
2022-05-19 13:14:36 +00:00
|
|
|
let args = Args::parse();
|
|
|
|
|
|
|
|
match args.command {
|
|
|
|
Command::Server { config_file } => {
|
|
|
|
let config = read_config(config_file)?;
|
|
|
|
|
2022-06-03 09:38:01 +00:00
|
|
|
let server = Server::new(config).await?;
|
2022-05-19 13:14:36 +00:00
|
|
|
server.run().await?;
|
|
|
|
}
|
2023-11-24 10:44:42 +00:00
|
|
|
Command::Test => {
|
|
|
|
use std::collections::HashMap;
|
|
|
|
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
|
|
|
|
println!("--- toml ---\n{}\n--- end ---\n", toml::to_string(&Config {
|
|
|
|
lmtp: None,
|
|
|
|
imap: Some(ImapConfig { bind_addr: SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), 8080) }),
|
|
|
|
login_ldap: None,
|
|
|
|
login_static: Some(HashMap::from([
|
|
|
|
("alice".into(), LoginStaticUser {
|
|
|
|
password: "hash".into(),
|
|
|
|
user_secret: "hello".into(),
|
|
|
|
alternate_user_secrets: vec![],
|
|
|
|
email_addresses: vec![],
|
|
|
|
master_key: None,
|
|
|
|
secret_key: None,
|
|
|
|
storage: StaticStorage::Garage(StaticGarageConfig {
|
|
|
|
s3_endpoint: "http://".into(),
|
|
|
|
k2v_endpoint: "http://".into(),
|
|
|
|
aws_region: "garage".into(),
|
|
|
|
aws_access_key_id: "GK...".into(),
|
|
|
|
aws_secret_access_key: "xxx".into(),
|
|
|
|
bucket: "aerogramme".into(),
|
|
|
|
}),
|
|
|
|
})
|
|
|
|
])),
|
|
|
|
}).unwrap());
|
|
|
|
}
|
2022-05-19 10:10:48 +00:00
|
|
|
}
|
2022-05-19 13:14:36 +00:00
|
|
|
|
|
|
|
Ok(())
|
2022-05-18 10:24:37 +00:00
|
|
|
}
|
|
|
|
|