1use std::collections::BTreeMap;
2
3use openauth_core::secret::SecretString;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct SamlProviderConfig {
10 pub issuer: String,
12 #[serde(default)]
13 pub entry_point: String,
15 pub cert: String,
17 pub callback_url: String,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub acs_url: Option<String>,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub audience: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub idp_metadata: Option<SamlIdpMetadata>,
28 pub sp_metadata: SamlSpMetadata,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub mapping: Option<SamlMapping>,
33 pub want_assertions_signed: bool,
35 pub authn_requests_signed: bool,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub signature_algorithm: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub digest_algorithm: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub identifier_format: Option<String>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub private_key: Option<SecretString>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub decryption_pvk: Option<SecretString>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub additional_params: Option<BTreeMap<String, serde_json::Value>>,
55}
56
57pub type SamlConfig = SamlProviderConfig;
59
60#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
61#[serde(rename_all = "camelCase")]
62pub struct SamlIdpMetadata {
64 pub metadata: Option<String>,
65 #[serde(alias = "entityID")]
66 pub entity_id: Option<String>,
67 pub entity_url: Option<String>,
68 pub redirect_url: Option<String>,
69 pub cert: Option<String>,
70 pub private_key: Option<SecretString>,
71 pub private_key_pass: Option<SecretString>,
72 pub is_assertion_encrypted: Option<bool>,
73 pub enc_private_key: Option<SecretString>,
74 pub enc_private_key_pass: Option<SecretString>,
75 pub single_sign_on_service: Option<Vec<SamlService>>,
76 pub single_logout_service: Option<Vec<SamlService>>,
77}
78
79#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
80pub struct SamlService {
82 #[serde(rename = "Binding")]
83 pub binding: String,
84 #[serde(rename = "Location")]
85 pub location: String,
86}
87
88#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
89#[serde(rename_all = "camelCase")]
90pub struct SamlSpMetadata {
92 pub metadata: Option<String>,
93 #[serde(alias = "entityID")]
94 pub entity_id: Option<String>,
95 pub binding: Option<String>,
96 pub private_key: Option<SecretString>,
97 pub private_key_pass: Option<SecretString>,
98 pub is_assertion_encrypted: Option<bool>,
99 pub enc_private_key: Option<SecretString>,
100 pub enc_private_key_pass: Option<SecretString>,
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
104#[serde(rename_all = "camelCase")]
105pub struct SamlMapping {
107 pub id: Option<String>,
108 pub email: Option<String>,
109 pub email_verified: Option<String>,
110 pub name: Option<String>,
111 pub first_name: Option<String>,
112 pub last_name: Option<String>,
113 pub extra_fields: Option<BTreeMap<String, String>>,
114}