|
14 | 14 |
|
15 | 15 | #include "app_check/src/ios/app_check_ios.h" |
16 | 16 |
|
| 17 | +#import "FIRApp.h" |
| 18 | +#import "FIRAppCheckProvider.h" |
| 19 | +#import "FIRAppCheckProviderFactory.h" |
17 | 20 | #import "FIRAppCheckToken.h" |
18 | 21 |
|
| 22 | +#include "app/src/app_common.h" |
| 23 | +#include "app/src/app_ios.h" |
| 24 | +#include "app/src/util_ios.h" |
19 | 25 | #include "app_check/src/common/common.h" |
| 26 | +#include "app_check/src/ios/util_ios.h" |
20 | 27 | #include "firebase/app_check.h" |
21 | 28 |
|
| 29 | +// Defines an iOS AppCheckProvider that wraps a given C++ Provider. |
| 30 | +@interface CppAppCheckProvider : NSObject <FIRAppCheckProvider> |
| 31 | + |
| 32 | +@property(nonatomic, nullable) firebase::app_check::AppCheckProvider* cppProvider; |
| 33 | + |
| 34 | +- (id)initWithProvider:(firebase::app_check::AppCheckProvider* _Nonnull)provider; |
| 35 | + |
| 36 | +@end |
| 37 | + |
| 38 | +@implementation CppAppCheckProvider |
| 39 | + |
| 40 | +- (id)initWithProvider:(firebase::app_check::AppCheckProvider* _Nonnull)provider { |
| 41 | + self = [super init]; |
| 42 | + if (self) { |
| 43 | + self.cppProvider = provider; |
| 44 | + } |
| 45 | + return self; |
| 46 | +} |
| 47 | + |
| 48 | +- (void)getTokenWithCompletion:(nonnull void (^)(FIRAppCheckToken* _Nullable, |
| 49 | + NSError* _Nullable))handler { |
| 50 | + auto token_callback{[handler](firebase::app_check::AppCheckToken token, int error_code, |
| 51 | + const std::string& error_message) { |
| 52 | + NSError* ios_error = firebase::app_check::internal::AppCheckErrorToNSError( |
| 53 | + static_cast<firebase::app_check::AppCheckError>(error_code), error_message); |
| 54 | + FIRAppCheckToken* ios_token = |
| 55 | + firebase::app_check::internal::AppCheckTokenToFIRAppCheckToken(token); |
| 56 | + handler(ios_token, ios_error); |
| 57 | + }}; |
| 58 | + _cppProvider->GetToken(token_callback); |
| 59 | +} |
| 60 | + |
| 61 | +@end |
| 62 | + |
| 63 | +// Defines an iOS AppCheckProviderFactory that wraps a given C++ Factory. |
| 64 | +@interface CppAppCheckProviderFactory : NSObject <FIRAppCheckProviderFactory> |
| 65 | + |
| 66 | +@property(nonatomic, nullable) firebase::app_check::AppCheckProviderFactory* cppProviderFactory; |
| 67 | + |
| 68 | +- (id)initWithProviderFactory:(firebase::app_check::AppCheckProviderFactory* _Nonnull)factory; |
| 69 | + |
| 70 | +@end |
| 71 | + |
| 72 | +@implementation CppAppCheckProviderFactory |
| 73 | + |
| 74 | +- (id)initWithProviderFactory:(firebase::app_check::AppCheckProviderFactory* _Nonnull)factory { |
| 75 | + self = [super init]; |
| 76 | + if (self) { |
| 77 | + self.cppProviderFactory = factory; |
| 78 | + } |
| 79 | + return self; |
| 80 | +} |
| 81 | + |
| 82 | +- (nullable id<FIRAppCheckProvider>)createProviderWithApp:(FIRApp*)app { |
| 83 | + std::string app_name = firebase::util::NSStringToString(app.name); |
| 84 | + firebase::App* cpp_app = firebase::app_common::FindAppByName(app_name.c_str()); |
| 85 | + if (cpp_app == nullptr) { |
| 86 | + cpp_app = firebase::internal::FindPartialAppByName(app_name.c_str()); |
| 87 | + } |
| 88 | + firebase::app_check::AppCheckProvider* cppProvider = _cppProviderFactory->CreateProvider(cpp_app); |
| 89 | + return [[CppAppCheckProvider alloc] initWithProvider:cppProvider]; |
| 90 | +} |
| 91 | + |
| 92 | +@end |
| 93 | + |
22 | 94 | namespace firebase { |
23 | 95 | namespace app_check { |
24 | 96 | namespace internal { |
25 | 97 |
|
26 | | -static AppCheckProviderFactory* g_provider_factory = nullptr; |
27 | | - |
28 | 98 | AppCheckInternal::AppCheckInternal(App* app) : app_(app) { |
29 | 99 | future_manager().AllocFutureApi(this, kAppCheckFnCount); |
| 100 | + impl_ = MakeUnique<FIRAppCheckPointer>([FIRAppCheck appCheck]); |
30 | 101 | } |
31 | 102 |
|
32 | 103 | AppCheckInternal::~AppCheckInternal() { |
|
41 | 112 | } |
42 | 113 |
|
43 | 114 | void AppCheckInternal::SetAppCheckProviderFactory(AppCheckProviderFactory* factory) { |
44 | | - g_provider_factory = factory; |
| 115 | + CppAppCheckProviderFactory* ios_factory = |
| 116 | + [[CppAppCheckProviderFactory alloc] initWithProviderFactory:factory]; |
| 117 | + [FIRAppCheck setAppCheckProviderFactory:ios_factory]; |
45 | 118 | } |
46 | 119 |
|
47 | | -void AppCheckInternal::SetTokenAutoRefreshEnabled(bool is_token_auto_refresh_enabled) {} |
| 120 | +void AppCheckInternal::SetTokenAutoRefreshEnabled(bool is_token_auto_refresh_enabled) { |
| 121 | + impl().isTokenAutoRefreshEnabled = is_token_auto_refresh_enabled; |
| 122 | +} |
48 | 123 |
|
49 | 124 | Future<AppCheckToken> AppCheckInternal::GetAppCheckToken(bool force_refresh) { |
50 | | - auto handle = future()->SafeAlloc<AppCheckToken>(kAppCheckFnGetAppCheckToken); |
51 | | - AppCheckToken token; |
52 | | - future()->CompleteWithResult(handle, 0, token); |
| 125 | + SafeFutureHandle<AppCheckToken> handle = |
| 126 | + future()->SafeAlloc<AppCheckToken>(kAppCheckFnGetAppCheckToken); |
| 127 | + |
| 128 | + // __block allows handle to be referenced inside the objective C completion. |
| 129 | + __block SafeFutureHandle<AppCheckToken>* handle_in_block = &handle; |
| 130 | + [impl() |
| 131 | + tokenForcingRefresh:force_refresh |
| 132 | + completion:^(FIRAppCheckToken* _Nullable token, NSError* _Nullable error) { |
| 133 | + AppCheckToken cpp_token = AppCheckTokenFromFIRAppCheckToken(token); |
| 134 | + if (error != nil) { |
| 135 | + NSLog(@"Unable to retrieve App Check token: %@", error); |
| 136 | + int error_code = firebase::app_check::internal::AppCheckErrorFromNSError(error); |
| 137 | + std::string error_message = util::NSStringToString(error.localizedDescription); |
| 138 | + |
| 139 | + future()->CompleteWithResult(*handle_in_block, error_code, error_message.c_str(), |
| 140 | + cpp_token); |
| 141 | + return; |
| 142 | + } |
| 143 | + if (token == nil) { |
| 144 | + NSLog(@"App Check token is nil."); |
| 145 | + future()->CompleteWithResult(*handle_in_block, kAppCheckErrorUnknown, |
| 146 | + "AppCheck GetToken returned an empty token.", |
| 147 | + cpp_token); |
| 148 | + return; |
| 149 | + } |
| 150 | + future()->CompleteWithResult(*handle_in_block, kAppCheckErrorNone, cpp_token); |
| 151 | + }]; |
53 | 152 | return MakeFuture(future(), handle); |
54 | 153 | } |
55 | 154 |
|
|
0 commit comments