From 28f8df80fa83a29b138d32c91316dd3618dcbfc4 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Mon, 10 Mar 2025 08:17:37 +0000 Subject: [PATCH 1/5] fix(auth, iOS): include missing email and credential in account-exists-with-different-credential error --- .../firebase_auth/FLTFirebaseAuthPlugin.m | 98 +++++++++++-------- 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m index f42b49e8eb5d..dd591e99047f 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -602,51 +602,71 @@ static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFireb return; } if (credentials) { - [auth signInWithCredential:credentials - completion:^(FIRAuthDataResult *authResult, NSError *error) { - if (error != nil) { - NSDictionary *userInfo = [error userInfo]; - NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; - - NSDictionary *firebaseDictionary = - underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" - @"erializedResponseKey"]; - - if (firebaseDictionary == nil && - userInfo[@"FIRAuthErrorUserInfoNameKey"] != nil) { - // Removing since it's not parsed and causing issue when sending back the - // object to Flutter - NSMutableDictionary *mutableUserInfo = [userInfo mutableCopy]; - [mutableUserInfo - removeObjectForKey:@"FIRAuthErrorUserInfoUpdatedCredentialKey"]; - NSError *modifiedError = [NSError errorWithDomain:error.domain - code:error.code - userInfo:mutableUserInfo]; + [auth + signInWithCredential:credentials + completion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; - completion(nil, - [FlutterError errorWithCode:@"sign-in-failed" - message:userInfo[@"NSLocalizedDescription"] - details:modifiedError.userInfo]); + NSDictionary *firebaseDictionary = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" + @"erializedResponseKey"]; + + NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; + + if (firebaseDictionary == nil && errorCode != nil) { + if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { + FIRAuthCredential *authCredential = + userInfo[@"FIRAuthErrorUserInfoUpdatedCredentialKey"]; + + PigeonAuthCredential *pigeonAuthCredential = + [PigeonParser getPigeonAuthCredential:authCredential token:nil]; - } else if (firebaseDictionary != nil && - firebaseDictionary[@"message"] != nil) { - // error from firebase-ios-sdk is - // buried in underlying error. + NSDictionary *errorDetails = @{ + @"email" : error.userInfo[@"FIRAuthErrorUserInfoEmailKey"], + @"authCredential" : pigeonAuthCredential + }; completion(nil, - [FlutterError errorWithCode:@"sign-in-failed" - message:error.localizedDescription - details:firebaseDictionary[@"message"]]); - } else { - completion(nil, [FlutterError errorWithCode:@"sign-in-failed" - message:error.localizedDescription - details:error.userInfo]); + [FlutterError errorWithCode:errorCode + message:userInfo[@"NSLocalizedDescription"] + details:errorDetails]); + return; } + + // Removing since it's not parsed and causing issue when sending back the + // object to Flutter + NSMutableDictionary *mutableUserInfo = [userInfo mutableCopy]; + [mutableUserInfo + removeObjectForKey:@"FIRAuthErrorUserInfoUpdatedCredentialKey"]; + NSError *modifiedError = [NSError errorWithDomain:error.domain + code:error.code + userInfo:mutableUserInfo]; + + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:userInfo[@"NSLocalizedDescription"] + details:modifiedError.userInfo]); + + } else if (firebaseDictionary != nil && + firebaseDictionary[@"message"] != nil) { + // error from firebase-ios-sdk is + // buried in underlying error. + completion(nil, + [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:firebaseDictionary[@"message"]]); } else { - completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult - authorizationCode:nil], - nil); + completion(nil, [FlutterError errorWithCode:@"sign-in-failed" + message:error.localizedDescription + details:error.userInfo]); } - }]; + } else { + completion([PigeonParser getPigeonUserCredentialFromAuthResult:authResult + authorizationCode:nil], + nil); + } + }]; } } From d596aa1a60ea3577e344137f74de25cdb49b8b02 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Wed, 12 Mar 2025 08:01:34 +0000 Subject: [PATCH 2/5] chore: use `convertToFlutterError` function --- .../Sources/firebase_auth/FLTFirebaseAuthPlugin.m | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m index dd591e99047f..7e7da1784579 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -617,20 +617,7 @@ static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFireb if (firebaseDictionary == nil && errorCode != nil) { if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { - FIRAuthCredential *authCredential = - userInfo[@"FIRAuthErrorUserInfoUpdatedCredentialKey"]; - - PigeonAuthCredential *pigeonAuthCredential = - [PigeonParser getPigeonAuthCredential:authCredential token:nil]; - - NSDictionary *errorDetails = @{ - @"email" : error.userInfo[@"FIRAuthErrorUserInfoEmailKey"], - @"authCredential" : pigeonAuthCredential - }; - completion(nil, - [FlutterError errorWithCode:errorCode - message:userInfo[@"NSLocalizedDescription"] - details:errorDetails]); + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); return; } From 54d6b2143a1176a0312b5660c0f542adce87a536 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Wed, 12 Mar 2025 08:19:05 +0000 Subject: [PATCH 3/5] chore: revert indentation --- .../Sources/firebase_auth/FLTFirebaseAuthPlugin.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m index 7e7da1784579..eee95aa56f5e 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -602,8 +602,7 @@ static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFireb return; } if (credentials) { - [auth - signInWithCredential:credentials + [auth signInWithCredential:credentials completion:^(FIRAuthDataResult *authResult, NSError *error) { if (error != nil) { NSDictionary *userInfo = [error userInfo]; From 00a04f8f865000e618adbfbd45887a47fc78009b Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Wed, 12 Mar 2025 08:22:43 +0000 Subject: [PATCH 4/5] chore: revert indentation --- .../firebase_auth/FLTFirebaseAuthPlugin.m | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m index eee95aa56f5e..2918edf307ad 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -603,21 +603,21 @@ static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFireb } if (credentials) { [auth signInWithCredential:credentials - completion:^(FIRAuthDataResult *authResult, NSError *error) { - if (error != nil) { - NSDictionary *userInfo = [error userInfo]; - NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; + completion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; - NSDictionary *firebaseDictionary = - underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" - @"erializedResponseKey"]; + NSDictionary *firebaseDictionary = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" + @"erializedResponseKey"]; - NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; + NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; - if (firebaseDictionary == nil && errorCode != nil) { - if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { - completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); - return; + if (firebaseDictionary == nil && errorCode != nil) { + if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; } // Removing since it's not parsed and causing issue when sending back the From 2bf5fe9a15b423607a7bc9ec70128fd136b46797 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Thu, 13 Mar 2025 14:00:18 +0000 Subject: [PATCH 5/5] chore: fix formatting issues --- .../firebase_auth/FLTFirebaseAuthPlugin.m | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m index 2918edf307ad..7e7da1784579 100644 --- a/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m +++ b/packages/firebase_auth/firebase_auth/ios/firebase_auth/Sources/firebase_auth/FLTFirebaseAuthPlugin.m @@ -602,22 +602,23 @@ static void handleAppleAuthResult(FLTFirebaseAuthPlugin *object, AuthPigeonFireb return; } if (credentials) { - [auth signInWithCredential:credentials - completion:^(FIRAuthDataResult *authResult, NSError *error) { - if (error != nil) { - NSDictionary *userInfo = [error userInfo]; - NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; + [auth + signInWithCredential:credentials + completion:^(FIRAuthDataResult *authResult, NSError *error) { + if (error != nil) { + NSDictionary *userInfo = [error userInfo]; + NSError *underlyingError = [userInfo objectForKey:NSUnderlyingErrorKey]; - NSDictionary *firebaseDictionary = - underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" - @"erializedResponseKey"]; + NSDictionary *firebaseDictionary = + underlyingError.userInfo[@"FIRAuthErrorUserInfoDes" + @"erializedResponseKey"]; - NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; + NSString *errorCode = userInfo[@"FIRAuthErrorUserInfoNameKey"]; - if (firebaseDictionary == nil && errorCode != nil) { - if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { - completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); - return; + if (firebaseDictionary == nil && errorCode != nil) { + if ([errorCode isEqual:@"ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL"]) { + completion(nil, [FLTFirebaseAuthPlugin convertToFlutterError:error]); + return; } // Removing since it's not parsed and causing issue when sending back the