aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Source/Remote
diff options
context:
space:
mode:
authorGravatar zxu <zxu@google.com>2018-02-27 14:04:39 -0500
committerGravatar GitHub <noreply@github.com>2018-02-27 14:04:39 -0500
commit3e7c062f3baca83fae1937bf60865be0cd18f96d (patch)
treeb9816a635f0deda9601496b0d41f6b064f99d838 /Firestore/Source/Remote
parent13aeb61de4fac4c0239bcf44a98a7d3aa9203963 (diff)
replacing Auth by C++ auth implementation (#802)
* lazy replacing FST(Firebase)CredentialsProvider by (Firebase)CredentialsProvider * lazy replacing FSTUser by User * adding error-code parameter to TokenListener * actually use const user& instead of pointer; also add an error util * add HashUser and pass into the unordered_map * use User in test * use c++ CredentialsProvider and subclass in test * fix unit test * use explicit capture in lambda instead of capture all by reference * cache currentUser explicitly when reset sync engineer test driver * objc object should be captured by value in lambda * replacing Auth/FSTUser by C++ auth implementation * address changes * replacing FSTGetTokenResult by C++ Token implementation * address changes * fix unintentional change in merging * patch the change in objc Auth up-stream * somehow, the lambda-version of set-user-change-listener does not work... fallback to block * address changes * fix another const& v.s. dispatch bug * fix more const& v.s. dispatch bug zxu123 committed * fix a bad sync line * address changes * address change * address change * fix upstream change from merge * fix upstream changes * Suggested fixes for cpp/port_auth (#846) * Get rid of MockDatastore factory This avoids the need to statically allocate (and leak) a credentials provider * Use absl::make_unique std::make_unique technically does not exist until C++14. * #include <utility> for std::move * Use std::future for the initial user * fix style
Diffstat (limited to 'Firestore/Source/Remote')
-rw-r--r--Firestore/Source/Remote/FSTDatastore.h9
-rw-r--r--Firestore/Source/Remote/FSTDatastore.mm51
-rw-r--r--Firestore/Source/Remote/FSTStream.h18
-rw-r--r--Firestore/Source/Remote/FSTStream.mm30
4 files changed, 60 insertions, 48 deletions
diff --git a/Firestore/Source/Remote/FSTDatastore.h b/Firestore/Source/Remote/FSTDatastore.h
index 481b6e8..7b8274c 100644
--- a/Firestore/Source/Remote/FSTDatastore.h
+++ b/Firestore/Source/Remote/FSTDatastore.h
@@ -18,6 +18,7 @@
#import "Firestore/Source/Core/FSTTypes.h"
+#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h"
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
#include "absl/strings/string_view.h"
@@ -35,8 +36,6 @@
@class GRPCCall;
@class GRXWriter;
-@protocol FSTCredentialsProvider;
-
NS_ASSUME_NONNULL_BEGIN
/**
@@ -56,13 +55,15 @@ NS_ASSUME_NONNULL_BEGIN
/** Creates a new Datastore instance with the given database info. */
+ (instancetype)datastoreWithDatabase:(const firebase::firestore::core::DatabaseInfo *)databaseInfo
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials;
+ credentials:(firebase::firestore::auth::CredentialsProvider *)
+ credentials; // no passing ownership
- (instancetype)init __attribute__((unavailable("Use a static constructor method.")));
- (instancetype)initWithDatabaseInfo:(const firebase::firestore::core::DatabaseInfo *)databaseInfo
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(firebase::firestore::auth::CredentialsProvider *)
+ credentials // no passing ownership
NS_DESIGNATED_INITIALIZER;
/**
diff --git a/Firestore/Source/Remote/FSTDatastore.mm b/Firestore/Source/Remote/FSTDatastore.mm
index a6029ee..cb4516e 100644
--- a/Firestore/Source/Remote/FSTDatastore.mm
+++ b/Firestore/Source/Remote/FSTDatastore.mm
@@ -22,7 +22,6 @@
#import "FIRFirestoreErrors.h"
#import "Firestore/Source/API/FIRFirestore+Internal.h"
#import "Firestore/Source/API/FIRFirestoreVersion.h"
-#import "Firestore/Source/Auth/FSTCredentialsProvider.h"
#import "Firestore/Source/Local/FSTLocalStore.h"
#import "Firestore/Source/Model/FSTDocument.h"
#import "Firestore/Source/Model/FSTDocumentKey.h"
@@ -35,12 +34,15 @@
#import "Firestore/Protos/objc/google/firestore/v1beta1/Firestore.pbrpc.h"
+#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h"
#include "Firestore/core/src/firebase/firestore/auth/token.h"
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
+#include "Firestore/core/src/firebase/firestore/util/error_apple.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
namespace util = firebase::firestore::util;
+using firebase::firestore::auth::CredentialsProvider;
using firebase::firestore::auth::Token;
using firebase::firestore::core::DatabaseInfo;
using firebase::firestore::model::DatabaseId;
@@ -70,8 +72,11 @@ typedef GRPCProtoCall * (^RPCFactory)(void);
@property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue;
-/** An object for getting an auth token before each request. */
-@property(nonatomic, strong, readonly) id<FSTCredentialsProvider> credentials;
+/**
+ * An object for getting an auth token before each request. Does not own the CredentialsProvider
+ * instance.
+ */
+@property(nonatomic, assign, readonly) CredentialsProvider *credentials;
@property(nonatomic, strong, readonly) FSTSerializerBeta *serializer;
@@ -81,7 +86,7 @@ typedef GRPCProtoCall * (^RPCFactory)(void);
+ (instancetype)datastoreWithDatabase:(const DatabaseInfo *)databaseInfo
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials {
+ credentials:(CredentialsProvider *)credentials {
return [[FSTDatastore alloc] initWithDatabaseInfo:databaseInfo
workerDispatchQueue:workerDispatchQueue
credentials:credentials];
@@ -89,7 +94,7 @@ typedef GRPCProtoCall * (^RPCFactory)(void);
- (instancetype)initWithDatabaseInfo:(const DatabaseInfo *)databaseInfo
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials {
+ credentials:(CredentialsProvider *)credentials {
if (self = [super init]) {
_databaseInfo = databaseInfo;
NSString *host = util::WrapNSStringNoCopy(databaseInfo->host());
@@ -301,24 +306,24 @@ typedef GRPCProtoCall * (^RPCFactory)(void);
errorHandler:(FSTVoidErrorBlock)errorHandler {
// TODO(mikelehen): We should force a refresh if the previous RPC failed due to an expired token,
// but I'm not sure how to detect that right now. http://b/32762461
- [self.credentials
- getTokenForcingRefresh:NO
- completion:^(Token result, NSError *_Nullable error) {
- error = [FSTDatastore firestoreErrorForError:error];
- [self.workerDispatchQueue dispatchAsyncAllowingSameQueue:^{
- if (error) {
- errorHandler(error);
- } else {
- GRPCProtoCall *rpc = rpcFactory();
- [FSTDatastore
- prepareHeadersForRPC:rpc
- databaseID:&self.databaseInfo->database_id()
- token:(result.is_valid() ? result.token()
- : absl::string_view())];
- [rpc start];
- }
- }];
- }];
+ _credentials->GetToken(
+ /*force_refresh=*/false,
+ [self, rpcFactory, errorHandler](Token result, const int64_t error_code,
+ const absl::string_view error_msg) {
+ NSError *error = util::WrapNSError(error_code, error_msg);
+ [self.workerDispatchQueue dispatchAsyncAllowingSameQueue:^{
+ if (error) {
+ errorHandler(error);
+ } else {
+ GRPCProtoCall *rpc = rpcFactory();
+ [FSTDatastore
+ prepareHeadersForRPC:rpc
+ databaseID:&self.databaseInfo->database_id()
+ token:(result.is_valid() ? result.token() : absl::string_view())];
+ [rpc start];
+ }
+ }];
+ });
}
- (FSTWatchStream *)createWatchStream {
diff --git a/Firestore/Source/Remote/FSTStream.h b/Firestore/Source/Remote/FSTStream.h
index 297d016..e48f1da 100644
--- a/Firestore/Source/Remote/FSTStream.h
+++ b/Firestore/Source/Remote/FSTStream.h
@@ -19,6 +19,7 @@
#import "Firestore/Source/Core/FSTTypes.h"
#import "Firestore/Source/Util/FSTDispatchQueue.h"
+#include "Firestore/core/src/firebase/firestore/auth/credentials_provider.h"
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
@class FSTDocumentKey;
@@ -34,7 +35,6 @@
@class GRPCCall;
@class GRXWriter;
-@protocol FSTCredentialsProvider;
@protocol FSTWatchStreamDelegate;
@protocol FSTWriteStreamDelegate;
@@ -47,7 +47,7 @@ NS_ASSUME_NONNULL_BEGIN
*
* - Restarting a stream is allowed (after failure)
* - Exponential backoff on failure (independent of the underlying channel)
- * - Authentication via FSTCredentialsProvider
+ * - Authentication via CredentialsProvider
* - Dispatching all callbacks into the shared worker queue
*
* Subclasses of FSTStream implement serialization of models to and from bytes (via protocol
@@ -94,7 +94,7 @@ NS_ASSUME_NONNULL_BEGIN
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
connectionTimerID:(FSTTimerID)connectionTimerID
idleTimerID:(FSTTimerID)idleTimerID
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(firebase::firestore::auth::CredentialsProvider *)credentials // no passing ownership
responseMessageClass:(Class)responseMessageClass NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@@ -208,14 +208,16 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(firebase::firestore::auth::CredentialsProvider *)
+ credentials // no passsing ownership
serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
connectionTimerID:(FSTTimerID)connectionTimerID
idleTimerID:(FSTTimerID)idleTimerID
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(firebase::firestore::auth::CredentialsProvider *)
+ credentials // no passing ownership
responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE;
- (instancetype)init NS_UNAVAILABLE;
@@ -284,14 +286,16 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(firebase::firestore::auth::CredentialsProvider *)
+ credentials // no passing ownership
serializer:(FSTSerializerBeta *)serializer;
- (instancetype)initWithDatabase:(const firebase::firestore::core::DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
connectionTimerID:(FSTTimerID)connectionTimerID
idleTimerID:(FSTTimerID)idleTimerID
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(firebase::firestore::auth::CredentialsProvider *)
+ credentials // no passing ownership
responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE;
- (instancetype)init NS_UNAVAILABLE;
diff --git a/Firestore/Source/Remote/FSTStream.mm b/Firestore/Source/Remote/FSTStream.mm
index a9aa245..6bec3ad 100644
--- a/Firestore/Source/Remote/FSTStream.mm
+++ b/Firestore/Source/Remote/FSTStream.mm
@@ -21,7 +21,6 @@
#import "FIRFirestoreErrors.h"
#import "Firestore/Source/API/FIRFirestore+Internal.h"
-#import "Firestore/Source/Auth/FSTCredentialsProvider.h"
#import "Firestore/Source/Local/FSTQueryData.h"
#import "Firestore/Source/Model/FSTMutation.h"
#import "Firestore/Source/Remote/FSTBufferedWriter.h"
@@ -38,9 +37,11 @@
#include "Firestore/core/src/firebase/firestore/auth/token.h"
#include "Firestore/core/src/firebase/firestore/core/database_info.h"
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
+#include "Firestore/core/src/firebase/firestore/util/error_apple.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
namespace util = firebase::firestore::util;
+using firebase::firestore::auth::CredentialsProvider;
using firebase::firestore::auth::Token;
using firebase::firestore::core::DatabaseInfo;
using firebase::firestore::model::DatabaseId;
@@ -103,12 +104,12 @@ typedef NS_ENUM(NSInteger, FSTStreamState) {
*/
- (instancetype)initWithDatabase:(const DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(CredentialsProvider *)credentials
serializer:(FSTSerializerBeta *)serializer NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithDatabase:(const DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(CredentialsProvider *)credentials
responseMessageClass:(Class)responseMessageClass NS_UNAVAILABLE;
@end
@@ -126,7 +127,7 @@ typedef NS_ENUM(NSInteger, FSTStreamState) {
// Does not own this DatabaseInfo.
@property(nonatomic, assign, readonly) const DatabaseInfo *databaseInfo;
@property(nonatomic, strong, readonly) FSTDispatchQueue *workerDispatchQueue;
-@property(nonatomic, strong, readonly) id<FSTCredentialsProvider> credentials;
+@property(nonatomic, assign, readonly) CredentialsProvider *credentials;
@property(nonatomic, unsafe_unretained, readonly) Class responseMessageClass;
@property(nonatomic, strong, readonly) FSTExponentialBackoff *backoff;
@@ -213,7 +214,7 @@ static const NSTimeInterval kIdleTimeout = 60.0;
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
connectionTimerID:(FSTTimerID)connectionTimerID
idleTimerID:(FSTTimerID)idleTimerID
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(CredentialsProvider *)credentials
responseMessageClass:(Class)responseMessageClass {
if (self = [super init]) {
_databaseInfo = database;
@@ -263,13 +264,14 @@ static const NSTimeInterval kIdleTimeout = 60.0;
FSTAssert(_delegate == nil, @"Delegate must be nil");
_delegate = delegate;
- [self.credentials getTokenForcingRefresh:NO
- completion:^(Token result, NSError *_Nullable error) {
- error = [FSTDatastore firestoreErrorForError:error];
- [self.workerDispatchQueue dispatchAsyncAllowingSameQueue:^{
- [self resumeStartWithToken:result error:error];
- }];
- }];
+ _credentials->GetToken(
+ /*force_refresh=*/false,
+ [self](Token result, const int64_t error_code, const absl::string_view error_msg) {
+ NSError *error = util::WrapNSError(error_code, error_msg);
+ [self.workerDispatchQueue dispatchAsyncAllowingSameQueue:^{
+ [self resumeStartWithToken:result error:error];
+ }];
+ });
}
/** Add an access token to our RPC, after obtaining one from the credentials provider. */
@@ -614,7 +616,7 @@ static const NSTimeInterval kIdleTimeout = 60.0;
- (instancetype)initWithDatabase:(const DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(CredentialsProvider *)credentials
serializer:(FSTSerializerBeta *)serializer {
self = [super initWithDatabase:database
workerDispatchQueue:workerDispatchQueue
@@ -699,7 +701,7 @@ static const NSTimeInterval kIdleTimeout = 60.0;
- (instancetype)initWithDatabase:(const DatabaseInfo *)database
workerDispatchQueue:(FSTDispatchQueue *)workerDispatchQueue
- credentials:(id<FSTCredentialsProvider>)credentials
+ credentials:(CredentialsProvider *)credentials
serializer:(FSTSerializerBeta *)serializer {
self = [super initWithDatabase:database
workerDispatchQueue:workerDispatchQueue