firebase_rs_sdk/app_check/
providers.rs1use 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}