use serde::Serialize;
use std::env;
use std::sync::LazyLock;
use crate::passkey::config::{ORIGIN, PASSKEY_RP_ID};
use crate::passkey::errors::PasskeyError;
#[derive(Serialize)]
struct WebAuthnConfig {
#[serde(rename = "rp_id")]
rp_id: String,
#[serde(rename = "origins")]
origins: Vec<String>,
}
static ADDITIONAL_ORIGINS: LazyLock<Vec<String>> = LazyLock::new(|| {
env::var("WEBAUTHN_ADDITIONAL_ORIGINS")
.map(|origins| {
origins
.split(',')
.map(|s| s.trim().to_string())
.filter(|s| !s.is_empty())
.collect()
})
.unwrap_or_default()
});
pub fn get_related_origin_json() -> Result<String, PasskeyError> {
get_related_origin_json_with_core(
PASSKEY_RP_ID.clone(),
ORIGIN.clone(),
ADDITIONAL_ORIGINS.clone(),
)
}
fn get_related_origin_json_with_core(
rp_id: String,
origin: String,
additional_origins: Vec<String>,
) -> Result<String, PasskeyError> {
let mut origins = vec![origin];
origins.extend(additional_origins.iter().cloned());
let config = WebAuthnConfig { rp_id, origins };
serde_json::to_string_pretty(&config).map_err(|e| PasskeyError::Serde(e.to_string()))
}
#[cfg(test)]
mod tests;