use crate::util::*;
use crate::validation::*;
use serde::*;
use std::collections::HashSet;
const EXP_CLAIM: &str = "exp";
const ISS_CLAIM: &str = "iss";
const AUD_CLAIM: &str = "aud";
const NBF_CLAIM: &str = "nbf";
#[derive(Debug, Clone, Deserialize, PartialEq, bon::Builder)]
pub struct ValidationConfig {
#[builder(into)]
pub allowed_iss: OneOrVec<Iss>,
#[builder(into)]
pub allowed_aud: OneOrVec<Aud>,
#[serde(default = "default_validate_exp")]
#[builder(default = default_validate_exp())]
pub validate_exp: bool,
#[serde(default)]
#[builder(default = false)]
pub validate_nbf: bool,
#[serde(default = "default_leeway_seconds")]
#[builder(default = default_leeway_seconds())]
pub leeway_seconds: u64,
#[serde(default)]
#[builder(default = false)]
pub allow_missing_jwk_alg_parameter: bool,
}
impl ValidationConfig {
pub(crate) fn apply_into(&self, validation: &mut jsonwebtoken::Validation) {
let mut required_spec_claims = HashSet::new();
if !self.allowed_iss.is_empty() {
required_spec_claims.insert(ISS_CLAIM.into());
match self.allowed_iss {
OneOrVec::One(ref value) => validation.set_issuer(&[value]),
OneOrVec::Vec(ref vec) => validation.set_issuer(vec),
}
}
if !self.allowed_aud.is_empty() {
required_spec_claims.insert(AUD_CLAIM.into());
match self.allowed_aud {
OneOrVec::One(ref value) => validation.set_audience(&[value]),
OneOrVec::Vec(ref vec) => validation.set_audience(vec),
}
} else {
validation.validate_aud = false;
}
if self.validate_exp {
required_spec_claims.insert(EXP_CLAIM.into());
} else {
validation.validate_exp = false;
}
if self.validate_nbf {
required_spec_claims.insert(NBF_CLAIM.into());
validation.validate_nbf = true;
}
validation.leeway = self.leeway_seconds;
validation.required_spec_claims = required_spec_claims;
}
}
pub const fn default_validate_exp() -> bool {
true
}
pub const fn default_leeway_seconds() -> u64 {
60
}