From b7178523765e2610a866317a9707dd6bfb465a76 Mon Sep 17 00:00:00 2001 From: Delta1925 Date: Fri, 14 Apr 2023 16:33:59 +0200 Subject: [PATCH] Improve mail text and add logger --- Cargo.lock | 40 ++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 3 +++ src/confirmation.rs | 19 +++++++++++++++++-- src/main.rs | 7 ++++++- src/settings.rs | 14 ++++++++------ src/utils.rs | 24 ++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86404be..b79007e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -760,6 +760,22 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flexi_logger" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eae57842a8221ef13f1f207632d786a175dd13bd8fbdc8be9d852f7c9cf1046" +dependencies = [ + "chrono", + "glob", + "is-terminal", + "lazy_static", + "log", + "nu-ansi-term", + "regex", + "thiserror", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1436,6 +1452,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -1515,6 +1541,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.12.1" @@ -2012,7 +2044,9 @@ version = "0.1.0" dependencies = [ "actix-web", "chrono", + "flexi_logger", "lettre", + "log", "once_cell", "rand 0.8.5", "sequoia-net", @@ -2022,6 +2056,7 @@ dependencies = [ "thiserror", "tokio", "toml", + "url", ] [[package]] @@ -2116,9 +2151,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] @@ -2452,6 +2487,7 @@ dependencies = [ "form_urlencoded", "idna 0.3.0", "percent-encoding", + "serde", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index f9548f5..3882659 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,9 @@ edition = "2021" [dependencies] actix-web = "4.3.1" chrono = "0.4.24" +flexi_logger = "0.25.3" lettre = "0.10.4" +log = "0.4.17" once_cell = "1.17.1" rand = "0.8.5" sequoia-net = "0.27.0" @@ -18,3 +20,4 @@ serde_json = "1.0.96" thiserror = "1.0.40" tokio = { version = "1.27.0", features = ["time"] } toml = "0.7.3" +url = { version = "2.3.1", features = ["serde"] } diff --git a/src/confirmation.rs b/src/confirmation.rs index 0f9a631..7360381 100644 --- a/src/confirmation.rs +++ b/src/confirmation.rs @@ -67,8 +67,23 @@ pub fn send_confirmation_email(email: &str, action: &Action, token: &str) -> Res Ok(mailbox) => mailbox, Err(_) => return Err(Error::ParseEmail), }) - .subject(&SETTINGS.mail_settings.mail_subject) - .body(format!("{action} - {token}")); + .subject( + SETTINGS + .mail_settings + .mail_subject + .replace("%a", &action.to_string().to_lowercase()), + ) + .body(format!( + "{}", + SETTINGS + .external_url + .join("api/") + .unwrap() + .join("confirm/") + .unwrap() + .join(token) + .unwrap() + )); let message = match email { Ok(message) => message, diff --git a/src/main.rs b/src/main.rs index 7f0c724..7c053ec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,10 +12,12 @@ use self::management::{clean_stale, store_pending_addition, store_pending_deleti use self::utils::{gen_random_token, get_email_from_cert, parse_pem}; use actix_web::{get, post, web, App, HttpServer, Result}; +use log::error; use serde::Deserialize; use std::fs; use std::path::Path; use tokio::{task, time}; +use utils::init_logger; const PENDING_FOLDER: &str = "pending"; @@ -36,13 +38,16 @@ struct Email { #[actix_web::main] async fn main() -> std::io::Result<()> { + if init_logger().is_err() { + panic!("Could not set up logger!") + }; fs::create_dir_all(pending_path!())?; task::spawn(async { let mut metronome = time::interval(time::Duration::from_secs(SETTINGS.cleanup_interval)); loop { metronome.tick().await; if clean_stale(SETTINGS.max_age).is_err() { - eprintln!("Error while cleaning stale requests..."); + error!("Error while cleaning stale requests!"); } } }); diff --git a/src/settings.rs b/src/settings.rs index 0ea80c4..ed403d3 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -3,6 +3,7 @@ use once_cell::sync::Lazy; use sequoia_net::wkd::Variant; use serde::{Deserialize, Serialize}; use std::fs; +use url::Url; #[derive(Serialize, Deserialize, Debug)] pub struct Settings { @@ -12,7 +13,7 @@ pub struct Settings { pub max_age: i64, pub cleanup_interval: u64, pub port: u16, - pub external_url: String, + pub external_url: Url, pub mail_settings: MailSettings, } @@ -41,15 +42,15 @@ pub enum SMTPEncryption { } fn get_settings() -> Settings { - println!("Reading settings..."); let content = match fs::read_to_string("wkd.toml") { Ok(content) => content, Err(_) => panic!("Unable to access settings file!"), }; - match toml::from_str(&content) { + let settings = match toml::from_str(&content) { Ok(settings) => settings, Err(_) => panic!("Unable to parse settings from file!"), - } + }; + settings } fn get_mailer() -> SmtpTransport { @@ -63,13 +64,14 @@ fn get_mailer() -> SmtpTransport { SmtpTransport::starttls_relay(&SETTINGS.mail_settings.smtp_host) } }; - match builder { + let mailer = match builder { Ok(builder) => builder, Err(_) => panic!("Unable to set up smtp"), } .credentials(creds) .port(SETTINGS.mail_settings.smtp_port) - .build() + .build(); + mailer } pub static SETTINGS: Lazy = Lazy::new(get_settings); diff --git a/src/utils.rs b/src/utils.rs index 1527a31..4cb46da 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,7 @@ use crate::errors::Error; use crate::settings::SETTINGS; +use flexi_logger::{style, DeferredNow, FlexiLoggerError, Logger, LoggerHandle, Record}; use rand::{distributions::Alphanumeric, thread_rng, Rng}; use sequoia_net::wkd::Url; use sequoia_openpgp::{parse::Parse, Cert}; @@ -58,3 +59,26 @@ pub fn key_exists(email: &str) -> Result { } Ok(true) } + +pub fn custom_format( + w: &mut dyn std::io::Write, + now: &mut DeferredNow, + record: &Record, +) -> Result<(), std::io::Error> { + let level = record.level(); + write!( + w, + "[{}] [{}] {}: {}", + style(level).paint(now.format("%Y-%m-%d %H:%M:%S").to_string()), + style(level).paint(record.module_path().unwrap_or("")), + style(level).paint(record.level().to_string()), + style(level).paint(&record.args().to_string()) + ) +} + +pub fn init_logger() -> Result { + Logger::try_with_env_or_str("simple_wkd=trace")? + .format(custom_format) + .set_palette("b1;3;2;4;6".to_string()) + .start() +}