1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[allow(dead_code)]
8pub(crate) enum PolicyMode {
9 Strict,
10 Compat,
11}
12
13#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
18pub enum DirectoryListingPolicy {
19 #[default]
20 Disabled,
21 Enabled,
22}
23
24#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
29pub enum SymlinkPolicy {
30 #[default]
31 Denied,
32 Follow,
33}
34
35#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
40pub enum DotfilePolicy {
41 #[default]
42 Denied,
43 Serve,
44}
45
46#[derive(Debug, Clone)]
61#[must_use]
62pub struct StaticPolicy {
63 pub directory_listing: DirectoryListingPolicy,
64 pub symlinks: SymlinkPolicy,
65 pub dotfiles: DotfilePolicy,
66}
67
68impl Default for StaticPolicy {
69 fn default() -> Self {
70 Self::safe_default()
71 }
72}
73
74impl StaticPolicy {
75 pub fn safe_default() -> Self {
76 Self {
77 directory_listing: DirectoryListingPolicy::Disabled,
78 symlinks: SymlinkPolicy::Denied,
79 dotfiles: DotfilePolicy::Denied,
80 }
81 }
82}
83
84#[cfg(test)]
85mod tests {
86 use super::*;
87
88 #[test]
89 fn safe_default_disables_directory_listing() {
90 let policy = StaticPolicy::safe_default();
91 assert_eq!(policy.directory_listing, DirectoryListingPolicy::Disabled);
92 }
93
94 #[test]
95 fn safe_default_denies_symlinks() {
96 let policy = StaticPolicy::safe_default();
97 assert_eq!(policy.symlinks, SymlinkPolicy::Denied);
98 }
99
100 #[test]
101 fn safe_default_denies_dotfiles() {
102 let policy = StaticPolicy::safe_default();
103 assert_eq!(policy.dotfiles, DotfilePolicy::Denied);
104 }
105}