From a3dfe083bf3b046d58701bcdf2ace1c92b6cf76e Mon Sep 17 00:00:00 2001 From: Chuan Ren Date: Thu, 10 Jan 2019 16:45:38 -0800 Subject: [PATCH] Support NSSecureCoding for auth credentials (#2242) --- Example/Auth/Sample/MainViewController.m | 4 +-- .../FIREmailPasswordAuthCredential.h | 2 +- .../FIREmailPasswordAuthCredential.m | 26 ++++++++++++++++ .../Facebook/FIRFacebookAuthCredential.h | 2 +- .../Facebook/FIRFacebookAuthCredential.m | 16 ++++++++++ .../GameCenter/FIRGameCenterAuthCredential.h | 2 +- .../GameCenter/FIRGameCenterAuthCredential.m | 31 +++++++++++++++++++ .../GitHub/FIRGitHubAuthCredential.h | 2 +- .../GitHub/FIRGitHubAuthCredential.m | 16 ++++++++++ .../Google/FIRGoogleAuthCredential.h | 2 +- .../Google/FIRGoogleAuthCredential.m | 18 +++++++++++ .../AuthProviders/OAuth/FIROAuthCredential.h | 2 +- .../AuthProviders/OAuth/FIROAuthCredential.m | 18 +++++++++++ .../Phone/FIRPhoneAuthCredential.m | 28 +++++++++++++++++ .../Twitter/FIRTwitterAuthCredential.h | 2 +- .../Twitter/FIRTwitterAuthCredential.m | 18 +++++++++++ Firebase/Auth/Source/FIRAuthCredential.m | 2 +- .../Source/Public/FIRPhoneAuthCredential.h | 2 +- 18 files changed, 182 insertions(+), 11 deletions(-) diff --git a/Example/Auth/Sample/MainViewController.m b/Example/Auth/Sample/MainViewController.m index 6f19ef7b09..e8c04f606f 100644 --- a/Example/Auth/Sample/MainViewController.m +++ b/Example/Auth/Sample/MainViewController.m @@ -2310,11 +2310,11 @@ static NSDictionary *parseURL(NSString *urlString) { } /** @fn getAppTokenWithForce: - @brief Gets the token from @c FIRApp , optionally a refreshed one. + @brief Gets the token from @c FIRAuth , optionally a refreshed one. @param force Whether the refresh is forced or not. */ - (void)getAppTokenWithForce:(BOOL)force { - [[FIRApp defaultApp] getTokenForcingRefresh:force withCallback:[self tokenCallback]]; + [[FIRAuth auth] getTokenForcingRefresh:force withCallback:[self tokenCallback]]; } /** @fn setDisplayName diff --git a/Firebase/Auth/Source/AuthProviders/EmailPassword/FIREmailPasswordAuthCredential.h b/Firebase/Auth/Source/AuthProviders/EmailPassword/FIREmailPasswordAuthCredential.h index 7625685fcf..dc719acdc0 100644 --- a/Firebase/Auth/Source/AuthProviders/EmailPassword/FIREmailPasswordAuthCredential.h +++ b/Firebase/Auth/Source/AuthProviders/EmailPassword/FIREmailPasswordAuthCredential.h @@ -23,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN /** @class FIREmailPasswordAuthCredential @brief Internal implementation of FIRAuthCredential for Email/Password credentials. */ -@interface FIREmailPasswordAuthCredential : FIRAuthCredential +@interface FIREmailPasswordAuthCredential : FIRAuthCredential /** @property email @brief The user's email address. diff --git a/Firebase/Auth/Source/AuthProviders/EmailPassword/FIREmailPasswordAuthCredential.m b/Firebase/Auth/Source/AuthProviders/EmailPassword/FIREmailPasswordAuthCredential.m index 71cc330aa4..28bc43b80d 100644 --- a/Firebase/Auth/Source/AuthProviders/EmailPassword/FIREmailPasswordAuthCredential.m +++ b/Firebase/Auth/Source/AuthProviders/EmailPassword/FIREmailPasswordAuthCredential.m @@ -57,4 +57,30 @@ @"Attempt to call prepareVerifyAssertionRequest: on a FIREmailPasswordAuthCredential."]; } +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *email = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"email"]; + NSString *password = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"password"]; + NSString *link = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"link"]; + if (email.length && password.length) { + self = [self initWithEmail:email password:password]; + } else if (email.length && link.length) { + self = [self initWithEmail:email link:link]; + } else { + self = nil; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.email forKey:@"email"]; + [aCoder encodeObject:self.password forKey:@"password"]; + [aCoder encodeObject:self.link forKey:@"link"]; +} + @end diff --git a/Firebase/Auth/Source/AuthProviders/Facebook/FIRFacebookAuthCredential.h b/Firebase/Auth/Source/AuthProviders/Facebook/FIRFacebookAuthCredential.h index 47ab18a34c..29849a10a2 100644 --- a/Firebase/Auth/Source/AuthProviders/Facebook/FIRFacebookAuthCredential.h +++ b/Firebase/Auth/Source/AuthProviders/Facebook/FIRFacebookAuthCredential.h @@ -23,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN /** @class FIRFacebookAuthCredential @brief Internal implementation of FIRAuthCredential for the Facebook IdP. */ -@interface FIRFacebookAuthCredential : FIRAuthCredential +@interface FIRFacebookAuthCredential : FIRAuthCredential /** @fn initWithAccessToken: @brief Designated initializer. diff --git a/Firebase/Auth/Source/AuthProviders/Facebook/FIRFacebookAuthCredential.m b/Firebase/Auth/Source/AuthProviders/Facebook/FIRFacebookAuthCredential.m index 1c3576a1ef..d48033785e 100644 --- a/Firebase/Auth/Source/AuthProviders/Facebook/FIRFacebookAuthCredential.m +++ b/Firebase/Auth/Source/AuthProviders/Facebook/FIRFacebookAuthCredential.m @@ -48,4 +48,20 @@ request.providerAccessToken = _accessToken; } +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *accessToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"accessToken"]; + self = [self initWithAccessToken:accessToken]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_accessToken forKey:@"accessToken"]; +} + @end diff --git a/Firebase/Auth/Source/AuthProviders/GameCenter/FIRGameCenterAuthCredential.h b/Firebase/Auth/Source/AuthProviders/GameCenter/FIRGameCenterAuthCredential.h index a99b96e525..ee1d21b97f 100644 --- a/Firebase/Auth/Source/AuthProviders/GameCenter/FIRGameCenterAuthCredential.h +++ b/Firebase/Auth/Source/AuthProviders/GameCenter/FIRGameCenterAuthCredential.h @@ -23,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN /** @class FIRGameCenterAuthCredential @brief Internal implementation of FIRAuthCredential for Game Center credentials. */ -@interface FIRGameCenterAuthCredential : FIRAuthCredential +@interface FIRGameCenterAuthCredential : FIRAuthCredential /** @property playerID @brief The ID of the Game Center local player. diff --git a/Firebase/Auth/Source/AuthProviders/GameCenter/FIRGameCenterAuthCredential.m b/Firebase/Auth/Source/AuthProviders/GameCenter/FIRGameCenterAuthCredential.m index 4ccd408b3d..b98aec19cf 100644 --- a/Firebase/Auth/Source/AuthProviders/GameCenter/FIRGameCenterAuthCredential.m +++ b/Firebase/Auth/Source/AuthProviders/GameCenter/FIRGameCenterAuthCredential.m @@ -52,4 +52,35 @@ @"Attempt to call prepareVerifyAssertionRequest: on a FIRGameCenterAuthCredential."]; } +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *playerID = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"playerID"]; + NSURL *publicKeyURL = [aDecoder decodeObjectOfClass:[NSURL class] forKey:@"publicKeyURL"]; + NSData *signature = [aDecoder decodeObjectOfClass:[NSData class] forKey:@"signature"]; + NSData *salt = [aDecoder decodeObjectOfClass:[NSData class] forKey:@"salt"]; + NSNumber *timestamp = [aDecoder decodeObjectOfClass:[NSNumber class] forKey:@"timestamp"]; + NSString *displayName = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"displayName"]; + self = [self initWithPlayerID:playerID + publicKeyURL:publicKeyURL + signature:signature + salt:salt + timestamp:timestamp.unsignedLongLongValue + displayName:displayName]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.playerID forKey:@"playerID"]; + [aCoder encodeObject:self.publicKeyURL forKey:@"publicKeyURL"]; + [aCoder encodeObject:self.signature forKey:@"signature"]; + [aCoder encodeObject:self.salt forKey:@"salt"]; + [aCoder encodeObject:[NSNumber numberWithUnsignedLongLong:self.timestamp] forKey:@"timestamp"]; + [aCoder encodeObject:self.displayName forKey:@"displayName"]; +} + @end diff --git a/Firebase/Auth/Source/AuthProviders/GitHub/FIRGitHubAuthCredential.h b/Firebase/Auth/Source/AuthProviders/GitHub/FIRGitHubAuthCredential.h index bfb5479dde..ba406f7ef3 100644 --- a/Firebase/Auth/Source/AuthProviders/GitHub/FIRGitHubAuthCredential.h +++ b/Firebase/Auth/Source/AuthProviders/GitHub/FIRGitHubAuthCredential.h @@ -23,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN /** @class FIRGitHubAuthCredential @brief Internal implementation of FIRAuthCredential for GitHub credentials. */ -@interface FIRGitHubAuthCredential : FIRAuthCredential +@interface FIRGitHubAuthCredential : FIRAuthCredential /** @property token @brief The GitHub OAuth access token. diff --git a/Firebase/Auth/Source/AuthProviders/GitHub/FIRGitHubAuthCredential.m b/Firebase/Auth/Source/AuthProviders/GitHub/FIRGitHubAuthCredential.m index a0185eb3ad..c3737db21f 100644 --- a/Firebase/Auth/Source/AuthProviders/GitHub/FIRGitHubAuthCredential.m +++ b/Firebase/Auth/Source/AuthProviders/GitHub/FIRGitHubAuthCredential.m @@ -46,4 +46,20 @@ request.providerAccessToken = _token; } +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *token = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"token"]; + self = [self initWithToken:token]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.token forKey:@"token"]; +} + @end diff --git a/Firebase/Auth/Source/AuthProviders/Google/FIRGoogleAuthCredential.h b/Firebase/Auth/Source/AuthProviders/Google/FIRGoogleAuthCredential.h index bacab636f8..23e2d682c5 100644 --- a/Firebase/Auth/Source/AuthProviders/Google/FIRGoogleAuthCredential.h +++ b/Firebase/Auth/Source/AuthProviders/Google/FIRGoogleAuthCredential.h @@ -23,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN /** @class FIRGoogleAuthCredential @brief Internal implementation of FIRAuthCredential for the Google IdP. */ -@interface FIRGoogleAuthCredential : FIRAuthCredential +@interface FIRGoogleAuthCredential : FIRAuthCredential /** @fn initWithIDToken:accessToken: @brief Designated initializer. diff --git a/Firebase/Auth/Source/AuthProviders/Google/FIRGoogleAuthCredential.m b/Firebase/Auth/Source/AuthProviders/Google/FIRGoogleAuthCredential.m index d66b2e28cd..fdc9e1a5d2 100644 --- a/Firebase/Auth/Source/AuthProviders/Google/FIRGoogleAuthCredential.m +++ b/Firebase/Auth/Source/AuthProviders/Google/FIRGoogleAuthCredential.m @@ -51,4 +51,22 @@ request.providerAccessToken = _accessToken; } +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *IDToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"IDToken"]; + NSString *accessToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"accessToken"]; + self = [self initWithIDToken:IDToken accessToken:accessToken]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:_IDToken forKey:@"IDToken"]; + [aCoder encodeObject:_accessToken forKey:@"accessToken"]; +} + @end diff --git a/Firebase/Auth/Source/AuthProviders/OAuth/FIROAuthCredential.h b/Firebase/Auth/Source/AuthProviders/OAuth/FIROAuthCredential.h index c7241a1559..be6209efb6 100644 --- a/Firebase/Auth/Source/AuthProviders/OAuth/FIROAuthCredential.h +++ b/Firebase/Auth/Source/AuthProviders/OAuth/FIROAuthCredential.h @@ -23,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN /** @class FIROAuthCredential @brief Internal implementation of FIRAuthCredential for generic credentials. */ -@interface FIROAuthCredential : FIRAuthCredential +@interface FIROAuthCredential : FIRAuthCredential /** @property IDToken @brief The ID Token associated with this credential. diff --git a/Firebase/Auth/Source/AuthProviders/OAuth/FIROAuthCredential.m b/Firebase/Auth/Source/AuthProviders/OAuth/FIROAuthCredential.m index 67633d8e11..eb824020aa 100644 --- a/Firebase/Auth/Source/AuthProviders/OAuth/FIROAuthCredential.m +++ b/Firebase/Auth/Source/AuthProviders/OAuth/FIROAuthCredential.m @@ -44,6 +44,24 @@ NS_ASSUME_NONNULL_BEGIN request.providerAccessToken = _accessToken; } +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *IDToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"IDToken"]; + NSString *accessToken = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"accessToken"]; + self = [self initWithProviderID:self.provider IDToken:IDToken accessToken:accessToken]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.IDToken forKey:@"IDToken"]; + [aCoder encodeObject:self.accessToken forKey:@"accessToken"]; +} + NS_ASSUME_NONNULL_END @end diff --git a/Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthCredential.m b/Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthCredential.m index c7e8bb1787..64f79b8e0e 100644 --- a/Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthCredential.m +++ b/Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthCredential.m @@ -59,6 +59,34 @@ NS_ASSUME_NONNULL_BEGIN return self; } +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *verificationID = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"verificationID"]; + NSString *verificationCode = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"verificationCode"]; + NSString *temporaryProof = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"temporaryProof"]; + NSString *phoneNumber = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"phoneNumber"]; + if (temporaryProof.length && phoneNumber.length) { + self = [self initWithTemporaryProof:temporaryProof phoneNumber:phoneNumber providerID:self.provider]; + } else if (verificationID.length && verificationCode.length) { + self = [self initWithProviderID:self.provider verificationID:verificationID verificationCode:verificationCode]; + } else { + self = nil; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.verificationID forKey:@"verificationID"]; + [aCoder encodeObject:self.verificationCode forKey:@"verificationCode"]; + [aCoder encodeObject:self.temporaryProof forKey:@"temporaryProof"]; + [aCoder encodeObject:self.phoneNumber forKey:@"phoneNumber"]; +} + @end NS_ASSUME_NONNULL_END diff --git a/Firebase/Auth/Source/AuthProviders/Twitter/FIRTwitterAuthCredential.h b/Firebase/Auth/Source/AuthProviders/Twitter/FIRTwitterAuthCredential.h index 0ff44fa597..423d595a4e 100644 --- a/Firebase/Auth/Source/AuthProviders/Twitter/FIRTwitterAuthCredential.h +++ b/Firebase/Auth/Source/AuthProviders/Twitter/FIRTwitterAuthCredential.h @@ -23,7 +23,7 @@ NS_ASSUME_NONNULL_BEGIN /** @class FIRTwitterAuthCredential @brief Internal implementation of FIRAuthCredential for Twitter credentials. */ -@interface FIRTwitterAuthCredential : FIRAuthCredential +@interface FIRTwitterAuthCredential : FIRAuthCredential /** @property token @brief The Twitter OAuth token. diff --git a/Firebase/Auth/Source/AuthProviders/Twitter/FIRTwitterAuthCredential.m b/Firebase/Auth/Source/AuthProviders/Twitter/FIRTwitterAuthCredential.m index 6772d6f6a0..b7e45773ef 100644 --- a/Firebase/Auth/Source/AuthProviders/Twitter/FIRTwitterAuthCredential.m +++ b/Firebase/Auth/Source/AuthProviders/Twitter/FIRTwitterAuthCredential.m @@ -48,4 +48,22 @@ request.providerOAuthTokenSecret = _secret; } +#pragma mark - NSSecureCoding + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { + NSString *token = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"token"]; + NSString *secret = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"secret"]; + self = [self initWithToken:token secret:secret]; + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.token forKey:@"token"]; + [aCoder encodeObject:self.secret forKey:@"secret"]; +} + @end diff --git a/Firebase/Auth/Source/FIRAuthCredential.m b/Firebase/Auth/Source/FIRAuthCredential.m index 54cb15cf18..63a08c46c8 100644 --- a/Firebase/Auth/Source/FIRAuthCredential.m +++ b/Firebase/Auth/Source/FIRAuthCredential.m @@ -21,7 +21,7 @@ - (instancetype)init { @throw [NSException exceptionWithName:@"Attempt to call unavailable initializer." reason:@"This class is an abstract base class. It's init method " - "should not be called directly." + "should not be called directly." userInfo:nil]; } diff --git a/Firebase/Auth/Source/Public/FIRPhoneAuthCredential.h b/Firebase/Auth/Source/Public/FIRPhoneAuthCredential.h index 26dfca85ac..9f5f596412 100644 --- a/Firebase/Auth/Source/Public/FIRPhoneAuthCredential.h +++ b/Firebase/Auth/Source/Public/FIRPhoneAuthCredential.h @@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN @brief Implementation of FIRAuthCredential for Phone Auth credentials. */ NS_SWIFT_NAME(PhoneAuthCredential) -@interface FIRPhoneAuthCredential : FIRAuthCredential +@interface FIRPhoneAuthCredential : FIRAuthCredential /** @fn init @brief This class is not supposed to be instantiated directly.