Skip to main content

smart_account_auth/
traits.rs

1#[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 not pre-validated, validating each one by one
79            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            // verify siganture and get extracted info like address, name, etc.
89            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        // running a post check in any scenario
104        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}