use crate::error::{Error, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CrossOriginOpenerPolicy {
SameOrigin,
SameOriginAllowPopups,
UnsafeNone,
}
impl CrossOriginOpenerPolicy {
pub fn as_str(&self) -> &'static str {
match self {
Self::SameOrigin => "same-origin",
Self::SameOriginAllowPopups => "same-origin-allow-popups",
Self::UnsafeNone => "unsafe-none",
}
}
}
impl std::str::FromStr for CrossOriginOpenerPolicy {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
match s.to_lowercase().as_str() {
"same-origin" => Ok(Self::SameOrigin),
"same-origin-allow-popups" => Ok(Self::SameOriginAllowPopups),
"unsafe-none" => Ok(Self::UnsafeNone),
_ => Err(Error::InvalidCoop(format!(
"Unknown Cross-Origin-Opener-Policy: '{}'",
s
))),
}
}
}
impl std::fmt::Display for CrossOriginOpenerPolicy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CrossOriginEmbedderPolicy {
UnsafeNone,
RequireCorp,
Credentialless,
}
impl CrossOriginEmbedderPolicy {
pub fn as_str(&self) -> &'static str {
match self {
Self::UnsafeNone => "unsafe-none",
Self::RequireCorp => "require-corp",
Self::Credentialless => "credentialless",
}
}
}
impl std::str::FromStr for CrossOriginEmbedderPolicy {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
match s.to_lowercase().as_str() {
"unsafe-none" => Ok(Self::UnsafeNone),
"require-corp" => Ok(Self::RequireCorp),
"credentialless" => Ok(Self::Credentialless),
_ => Err(Error::InvalidCoep(format!(
"Unknown Cross-Origin-Embedder-Policy: '{}'",
s
))),
}
}
}
impl std::fmt::Display for CrossOriginEmbedderPolicy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CrossOriginResourcePolicy {
SameOrigin,
SameSite,
CrossOrigin,
}
impl CrossOriginResourcePolicy {
pub fn as_str(&self) -> &'static str {
match self {
Self::SameOrigin => "same-origin",
Self::SameSite => "same-site",
Self::CrossOrigin => "cross-origin",
}
}
}
impl std::str::FromStr for CrossOriginResourcePolicy {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
match s.to_lowercase().as_str() {
"same-origin" => Ok(Self::SameOrigin),
"same-site" => Ok(Self::SameSite),
"cross-origin" => Ok(Self::CrossOrigin),
_ => Err(Error::InvalidCorp(format!(
"Unknown Cross-Origin-Resource-Policy: '{}'",
s
))),
}
}
}
impl std::fmt::Display for CrossOriginResourcePolicy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::str::FromStr;
#[test]
fn test_coop_as_str() {
assert_eq!(CrossOriginOpenerPolicy::SameOrigin.as_str(), "same-origin");
assert_eq!(
CrossOriginOpenerPolicy::SameOriginAllowPopups.as_str(),
"same-origin-allow-popups"
);
assert_eq!(CrossOriginOpenerPolicy::UnsafeNone.as_str(), "unsafe-none");
}
#[test]
fn test_coop_from_str() {
assert_eq!(
CrossOriginOpenerPolicy::from_str("same-origin").unwrap(),
CrossOriginOpenerPolicy::SameOrigin
);
assert_eq!(
CrossOriginOpenerPolicy::from_str("same-origin-allow-popups").unwrap(),
CrossOriginOpenerPolicy::SameOriginAllowPopups
);
assert_eq!(
CrossOriginOpenerPolicy::from_str("unsafe-none").unwrap(),
CrossOriginOpenerPolicy::UnsafeNone
);
assert!(CrossOriginOpenerPolicy::from_str("invalid").is_err());
}
#[test]
fn test_coep_as_str() {
assert_eq!(
CrossOriginEmbedderPolicy::UnsafeNone.as_str(),
"unsafe-none"
);
assert_eq!(
CrossOriginEmbedderPolicy::RequireCorp.as_str(),
"require-corp"
);
assert_eq!(
CrossOriginEmbedderPolicy::Credentialless.as_str(),
"credentialless"
);
}
#[test]
fn test_coep_from_str() {
assert_eq!(
CrossOriginEmbedderPolicy::from_str("unsafe-none").unwrap(),
CrossOriginEmbedderPolicy::UnsafeNone
);
assert_eq!(
CrossOriginEmbedderPolicy::from_str("require-corp").unwrap(),
CrossOriginEmbedderPolicy::RequireCorp
);
assert_eq!(
CrossOriginEmbedderPolicy::from_str("credentialless").unwrap(),
CrossOriginEmbedderPolicy::Credentialless
);
assert!(CrossOriginEmbedderPolicy::from_str("invalid").is_err());
}
#[test]
fn test_corp_as_str() {
assert_eq!(
CrossOriginResourcePolicy::SameOrigin.as_str(),
"same-origin"
);
assert_eq!(CrossOriginResourcePolicy::SameSite.as_str(), "same-site");
assert_eq!(
CrossOriginResourcePolicy::CrossOrigin.as_str(),
"cross-origin"
);
}
#[test]
fn test_corp_from_str() {
assert_eq!(
CrossOriginResourcePolicy::from_str("same-origin").unwrap(),
CrossOriginResourcePolicy::SameOrigin
);
assert_eq!(
CrossOriginResourcePolicy::from_str("same-site").unwrap(),
CrossOriginResourcePolicy::SameSite
);
assert_eq!(
CrossOriginResourcePolicy::from_str("cross-origin").unwrap(),
CrossOriginResourcePolicy::CrossOrigin
);
assert!(CrossOriginResourcePolicy::from_str("invalid").is_err());
}
#[test]
fn test_display() {
assert_eq!(
CrossOriginOpenerPolicy::SameOrigin.to_string(),
"same-origin"
);
assert_eq!(
CrossOriginEmbedderPolicy::RequireCorp.to_string(),
"require-corp"
);
assert_eq!(
CrossOriginResourcePolicy::SameSite.to_string(),
"same-site"
);
}
}