smart_account_auth/
traits.rs1#[cfg(feature = "session")]
2pub use crate::messages::actions::DerivableMsg;
3#[cfg(feature = "replay")]
4pub use saa_crypto::ReplayProtection;
5#[cfg(any(feature = "wasm", feature = "native"))]
6use crate::data::VerifiedData;
7
8pub use saa_common::{Verifiable, Identifiable};
9#[cfg(all(any(feature = "native", feature = "wasm"), feature = "replay"))]
10use saa_crypto::ReplayParams;
11pub use super::wrapper::CredentialsWrapper;
12
13use crate::{Credential, CredentialData};
14
15#[cfg(feature = "wasm")]
16use saa_common::wasm::{Env, MessageInfo, Deps};
17use saa_common::AuthError;
18
19
20
21
22impl crate::CredentialsWrapper for CredentialData {
23 type Credential = Credential;
24
25 fn credentials(&self) -> &Vec<Self::Credential> {
26 &self.credentials
27 }
28
29 fn primary_index(&self) -> Option<usize> {
30 self.primary_index.clone()
31 }
32
33 fn validate(&self, sender: impl AsRef<str> )-> Result<(), AuthError> {
34 self.validate_logic(sender.as_ref(), None)?;
35 self.credentials.iter().try_for_each(|c| c.validate())
36 }
37
38 #[allow(unused_variables)]
39 #[cfg(any(feature = "native", feature = "wasm"))]
40 fn verify(&self,
41 #[cfg(feature = "wasm")]
42 deps: Deps, env: &Env, info: &MessageInfo,
43 #[cfg(not(feature = "wasm"))]
44 sender: String,
45 #[cfg(feature = "replay")]
46 params: ReplayParams
47 ) -> Result<crate::VerifiedData, AuthError> {
48 #[cfg(feature = "wasm")]
49 let sender = info.sender.clone();
50 let mut pre_val = self.pre_validate.unwrap_or_default();
51 let override_primary = self.override_primary.unwrap_or_default();
52 let data = self.with_native(sender.as_str());
53 let len = data.credentials.len();
54
55 if pre_val || len <= 1 {
56 data.validate(sender.as_ref())?;
57 #[cfg(feature = "replay")]
58 self.credentials()
59 .into_iter()
60 .try_for_each(|c| c.protect_reply(
61 #[cfg(feature = "wasm")]
62 env,
63 params.clone()
64 ))?;
65 pre_val = true;
66 }
67
68 let mut credentials = Vec::with_capacity(len);
69 let mut addresses = Vec::with_capacity(len);
70 let mut has_natives = false;
71 let mut has_extensions = false;
72
73 data.credentials
74 .clone()
75 .into_iter()
76 .try_for_each(|c|
77 {
78 if !pre_val {
80 c.validate()?;
81 #[cfg(feature = "replay")]
82 c.protect_reply(
83 #[cfg(feature = "wasm")]
84 env,
85 params.clone()
86 )?;
87 }
88 let info = c.verify(
90 #[cfg(feature = "wasm")]
91 deps
92 )?;
93 has_extensions |= info.extension.is_some();
94 has_natives |= info.name == saa_common::CredentialName::Native;
95
96 if let Some(address) = info.address.clone() {
97 addresses.push(address);
98 }
99 credentials.push((c.cred_id().to_lowercase(), info));
100 Ok::<(), AuthError>(())
101 })?;
102
103 data.validate_logic(sender.as_str(), Some(&credentials))?;
105
106 Ok(VerifiedData {
107 primary_id: data.primary_id().to_lowercase(),
108 credentials,
109 addresses,
110 has_natives,
111 has_extensions,
112 override_primary,
113 #[cfg(feature = "replay")]
114 nonce: params.nonce + 1,
115 })
116 }
117
118
119
120}