use std::collections::BTreeMap;
use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct SecretString(String);
impl SecretString {
pub fn new(value: impl Into<String>) -> Self {
Self(value.into())
}
pub fn expose_secret(&self) -> &str {
&self.0
}
pub fn into_inner(self) -> String {
self.0
}
}
impl fmt::Debug for SecretString {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("SecretString(REDACTED)")
}
}
impl From<String> for SecretString {
fn from(value: String) -> Self {
Self::new(value)
}
}
impl From<&str> for SecretString {
fn from(value: &str) -> Self {
Self::new(value)
}
}
impl AsRef<str> for SecretString {
fn as_ref(&self) -> &str {
self.expose_secret()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OidcProviderConfig {
pub issuer: String,
pub pkce: bool,
pub client_id: String,
pub client_secret: SecretString,
pub discovery_endpoint: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_info_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub jwks_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub revocation_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_session_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub introspection_endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token_endpoint_authentication: Option<TokenEndpointAuthentication>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scopes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mapping: Option<OidcProfileMapping>,
pub override_user_info: bool,
}
pub type OidcConfig = OidcProviderConfig;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TokenEndpointAuthentication {
ClientSecretBasic,
ClientSecretPost,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OidcProfileMapping {
pub id: Option<String>,
pub email: Option<String>,
pub email_verified: Option<String>,
pub name: Option<String>,
pub image: Option<String>,
pub extra_fields: Option<BTreeMap<String, String>>,
}
pub type OidcMapping = OidcProfileMapping;