50 lines
1.6 KiB
Rust
50 lines
1.6 KiB
Rust
use crate::config::{Config, generate_log_file_name};
|
|
use crate::middleware::AppState;
|
|
use axum::body::Body;
|
|
use axum::extract::Request;
|
|
use log::{LevelFilter, error, info};
|
|
use simplelog::{ColorChoice, CombinedLogger, TermLogger, TerminalMode, WriteLogger};
|
|
use std::fs::File;
|
|
use std::sync::Arc;
|
|
use serde::de::DeserializeOwned;
|
|
use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _};
|
|
|
|
pub fn decode_payload_unchecked<T: DeserializeOwned>(token: &str) -> Result<T, Box<dyn std::error::Error>> {
|
|
let mut parts = token.split('.');
|
|
let _header = parts.next().ok_or("missing header")?;
|
|
let payload_b64 = parts.next().ok_or("missing payload")?;
|
|
// signature is parts.next() but we ignore it here
|
|
let payload = URL_SAFE_NO_PAD.decode(payload_b64.as_bytes())?;
|
|
let claims = serde_json::from_slice::<T>(&payload)?;
|
|
Ok(claims)
|
|
}
|
|
|
|
pub fn initialize_logging(config: &Config) {
|
|
CombinedLogger::init(vec![
|
|
TermLogger::new(
|
|
LevelFilter::Info,
|
|
simplelog::Config::default(),
|
|
TerminalMode::Mixed,
|
|
ColorChoice::Auto,
|
|
),
|
|
WriteLogger::new(
|
|
LevelFilter::Info,
|
|
simplelog::Config::default(),
|
|
File::create(generate_log_file_name(config.log_file_prefix.clone())).unwrap(),
|
|
),
|
|
])
|
|
.unwrap();
|
|
}
|
|
|
|
pub async fn set_and_log_session(state: &Arc<AppState>, session: String) {
|
|
match state.repository.set_session(session.clone()).await {
|
|
Ok(_) => {
|
|
info!("Redis: saved session {}", &session);
|
|
}
|
|
|
|
Err(err) => {
|
|
error!("Redis: failed to save session: {}", err);
|
|
}
|
|
}
|
|
}
|