Skip to main content

axum_security/headers/
mod.rs

1// mod csp;
2mod hsts;
3
4pub use hsts::{StrictTransportSecurity, StrictTransportSecurityBuilderError};
5
6#[macro_export]
7macro_rules! define_header {
8    (
9        $struct_name:ident($header_name:ident = $header_value:literal),
10        $($const_name:ident => $value:literal),+ $(,)?
11    ) => {
12        const $header_name: ::http::HeaderName = ::http::HeaderName::from_static($header_value);
13
14
15        #[derive(Clone)]
16        pub struct $struct_name {
17            header_value: ::http::HeaderValue,
18        }
19
20        impl $struct_name {
21            $(
22                pub const $const_name: $struct_name = Self {
23                    header_value: ::http::HeaderValue::from_static($value),
24                };
25            )+
26        }
27
28        impl<S> tower::Layer<S> for $struct_name {
29            type Service = crate::utils::headers::InsertHeadersService<S>;
30
31            fn layer(&self, inner: S) -> Self::Service {
32                crate::utils::headers::InsertHeadersService {
33                    header_name: $header_name,
34                    header_value: self.header_value.clone(),
35                    inner,
36                }
37            }
38        }
39    };
40}
41
42define_header!(
43    CrossOriginEmbedderPolicy(CROSS_ORIGIN_EMBEDDER_POLICY = "cross-origin-embedder-policy"),
44    UNSAFE_NONE => "unsafe-none",
45    REQUIRE_CORP => "require-corp",
46    CREDENTIALLESS => "credentialless",
47);
48
49define_header!(
50    CrossOriginOpenerPolicy(CROSS_ORIGIN_OPENER_POLICY = "cross-origin-opener-policy"),
51    UNSAFE_NONE => "unsafe-none",
52    SAME_ORIGIN_ALLOW_POPUPS => "same-origin-allow-popups",
53    SAME_ORIGIN => "same-origin",
54    NOOPENER_ALLOW_POPUPS => "noopener-allow-popups"
55);
56
57define_header!(
58    CrossOriginResourcePolicy(CROSS_ORIGIN_RESOURCE_POLICY = "cross-origin-resource-policy"),
59    SAME_SITE => "same-site",
60    SAME_ORIGIN => "same-origin",
61    CROSS_ORIGIN => "cross-origin",
62);
63
64define_header!(
65    OriginAgentCluster(ORIGIN_AGENT_CLUSTER = "origin-agent-cluster"),
66    ON => "?1",
67    OFF => "?0",
68);
69
70define_header!(
71    ReferrerPolicy(REFERRER_POLICY = "referer-policy"),
72    NO_REFERRER => "no-referrer",
73    NO_REFERRER_WHEN_DOWNGRADE => "no-referrer-when-downgrade",
74    ORIGIN => "origin",
75    ORIGIN_WHEN_CROSS_ORIGIN => "origin-when-cross-origin",
76    SAME_ORIGIN => "same-origin",
77    STRICT_ORIGIN => "strict-origin",
78    STRICT_ORIGIN_WHEN_CROSS_ORIGIN => "strict-origin-when-cross-origin",
79    UNSAFE_URL => "unsafe-url",
80);
81
82define_header!(
83    ContentTypeOptions(X_CONTENT_TYPE_OPTIONS = "x-content-type-options"),
84    NO_SNIFF => "nosniff"
85);
86
87define_header!(
88    DnsPrefetchControl(X_DNS_PREFETCH_CONTROL = "x-dns-prefetch-control"),
89    ON => "ON",
90    OFF => "OFF",
91);
92
93define_header!(
94    FrameOptions(X_FRAME_OPTIONS= "x-frame-options"),
95    DENY => "DENY",
96    SAMEORIGIN => "SAMEORIGIN",
97);