diff --git a/vit-servicing-station-lib/src/lib.rs b/vit-servicing-station-lib/src/lib.rs index 8b849bf7..6b7c23e3 100644 --- a/vit-servicing-station-lib/src/lib.rs +++ b/vit-servicing-station-lib/src/lib.rs @@ -8,6 +8,7 @@ extern crate structopt; extern crate diesel_migrations; pub mod db; +mod logging; pub mod server; pub mod utils; pub mod v0; diff --git a/vit-servicing-station-lib/src/logging/mod.rs b/vit-servicing-station-lib/src/logging/mod.rs new file mode 100644 index 00000000..eb50ebbd --- /dev/null +++ b/vit-servicing-station-lib/src/logging/mod.rs @@ -0,0 +1,27 @@ +use logging_lib::messages::{DefaultLogMessageBuilder, DefaultMetadata, LogMessageId}; +use std::time::Duration; + +pub fn log_request_elapsed_time(elapsed_time: Duration) { + let elapsed = elapsed_time.as_nanos().to_string(); + let mut metadata = DefaultMetadata::new(); + metadata.insert("elapsed_nano_seconds".into(), elapsed.clone()); + DefaultLogMessageBuilder::new() + .with_level(log::Level::Info) + .with_tags(vec!["request", "elapsed"]) + .with_message(format!("Request elapsed time: {}ns", elapsed)) + .with_id(LogMessageId::Other("request_elapsed_time".into())) + .build() + .log(); +} + +pub fn log_rejected_api_key(api_key: String) { + let mut metadata = DefaultMetadata::new(); + metadata.insert("api_key".into(), api_key.clone()); + DefaultLogMessageBuilder::new() + .with_level(log::Level::Info) + .with_tags(vec!["api_key", "reject"]) + .with_message(format!("Rejected API-Token: {}", api_key)) + .with_id(LogMessageId::Other("RejectedAPIToken".into())) + .build() + .log(); +} diff --git a/vit-servicing-station-lib/src/v0/api_token.rs b/vit-servicing-station-lib/src/v0/api_token.rs index 50d93b40..ed8092d5 100644 --- a/vit-servicing-station-lib/src/v0/api_token.rs +++ b/vit-servicing-station-lib/src/v0/api_token.rs @@ -61,7 +61,7 @@ async fn authorize_token(token: String, context: SharedContext) -> Result<(), Re let manager = APITokenManager::new(context.read().await.db_connection_pool.clone()); let mut token_vec: Vec = Vec::new(); - base64::decode_config_buf(token, base64::URL_SAFE, &mut token_vec).map_err(|_err| { + base64::decode_config_buf(token.clone(), base64::URL_SAFE, &mut token_vec).map_err(|_err| { warp::reject::custom(HandleError::InvalidHeader( API_TOKEN_HEADER, "header should be base64 url safe decodable", @@ -72,7 +72,10 @@ async fn authorize_token(token: String, context: SharedContext) -> Result<(), Re match manager.is_token_valid(api_token).await { Ok(true) => Ok(()), - Ok(false) => Err(warp::reject::custom(HandleError::UnauthorizedToken)), + Ok(false) => { + crate::logging::log_rejected_api_key(token); + Err(warp::reject::custom(HandleError::UnauthorizedToken)) + } Err(e) => Err(warp::reject::custom(e)), } } diff --git a/vit-servicing-station-lib/src/v0/mod.rs b/vit-servicing-station-lib/src/v0/mod.rs index 024283e0..6830a90b 100644 --- a/vit-servicing-station-lib/src/v0/mod.rs +++ b/vit-servicing-station-lib/src/v0/mod.rs @@ -4,7 +4,6 @@ pub mod endpoints; pub mod errors; pub mod result; -use logging_lib::messages::LogMessageId; use warp::{Filter, Rejection, Reply}; pub async fn filter( @@ -13,18 +12,7 @@ pub async fn filter( let root = warp::path!("api" / "v0" / ..); // log request statistics - let log = warp::log::custom(|info| { - let elapsed = info.elapsed().as_nanos().to_string(); - let mut metadata = logging_lib::messages::DefaultMetadata::new(); - metadata.insert("elapsed_nano_seconds".into(), elapsed.clone()); - logging_lib::messages::DefaultLogMessageBuilder::new() - .with_level(log::Level::Info) - .with_tags(vec!["request", "elapsed"]) - .with_message(elapsed) - .with_id(LogMessageId::Other("request_average".into())) - .build() - .log(); - }); + let log = warp::log::custom(|info| crate::logging::log_request_elapsed_time(info.elapsed())); endpoints::filter(root.boxed(), ctx) .await