cja/server/cookies/
cookie_key.rs1use 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}