firebase_rs_sdk/app_check/
providers.rs

1use std::sync::Arc;
2
3use crate::app::FirebaseApp;
4
5use super::errors::{AppCheckError, AppCheckResult};
6use super::types::{AppCheckProvider, AppCheckToken};
7
8pub struct CustomProviderOptions {
9    pub get_token: Arc<dyn Fn() -> AppCheckResult<AppCheckToken> + Send + Sync + 'static>,
10    pub get_limited_use_token:
11        Option<Arc<dyn Fn() -> AppCheckResult<AppCheckToken> + Send + Sync + 'static>>,
12}
13
14impl CustomProviderOptions {
15    pub fn new<F>(callback: F) -> Self
16    where
17        F: Fn() -> AppCheckResult<AppCheckToken> + Send + Sync + 'static,
18    {
19        Self {
20            get_token: Arc::new(callback),
21            get_limited_use_token: None,
22        }
23    }
24
25    pub fn with_limited_use<F>(mut self, callback: F) -> Self
26    where
27        F: Fn() -> AppCheckResult<AppCheckToken> + Send + Sync + 'static,
28    {
29        self.get_limited_use_token = Some(Arc::new(callback));
30        self
31    }
32}
33
34pub struct CustomProvider {
35    options: CustomProviderOptions,
36}
37
38impl CustomProvider {
39    pub fn new<F>(callback: F) -> Self
40    where
41        F: Fn() -> AppCheckResult<AppCheckToken> + Send + Sync + 'static,
42    {
43        Self {
44            options: CustomProviderOptions::new(callback),
45        }
46    }
47
48    pub fn from_options(options: CustomProviderOptions) -> Self {
49        Self { options }
50    }
51}
52
53impl AppCheckProvider for CustomProvider {
54    fn get_token(&self) -> AppCheckResult<AppCheckToken> {
55        (self.options.get_token)()
56    }
57
58    fn get_limited_use_token(&self) -> AppCheckResult<AppCheckToken> {
59        if let Some(callback) = &self.options.get_limited_use_token {
60            callback()
61        } else {
62            (self.options.get_token)()
63        }
64    }
65}
66
67pub struct ReCaptchaV3Provider {
68    site_key: String,
69}
70
71impl ReCaptchaV3Provider {
72    pub fn new(site_key: String) -> Self {
73        Self { site_key }
74    }
75}
76
77impl AppCheckProvider for ReCaptchaV3Provider {
78    fn initialize(&self, _app: &FirebaseApp) {}
79
80    fn get_token(&self) -> AppCheckResult<AppCheckToken> {
81        Err(AppCheckError::ProviderError {
82            message: format!(
83                "ReCAPTCHA v3 provider (site key: {}) is not implemented in the Rust port",
84                self.site_key
85            ),
86        })
87    }
88}
89
90pub struct ReCaptchaEnterpriseProvider {
91    site_key: String,
92}
93
94impl ReCaptchaEnterpriseProvider {
95    pub fn new(site_key: String) -> Self {
96        Self { site_key }
97    }
98}
99
100impl AppCheckProvider for ReCaptchaEnterpriseProvider {
101    fn initialize(&self, _app: &FirebaseApp) {}
102
103    fn get_token(&self) -> AppCheckResult<AppCheckToken> {
104        Err(AppCheckError::ProviderError {
105            message: format!(
106                "ReCAPTCHA Enterprise provider (site key: {}) is not implemented in the Rust port",
107                self.site_key
108            ),
109        })
110    }
111}