#![forbid(unsafe_code, future_incompatible)]
#![deny(missing_debug_implementations, nonstandard_style, rust_2018_idioms)]
#![warn(missing_docs, missing_doc_code_examples)]
#![cfg_attr(test, deny(warnings))]
use http::HeaderMap;
pub mod csp;
pub fn armor(headers: &mut HeaderMap) {
dns_prefetch_control(headers);
dont_sniff_mimetype(headers);
frameguard(headers, None);
hide_powered_by(headers);
hsts(headers);
xss_filter(headers);
}
#[inline]
pub fn dns_prefetch_control(headers: &mut HeaderMap) {
headers.insert("X-DNS-Prefetch-Control", "on".parse().unwrap());
}
#[derive(Debug, Clone)]
pub enum FrameOptions {
SameOrigin,
Deny,
}
#[inline]
pub fn frameguard(headers: &mut HeaderMap, guard: Option<FrameOptions>) {
let kind = match guard {
None | Some(FrameOptions::SameOrigin) => "sameorigin",
Some(FrameOptions::Deny) => "deny",
};
headers.insert("X-Frame-Options", kind.parse().unwrap());
}
#[inline]
pub fn hide_powered_by(headers: &mut HeaderMap) {
headers.remove("X-Powered-By");
}
#[inline]
pub fn hsts(headers: &mut HeaderMap) {
let val = "max-age=5184000".parse().unwrap();
headers.insert("Strict-Transport-Security", val);
}
#[inline]
pub fn dont_sniff_mimetype(headers: &mut HeaderMap) {
headers.insert("X-Content-Type-Options", "nosniff".parse().unwrap());
}
#[inline]
pub fn xss_filter(headers: &mut HeaderMap) {
headers.insert("X-XSS-Protection", "1; mode=block".parse().unwrap());
}
#[derive(Debug, Clone)]
pub enum ReferrerOptions {
NoReferrer,
NoReferrerDowngrade,
SameOrigin,
Origin,
StrictOrigin,
CrossOrigin,
StrictCrossOrigin,
UnsafeUrl,
}
#[inline]
pub fn referrer_policy(headers: &mut HeaderMap, referrer: Option<ReferrerOptions>) {
let policy = match referrer {
None | Some(ReferrerOptions::NoReferrer) => "no-referrer",
Some(ReferrerOptions::NoReferrerDowngrade) => "no-referrer-when-downgrade",
Some(ReferrerOptions::SameOrigin) => "same-origin",
Some(ReferrerOptions::Origin) => "origin",
Some(ReferrerOptions::StrictOrigin) => "strict-origin",
Some(ReferrerOptions::CrossOrigin) => "origin-when-cross-origin",
Some(ReferrerOptions::StrictCrossOrigin) => "strict-origin-when-cross-origin",
Some(ReferrerOptions::UnsafeUrl) => "unsafe-url",
};
if headers.contains_key("Referrer-Policy") {
headers.append("Referrer-Policy", policy.parse().unwrap());
} else {
headers.insert("Referrer-Policy", policy.parse().unwrap());
}
}