From e29010caf2478c7b6d4cbb4a3fe8238f36b4fe22 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Wed, 11 Apr 2018 09:07:06 -0700 Subject: Update component versions for 4.12.1 --- Example/Podfile | 2 +- Firebase/Core/FIROptions.m | 2 +- FirebaseCore.podspec | 2 +- Firestore/Example/Podfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Example/Podfile b/Example/Podfile index 27204be..4448620 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -8,7 +8,7 @@ target 'Core_Example_iOS' do # The next line is the forcing function for the Firebase pod. The Firebase # version's subspecs should depend on the component versions in their # corresponding podspec's. - pod 'Firebase/Core', '4.12.0' + pod 'Firebase/Core', '4.12.1' target 'Core_Tests_iOS' do inherit! :search_paths diff --git a/Firebase/Core/FIROptions.m b/Firebase/Core/FIROptions.m index 52c254e..135ed3b 100644 --- a/Firebase/Core/FIROptions.m +++ b/Firebase/Core/FIROptions.m @@ -43,7 +43,7 @@ NSString *const kFIRIsSignInEnabled = @"IS_SIGNIN_ENABLED"; NSString *const kFIRLibraryVersionID = @"4" // Major version (one or more digits) @"00" // Minor version (exactly 2 digits) - @"19" // Build number (exactly 2 digits) + @"20" // Build number (exactly 2 digits) @"000"; // Fixed "000" // Plist file name. NSString *const kServiceInfoFileName = @"GoogleService-Info"; diff --git a/FirebaseCore.podspec b/FirebaseCore.podspec index 4fff2e2..be3c38e 100644 --- a/FirebaseCore.podspec +++ b/FirebaseCore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'FirebaseCore' - s.version = '4.0.19' + s.version = '4.0.20' s.summary = 'Firebase Core for iOS' s.description = <<-DESC diff --git a/Firestore/Example/Podfile b/Firestore/Example/Podfile index a4cf214..8bb9092 100644 --- a/Firestore/Example/Podfile +++ b/Firestore/Example/Podfile @@ -1,7 +1,7 @@ # The next line is the forcing function for the Firebase pod. The Firebase # version's subspecs should depend on the component versions in their # corresponding podspec's. -pod 'Firebase/Core', '4.12.0' +pod 'Firebase/Core', '4.12.1' use_frameworks! platform :ios, '8.0' -- cgit v1.2.3 From c875e432836de36483e2dca9a8a85bfd90bc6f52 Mon Sep 17 00:00:00 2001 From: Zsika Phillip Date: Thu, 12 Apr 2018 16:54:22 -0700 Subject: Fixes typo that causes token parsing to break (#1076) --- Example/Auth/Tests/FIRUserTests.m | 130 +++++++++++++++++++++++++++----------- Firebase/Auth/Source/FIRUser.m | 18 ++++-- 2 files changed, 104 insertions(+), 44 deletions(-) diff --git a/Example/Auth/Tests/FIRUserTests.m b/Example/Auth/Tests/FIRUserTests.m index be269ee..68b0614 100644 --- a/Example/Auth/Tests/FIRUserTests.m +++ b/Example/Auth/Tests/FIRUserTests.m @@ -76,6 +76,48 @@ static NSString *const kAccessToken = @"eyJhbGciOimnuzI1NiIsImtpZCI6ImY1YjE4Mjc2 "hHm7gjX_WaRmgTOvYsuDbBBGdE15yIVZ3acI4cFUgwMRhaW-dDV7jTOqZGYJlTsI5oRMehphoVnYnEedJga28r4mqVkPbW" "lddL4dVVm85FYmQcRc0b2CLMnSevBDlwu754ZUZmRgnuvDA"; +/** @var kAccessTokenLength415 + @brief The fake access token with 415 characters in the claims potion of the token. + */ +static NSString *const kAccessTokenLength415 = @"eyJhbGciOimnuzI1NiIsImtpZCI6ImY1YjE4Mjc2YTQ4NjYxZD" + "BhODBiYzhjM2U5NDM0OTc0ZDFmMWRiNTEifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vdGVzd" + "CIsImF1ZCI6InRlc3RfYXVkIiwiYXV0aF90aW1lIjoxNTIyMzYwNTQ5LCJ1c2VyX2lkIjoidGVzdF91c2VyX2lkIiwic3V" + "iIjoidGVzdF9zdWIiLCJpYXQiOjE1MjIzNjA1NTcsImV4cCI6MTUyMjM2NDE1NywiZW1haWwiOiJhdW5pdGVzdHVzZXJAZ" + "21haWwuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWlsIjpbImF" + "1bml0ZXN0dXNlckBnbWFpbC5jb20iXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwYXNzd29yZCJ9fQ=.WFQqSrpVnxx7m" + "UrdKZA517Sp4ZBt-l2xQzGKNMVE90JB3vuNa-NyWZC-aTYMvND3-4aS3qRnN2kvk9KJAaF3eI_BKkcbZuq8O7iDVpOvqKC" + "3QcW0PnwqSPChL3XqoDF322FcBEgemwwgaEVZMuo7GhJvHw-XtBt1KRXOoGHcr3P6RsvoulUouKQmqt6TP27eZtrgH7jjN" + "hHm7gjX_WaRmgTOvYsuDbBBGdE15yIVZ3acI4cFUgwMRhaW-dDV7jTOqZGYJlTsI5oRMehphoVnYnEedJga28r4mqVkPbW" + "lddL4dVVm85FYmQcRc0b2CLMnSevBDlwu754ZUZmRgnuvDA"; + +/** @var kAccessTokenLength416 + @brief The fake access token with 416 characters in the claims potion of the token. + */ +static NSString *const kAccessTokenLength416 = @"eyJhbGciOimnuzI1NiIsImtpZCI6ImY1YjE4Mjc2YTQ4NjYxZD" + "BhODBiYzhjM2U5NDM0OTc0ZDFmMWRiNTEifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vdGVzd" + "DIiLCJhdWQiOiJ0ZXN0X2F1ZCIsImF1dGhfdGltZSI6MTUyMjM2MDU0OSwidXNlcl9pZCI6InRlc3RfdXNlcl9pZCIsInN" + "1YiI6InRlc3Rfc3ViIiwiaWF0IjoxNTIyMzYwNTU3LCJleHAiOjE1MjIzNjQxNTcsImVtYWlsIjoiYXVuaXRlc3R1c2VyQ" + "GdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJlbWFpbCI6WyJ" + "hdW5pdGVzdHVzZXJAZ21haWwuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoicGFzc3dvcmQifX0=.WFQqSrpVnxx7m" + "UrdKZA517Sp4ZBt-l2xQzGKNMVE90JB3vuNa-NyWZC-aTYMvND3-4aS3qRnN2kvk9KJAaF3eI_BKkcbZuq8O7iDVpOvqKC" + "3QcW0PnwqSPChL3XqoDF322FcBEgemwwgaEVZMuo7GhJvHw-XtBt1KRXOoGHcr3P6RsvoulUouKQmqt6TP27eZtrgH7jjN" + "hHm7gjX_WaRmgTOvYsuDbBBGdE15yIVZ3acI4cFUgwMRhaW-dDV7jTOqZGYJlTsI5oRMehphoVnYnEedJga28r4mqVkPbW" + "lddL4dVVm85FYmQcRc0b2CLMnSevBDlwu754ZUZmRgnuvDA"; + +/** @var kAccessTokenLength4523 + @brief The fake access token with 523 characters in the claims potion of the token. + */ +static NSString *const kAccessTokenLength523 = @"eyJhbGciOimnuzI1NiIsImtpZCI6ImY1YjE4Mjc2YTQ4NjYxZD" + "BhODBiYzhjM2U5NDM0OTc0ZDFmMWRiNTEifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vdGVzd" + "DQiLCJhdWQiOiJ0ZXN0X2F1ZCIsImF1dGhfdGltZSI6MTUyMjM2MDU0OSwidXNlcl9pZCI6InRlc3RfdXNlcl9pZF81NDM" + "yIiwic3ViIjoidGVzdF9zdWIiLCJpYXQiOjE1MjIzNjA1NTcsImV4cCI6MTUyMjM2NDE1OSwiZW1haWwiOiJhdW5pdGVzd" + "HVzZXI0QGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJmaXJlYmFzZSI6eyJpZGVudGl0aWVzIjp7ImVtYWl" + "sIjpbImF1bml0ZXN0dXNlckBnbWFpbC5jb20iXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwYXNzd29yZCJ9fQ=.WFQqSrpVn" + "xx7mUrdKZA517Sp4ZBt-l2xQzGKNMVE90JB3vuNa-NyWZC-aTYMvND3-4aS3qRnN2kvk9KJAaF3eI_BKkcbZuq8O7iDVpO" + "vqKC3QcW0PnwqSPChL3XqoDF322FcBEgemwwgaEVZMuo7GhJvHw-XtBt1KRXOoGHcr3P6RsvoulUouKQmqt6TP27eZtrgH" + "7jjNhHm7gjX_WaRmgTOvYsuDbBBGdE15yIVZ3acI4cFUgwMRhaW-dDV7jTOqZGYJlTsI5oRMehphoVnYnEedJga28r4mqV" + "kPbWlddL4dVVm85FYmQcRc0b2CLMnSevBDlwu754ZUZmRgnuvDA"; + /** @var kNewAccessToken @brief A new value for the fake access token. */ @@ -956,48 +998,17 @@ static const NSTimeInterval kExpectationTimeout = 2; OCMVerifyAll(_mockBackend); } -/** @fn testGetIDTokenResultForcingRefreshSuccess - @brief Tests the flow of a successful @c getIDTokenResultForcingRefresh:completion: call. +/** @fn testGetIDTokenResultForcingRefreshFailure + @brief Tests the flow successful @c getIDTokenResultForcingRefresh:completion: calls. */ - (void)testGetIDTokenResultForcingRefreshSuccess { - id mockGetAccountInfoResponseUser = OCMClassMock([FIRGetAccountInfoResponseUser class]); - OCMStub([mockGetAccountInfoResponseUser localID]).andReturn(kLocalID); - OCMStub([mockGetAccountInfoResponseUser email]).andReturn(kEmail); - OCMStub([mockGetAccountInfoResponseUser displayName]).andReturn(kGoogleDisplayName); - OCMStub([mockGetAccountInfoResponseUser passwordHash]).andReturn(kPasswordHash); - XCTestExpectation *expectation = [self expectationWithDescription:@"callback"]; - [self signInWithEmailPasswordWithMockUserInfoResponse:mockGetAccountInfoResponseUser - completion:^(FIRUser *user) { - OCMExpect([_mockBackend secureToken:[OCMArg any] callback:[OCMArg any]]) - .andCallBlock2(^(FIRSecureTokenRequest *_Nullable request, - FIRSecureTokenResponseCallback callback) { - XCTAssertEqualObjects(request.APIKey, kAPIKey); - - dispatch_async(FIRAuthGlobalWorkQueue(), ^() { - id mockSecureTokenResponse = OCMClassMock([FIRSecureTokenResponse class]); - OCMStub([mockSecureTokenResponse accessToken]).andReturn(kAccessToken); - callback(mockSecureTokenResponse, nil); - }); - }); - [user getIDTokenResultForcingRefresh:YES - completion:^(FIRAuthTokenResult *_Nullable tokenResult, - NSError *_Nullable error) { - XCTAssertTrue([NSThread isMainThread]); - XCTAssertNil(error); - XCTAssertEqualObjects(tokenResult.token, kAccessToken); - XCTAssertTrue(tokenResult.issuedAtDate && - [tokenResult.issuedAtDate isKindOfClass:[NSDate class]]); - XCTAssertTrue(tokenResult.authDate && [tokenResult.authDate isKindOfClass:[NSDate class]]); - XCTAssertTrue(tokenResult.expirationDate && - [tokenResult.expirationDate isKindOfClass:[NSDate class]]); - XCTAssertTrue(tokenResult.claims && [tokenResult.claims isKindOfClass:[NSDictionary class]]); - [expectation fulfill]; - }]; - }]; - [self waitForExpectationsWithTimeout:kExpectationTimeout handler:nil]; - OCMVerifyAll(_mockBackend); + [self getIDTokenResultForcingRefreshSuccessWithIDToken:kAccessToken]; + [self getIDTokenResultForcingRefreshSuccessWithIDToken:kAccessTokenLength415]; + [self getIDTokenResultForcingRefreshSuccessWithIDToken:kAccessTokenLength416]; + [self getIDTokenResultForcingRefreshSuccessWithIDToken:kAccessTokenLength523]; } + /** @fn testGetIDTokenResultForcingRefreshFailure @brief Tests the flow of a failed @c getIDTokenResultForcingRefresh:completion: call. */ @@ -2097,6 +2108,49 @@ static const NSTimeInterval kExpectationTimeout = 2; #pragma mark - Helpers +/** @fn getIDTokenResultForcingRefreshSuccess + @brief Helper for testing the flow of a successful @c + getIDTokenResultForcingRefresh:completion: call. + */ +- (void)getIDTokenResultForcingRefreshSuccessWithIDToken:(NSString *)idToken { + id mockGetAccountInfoResponseUser = OCMClassMock([FIRGetAccountInfoResponseUser class]); + OCMStub([mockGetAccountInfoResponseUser localID]).andReturn(kLocalID); + OCMStub([mockGetAccountInfoResponseUser email]).andReturn(kEmail); + OCMStub([mockGetAccountInfoResponseUser displayName]).andReturn(kGoogleDisplayName); + OCMStub([mockGetAccountInfoResponseUser passwordHash]).andReturn(kPasswordHash); + XCTestExpectation *expectation = [self expectationWithDescription:@"callback"]; + [self signInWithEmailPasswordWithMockUserInfoResponse:mockGetAccountInfoResponseUser + completion:^(FIRUser *user) { + OCMExpect([_mockBackend secureToken:[OCMArg any] callback:[OCMArg any]]) + .andCallBlock2(^(FIRSecureTokenRequest *_Nullable request, + FIRSecureTokenResponseCallback callback) { + XCTAssertEqualObjects(request.APIKey, kAPIKey); + + dispatch_async(FIRAuthGlobalWorkQueue(), ^() { + id mockSecureTokenResponse = OCMClassMock([FIRSecureTokenResponse class]); + OCMStub([mockSecureTokenResponse accessToken]).andReturn(idToken); + callback(mockSecureTokenResponse, nil); + }); + }); + [user getIDTokenResultForcingRefresh:YES + completion:^(FIRAuthTokenResult *_Nullable tokenResult, + NSError *_Nullable error) { + XCTAssertTrue([NSThread isMainThread]); + XCTAssertNil(error); + XCTAssertEqualObjects(tokenResult.token, idToken); + XCTAssertTrue(tokenResult.issuedAtDate && + [tokenResult.issuedAtDate isKindOfClass:[NSDate class]]); + XCTAssertTrue(tokenResult.authDate && [tokenResult.authDate isKindOfClass:[NSDate class]]); + XCTAssertTrue(tokenResult.expirationDate && + [tokenResult.expirationDate isKindOfClass:[NSDate class]]); + XCTAssertTrue(tokenResult.claims && [tokenResult.claims isKindOfClass:[NSDictionary class]]); + [expectation fulfill]; + }]; + }]; + [self waitForExpectationsWithTimeout:kExpectationTimeout handler:nil]; + OCMVerifyAll(_mockBackend); +} + /** @fn signInWithEmailPasswordWithMockGetAccountInfoResponse:completion: @brief Signs in with an email and password account with mocked backend end calls. @param mockUserInfoResponse A mocked FIRGetAccountInfoResponseUser object. diff --git a/Firebase/Auth/Source/FIRUser.m b/Firebase/Auth/Source/FIRUser.m index 1b10976..0a0a664 100644 --- a/Firebase/Auth/Source/FIRUser.m +++ b/Firebase/Auth/Source/FIRUser.m @@ -836,23 +836,29 @@ static void callInMainThreadWithAuthDataResultAndError( NSMutableString *tokenPayload = [[NSMutableString alloc] initWithString:tokenStringArray[1]]; // Pad the token payload with "=" signs if the payload's length is not a multple of 4. - int remainder = tokenPayload.length % 4 != 0; - if (remainder) { - while (remainder --) { - [tokenPayload appendString:@"="]; - } + while ((tokenPayload.length % 4) != 0) { + [tokenPayload appendFormat:@"="]; } NSData *decodedTokenPayloadData = [[NSData alloc] initWithBase64EncodedString:tokenPayload options:NSDataBase64DecodingIgnoreUnknownCharacters]; + if (!decodedTokenPayloadData) { + *error = [FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:token]; + return nil; + } NSDictionary *tokenPayloadDictionary = [NSJSONSerialization JSONObjectWithData:decodedTokenPayloadData - options:kNilOptions + options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:error]; if (error) { return nil; } + if (!tokenPayloadDictionary) { + *error = [FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:token]; + return nil; + } + NSDate *expDate = [NSDate dateWithTimeIntervalSinceNow:[tokenPayloadDictionary[@"exp"] doubleValue]]; NSDate *authDate = -- cgit v1.2.3 From 484c88b0f5ca07f63570a94e205b31a179d00fb2 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Thu, 12 Apr 2018 16:59:24 -0700 Subject: Set FirebaseAuth version 4.6.1 --- FirebaseAuth.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FirebaseAuth.podspec b/FirebaseAuth.podspec index c575d29..8c4c32d 100644 --- a/FirebaseAuth.podspec +++ b/FirebaseAuth.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'FirebaseAuth' - s.version = '4.6.0' + s.version = '4.6.1' s.summary = 'The official iOS client for Firebase Authentication' s.description = <<-DESC -- cgit v1.2.3 From 1b6429c0d421b289cbf6509c008f54a078ba9ba9 Mon Sep 17 00:00:00 2001 From: Zsika Phillip Date: Fri, 13 Apr 2018 10:31:40 -0700 Subject: Update changelog (#1090) --- Firebase/Auth/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Firebase/Auth/CHANGELOG.md b/Firebase/Auth/CHANGELOG.md index 94d508b..858d2a7 100644 --- a/Firebase/Auth/CHANGELOG.md +++ b/Firebase/Auth/CHANGELOG.md @@ -1,3 +1,6 @@ +# v4.6.1 +- Fixes crash which occurred when certain Firebase IDTokens were being parsed (#1076). + # v4.6.0 - Adds `getIDTokenResultWithCompletion:` and `getIDTokenResultForcingRefresh:completion:` APIs which call back with an AuthTokenResult object. The Auth token result object contains the ID token JWT string and other properties associated with the token including the decoded available payload claims (#1004). -- cgit v1.2.3 From f23c3914bd9f830573ffc1dc71f05978fd448468 Mon Sep 17 00:00:00 2001 From: Paul Beusterien Date: Fri, 13 Apr 2018 11:24:52 -0700 Subject: Rename version 4.12.1 to 4.13 (#1092) --- Example/Podfile | 2 +- FirebaseCore.podspec | 2 +- Firestore/Example/Podfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Example/Podfile b/Example/Podfile index 4448620..a26f255 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -8,7 +8,7 @@ target 'Core_Example_iOS' do # The next line is the forcing function for the Firebase pod. The Firebase # version's subspecs should depend on the component versions in their # corresponding podspec's. - pod 'Firebase/Core', '4.12.1' + pod 'Firebase/Core', '4.13.0' target 'Core_Tests_iOS' do inherit! :search_paths diff --git a/FirebaseCore.podspec b/FirebaseCore.podspec index be3c38e..c1bf223 100644 --- a/FirebaseCore.podspec +++ b/FirebaseCore.podspec @@ -34,6 +34,6 @@ Firebase Core includes FIRApp and FIROptions which provide central configuration s.dependency 'GoogleToolboxForMac/NSData+zlib', '~> 2.1' s.pod_target_xcconfig = { 'OTHER_CFLAGS' => '-fno-autolink ' + - '-DFIRCore_VERSION=' + s.version.to_s + ' -DFirebase_VERSION=4.8.0' + '-DFIRCore_VERSION=' + s.version.to_s + ' -DFirebase_VERSION=4.13.0' } end diff --git a/Firestore/Example/Podfile b/Firestore/Example/Podfile index 8bb9092..41df29c 100644 --- a/Firestore/Example/Podfile +++ b/Firestore/Example/Podfile @@ -1,7 +1,7 @@ # The next line is the forcing function for the Firebase pod. The Firebase # version's subspecs should depend on the component versions in their # corresponding podspec's. -pod 'Firebase/Core', '4.12.1' +pod 'Firebase/Core', '4.13.0' use_frameworks! platform :ios, '8.0' -- cgit v1.2.3