1pub mod state {
2 use crate::delegation::types::Timestamp;
3 use crate::openid::types::provider::{OpenIdCertificate, OpenIdProvider};
4 use crate::state::types::config::AuthenticationConfig;
5 use candid::CandidType;
6 use serde::{Deserialize, Serialize};
7 use std::collections::HashMap;
8
9 pub type Salt = [u8; 32];
10
11 #[derive(Default, CandidType, Serialize, Deserialize, Clone)]
12 pub struct AuthenticationHeapState {
13 pub config: AuthenticationConfig,
14 pub salt: Option<Salt>,
15 pub openid: Option<OpenIdState>,
16 }
17
18 #[derive(Default, CandidType, Serialize, Deserialize, Clone)]
19 pub struct OpenIdState {
20 pub certificates: HashMap<OpenIdProvider, OpenIdCachedCertificate>,
21 }
22
23 #[derive(CandidType, Serialize, Deserialize, Clone)]
24 pub struct OpenIdCachedCertificate {
25 pub certificate: Option<OpenIdCertificate>,
26 pub last_fetch_attempt: OpenIdLastFetchAttempt,
27 }
28
29 #[derive(CandidType, Serialize, Deserialize, Clone)]
30 pub struct OpenIdLastFetchAttempt {
31 pub at: Timestamp,
32 pub streak_count: u8,
33 }
34}
35
36pub(crate) mod runtime_state {
37 use candid::Deserialize;
38 use ic_canister_sig_creation::signature_map::SignatureMap;
39 use serde::Serialize;
40
41 #[derive(Default, Serialize, Deserialize)]
42 pub struct State {
43 #[serde(skip, default)]
45 pub runtime: RuntimeState,
46 }
47
48 #[derive(Default)]
49 pub struct RuntimeState {
50 pub sigs: SignatureMap,
51 }
52}
53
54pub mod config {
55 use crate::delegation::types::DelegationTargets;
56 use crate::openid::types::provider::OpenIdProvider;
57 use candid::{CandidType, Deserialize, Principal};
58 use junobuild_shared::types::core::DomainName;
59 use junobuild_shared::types::state::{Timestamp, Version};
60 use serde::Serialize;
61 use std::collections::BTreeMap;
62
63 #[derive(Default, CandidType, Serialize, Deserialize, Clone)]
64 pub struct AuthenticationConfig {
65 pub internet_identity: Option<AuthenticationConfigInternetIdentity>,
66 pub openid: Option<AuthenticationConfigOpenId>,
67 pub rules: Option<AuthenticationRules>,
68 pub version: Option<Version>,
69 pub created_at: Option<Timestamp>,
70 pub updated_at: Option<Timestamp>,
71 }
72
73 #[derive(Default, CandidType, Serialize, Deserialize, Clone)]
74 pub struct AuthenticationConfigOpenId {
75 pub providers: OpenIdProviders,
76 pub observatory_id: Option<Principal>,
77 }
78
79 #[derive(Default, CandidType, Serialize, Deserialize, Clone)]
80 pub struct AuthenticationConfigInternetIdentity {
81 pub derivation_origin: Option<DomainName>,
82 pub external_alternative_origins: Option<Vec<DomainName>>,
83 }
84
85 #[derive(Default, CandidType, Serialize, Deserialize, Clone)]
86 pub struct AuthenticationRules {
87 pub allowed_callers: Vec<Principal>,
88 }
89
90 pub type OpenIdProviders = BTreeMap<OpenIdProvider, OpenIdProviderConfig>;
91
92 pub type OpenIdProviderClientId = String;
93
94 #[derive(Default, CandidType, Serialize, Deserialize, Clone, Debug)]
95 pub struct OpenIdProviderConfig {
96 pub client_id: OpenIdProviderClientId,
97 pub delegation: Option<OpenIdProviderDelegationConfig>,
98 }
99
100 #[derive(Default, CandidType, Serialize, Deserialize, Clone, Debug)]
101 pub struct OpenIdProviderDelegationConfig {
102 pub targets: Option<DelegationTargets>,
103 pub max_time_to_live: Option<u64>,
104 }
105}
106
107pub mod interface {
108 use crate::state::types::config::{
109 AuthenticationConfigInternetIdentity, AuthenticationConfigOpenId, AuthenticationRules,
110 };
111 use candid::{CandidType, Deserialize};
112 use junobuild_shared::types::state::Version;
113 use serde::Serialize;
114
115 #[derive(Default, CandidType, Serialize, Deserialize, Clone)]
116 pub struct SetAuthenticationConfig {
117 pub internet_identity: Option<AuthenticationConfigInternetIdentity>,
118 pub openid: Option<AuthenticationConfigOpenId>,
119 pub rules: Option<AuthenticationRules>,
120 pub version: Option<Version>,
121 }
122}