use crate::app::{AppArgs, AppConfig, AppPreferences}; use rand::{distributions::Alphanumeric, Rng}; use structopt::StructOpt; #[derive(Clone)] pub struct AppState { pub config: AppConfig, pub preferences: AppPreferences, pub admin_auth_token: AdminAuthToken, } impl AppState { pub fn new() -> Self { let config = AppConfig::new(AppArgs::from_args()); let admin_cookie_name = config.admin_cookie_name.to_owned(); AppState { config, preferences: AppPreferences {}, admin_auth_token: AdminAuthToken::new(admin_cookie_name), } } } #[derive(Clone)] pub struct AdminAuthToken { pub value: Option<String>, pub cookie_name: String, } impl AdminAuthToken { pub fn new(cookie_name: String) -> Self { AdminAuthToken { value: None, cookie_name, } } pub fn match_value(&self, value: String) -> bool { match &self.value { Some(token) => token.eq(&value), None => false, } } pub fn generate(&mut self) { // Thanks to https://stackoverflow.com/questions/54275459/how-do-i-create-a-random-string-by-sampling-from-alphanumeric-characters#54277357 self.value = Some( rand::thread_rng() .sample_iter(&Alphanumeric) .take(36) .map(char::from) .collect::<String>() .to_ascii_lowercase(), ) } }