cja/server/cookies/
cookie_key.rs

1use std::{fmt::Debug, ops::Deref};
2
3use base64::{DecodeError, Engine};
4
5#[derive(Clone)]
6pub struct CookieKey(pub tower_cookies::Key);
7
8impl Deref for CookieKey {
9    type Target = tower_cookies::Key;
10
11    fn deref(&self) -> &Self::Target {
12        &self.0
13    }
14}
15
16impl CookieKey {
17    pub fn from_env_or_generate() -> Result<Self, DecodeError> {
18        let cookie_key = std::env::var("COOKIE_KEY");
19        let cookie_key = if let Ok(cookie_key) = cookie_key {
20            tracing::info!("Using cookie key from environment");
21            let cookie_key =
22                base64::engine::general_purpose::STANDARD.decode(cookie_key.as_bytes())?;
23
24            Self(tower_cookies::Key::derive_from(&cookie_key))
25        } else {
26            tracing::info!("Generating new cookie key");
27            Self::generate()
28        };
29        Ok(cookie_key)
30    }
31
32    pub fn generate() -> Self {
33        Self(tower_cookies::Key::generate())
34    }
35}
36
37impl Debug for CookieKey {
38    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
39        f.debug_struct("CookieKey")
40            .field("value", &"[omitted]")
41            .finish()
42    }
43}