Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
state.rs 1.72 KiB
Newer Older
  • Learn to ignore specific revisions
  • Pierre Jarriges's avatar
    Pierre Jarriges committed
    use crate::app::{AppArgs, AppConfig};
    
    use crate::cookie::SecureCookie;
    use actix_web::cookie::Cookie;
    
    peterrabbit's avatar
    peterrabbit committed
    use structopt::StructOpt;
    
    peterrabbit's avatar
    peterrabbit committed
    
    #[derive(Clone)]
    pub struct AppState {
        pub config: AppConfig,
    
        pub admin_auth_token: AdminAuthToken,
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
    pub struct AppStateBuilder {
        args: Option<AppArgs>,
    }
    
    impl AppStateBuilder {
    
    peterrabbit's avatar
    peterrabbit committed
        pub fn new() -> Self {
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
            AppStateBuilder { args: None }
        }
        pub fn build(&self) -> AppState {
            let config = self.config();
    
    peterrabbit's avatar
    peterrabbit committed
            AppState {
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
                config: config.clone(),
                admin_auth_token: AdminAuthToken::new(config.admin_cookie_name.to_owned()),
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
        fn config(&self) -> AppConfig {
            AppConfig::new(self.get_args())
        }
    
        fn get_args(&self) -> AppArgs {
            match &self.args {
                Some(args) => args.clone(),
                None => AppArgs::from_args(),
    
    Pierre Jarriges's avatar
    Pierre Jarriges committed
    
        pub fn use_args(&mut self, args: AppArgs) -> &Self {
            self.args = Some(args);
            self
        }
    }
    
    impl AppState {
        pub fn builder() -> AppStateBuilder {
            AppStateBuilder::new()
        }
    
    
    #[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 update_value(&mut self) {
            self.value = Some(SecureCookie::generate_token(36))
        }
    
        pub fn generate_cookie(&mut self) -> Cookie {
            SecureCookie::new(&self.cookie_name, self.value.as_ref().unwrap())