use serde::{Deserialize, Serialize};
use super::redirect::BackendOidcModeRedirectUriConfig;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum RefreshMaterialProtectionKind {
#[default]
Passthrough,
Sealed,
}
#[derive(Debug, Clone, Deserialize, Default)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum RefreshMaterialProtection {
#[default]
Passthrough,
Sealed {
master_key: String,
},
}
impl RefreshMaterialProtection {
pub fn kind(&self) -> RefreshMaterialProtectionKind {
match self {
Self::Passthrough => RefreshMaterialProtectionKind::Passthrough,
Self::Sealed { .. } => RefreshMaterialProtectionKind::Sealed,
}
}
pub fn master_key(&self) -> Option<&str> {
match self {
Self::Sealed { master_key } => Some(master_key),
Self::Passthrough => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum MetadataDeliveryKind {
#[default]
None,
Redemption,
}
#[derive(Debug, Clone, Deserialize, Default)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum MetadataDelivery<MC> {
#[default]
None,
Redemption {
#[serde(flatten)]
config: MC,
},
}
impl<MC> MetadataDelivery<MC> {
pub fn kind(&self) -> MetadataDeliveryKind {
match self {
Self::None => MetadataDeliveryKind::None,
Self::Redemption { .. } => MetadataDeliveryKind::Redemption,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum PostAuthRedirectPolicyKind {
#[default]
CallerValidated,
Resolved,
}
#[derive(Debug, Clone, Deserialize, Default)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum PostAuthRedirectPolicy {
#[default]
CallerValidated,
Resolved {
#[serde(flatten)]
config: BackendOidcModeRedirectUriConfig,
},
}
impl PostAuthRedirectPolicy {
pub fn kind(&self) -> PostAuthRedirectPolicyKind {
match self {
Self::CallerValidated => PostAuthRedirectPolicyKind::CallerValidated,
Self::Resolved { .. } => PostAuthRedirectPolicyKind::Resolved,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BackendOidcModeCapabilities {
#[serde(default)]
pub refresh_material_protection: RefreshMaterialProtectionKind,
#[serde(default)]
pub metadata_delivery: MetadataDeliveryKind,
#[serde(default)]
pub post_auth_redirect_policy: PostAuthRedirectPolicyKind,
}
impl Default for BackendOidcModeCapabilities {
fn default() -> Self {
Self::pure()
}
}
impl BackendOidcModeCapabilities {
pub fn pure() -> Self {
Self {
refresh_material_protection: RefreshMaterialProtectionKind::Passthrough,
metadata_delivery: MetadataDeliveryKind::None,
post_auth_redirect_policy: PostAuthRedirectPolicyKind::CallerValidated,
}
}
pub fn mediated() -> Self {
Self {
refresh_material_protection: RefreshMaterialProtectionKind::Sealed,
metadata_delivery: MetadataDeliveryKind::Redemption,
post_auth_redirect_policy: PostAuthRedirectPolicyKind::Resolved,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BackendOidcModePreset {
Pure,
Mediated,
}
impl BackendOidcModePreset {
pub fn capabilities(self) -> BackendOidcModeCapabilities {
match self {
Self::Pure => BackendOidcModeCapabilities::pure(),
Self::Mediated => BackendOidcModeCapabilities::mediated(),
}
}
}