Skip to main content

reinhardt_conf/settings/
session.rs

1//! Session settings fragment
2//!
3//! Provides composable session configuration as a [`SettingsFragment`](crate::settings::fragment::SettingsFragment).
4
5use reinhardt_core::macros::settings;
6use serde::{Deserialize, Serialize};
7
8fn default_engine() -> String {
9	"cookie".to_string()
10}
11
12fn default_cookie_name() -> String {
13	"sessionid".to_string()
14}
15
16fn default_cookie_age() -> u64 {
17	1209600
18}
19
20fn default_cookie_httponly() -> bool {
21	true
22}
23
24fn default_cookie_samesite() -> String {
25	"lax".to_string()
26}
27
28/// Session configuration fragment.
29///
30/// Controls session storage engine and cookie attributes.
31#[settings(fragment = true, section = "session")]
32#[non_exhaustive]
33#[derive(Clone, Debug, Serialize, Deserialize)]
34pub struct SessionSettings {
35	/// Session storage engine (e.g., `"cookie"`, `"database"`, `"redis"`).
36	#[serde(default = "default_engine")]
37	pub engine: String,
38	/// Name of the session cookie.
39	#[serde(default = "default_cookie_name")]
40	pub cookie_name: String,
41	/// Maximum age of the session cookie in seconds.
42	#[serde(default = "default_cookie_age")]
43	pub cookie_age: u64,
44	/// Whether to set the `Secure` flag on the session cookie.
45	pub cookie_secure: bool,
46	/// Whether to set the `HttpOnly` flag on the session cookie.
47	#[serde(default = "default_cookie_httponly")]
48	pub cookie_httponly: bool,
49	/// `SameSite` attribute for the session cookie (e.g., `"lax"`, `"strict"`, `"none"`).
50	#[serde(default = "default_cookie_samesite")]
51	pub cookie_samesite: String,
52}
53
54impl Default for SessionSettings {
55	fn default() -> Self {
56		Self {
57			engine: "cookie".to_string(),
58			cookie_name: "sessionid".to_string(),
59			cookie_age: 1209600, // 2 weeks
60			cookie_secure: false,
61			cookie_httponly: true,
62			cookie_samesite: "lax".to_string(),
63		}
64	}
65}
66
67#[cfg(test)]
68mod tests {
69	use super::*;
70	use crate::settings::fragment::SettingsFragment;
71	use rstest::rstest;
72
73	#[rstest]
74	fn test_session_section_name() {
75		// Arrange / Act
76		let section = SessionSettings::section();
77
78		// Assert
79		assert_eq!(section, "session");
80	}
81
82	#[rstest]
83	fn test_session_default_values() {
84		// Arrange / Act
85		let settings = SessionSettings::default();
86
87		// Assert
88		assert_eq!(settings.engine, "cookie");
89		assert_eq!(settings.cookie_name, "sessionid");
90		assert_eq!(settings.cookie_age, 1209600);
91		assert!(!settings.cookie_secure);
92		assert!(settings.cookie_httponly);
93		assert_eq!(settings.cookie_samesite, "lax");
94	}
95}