From b214cb55c8a873a9aaeab5417f5ef770c866cd2e Mon Sep 17 00:00:00 2001 From: Nash Ramdial Date: Fri, 17 May 2019 21:38:56 -0400 Subject: [PATCH 01/10] created interface AdditionalUserInfo --- packages/firebase_auth/lib/firebase_auth.dart | 5 +++-- .../lib/src/additional_user_info.dart | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 packages/firebase_auth/lib/src/additional_user_info.dart diff --git a/packages/firebase_auth/lib/firebase_auth.dart b/packages/firebase_auth/lib/firebase_auth.dart index 1f31ead02dc0..f4fdf1fa7892 100755 --- a/packages/firebase_auth/lib/firebase_auth.dart +++ b/packages/firebase_auth/lib/firebase_auth.dart @@ -10,14 +10,15 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; +part 'src/additional_user_info.dart'; +part 'src/auth_credential.dart'; +part 'src/auth_exception.dart'; part 'src/auth_provider/email_auth_provider.dart'; part 'src/auth_provider/facebook_auth_provider.dart'; part 'src/auth_provider/github_auth_provider.dart'; part 'src/auth_provider/google_auth_provider.dart'; part 'src/auth_provider/phone_auth_provider.dart'; part 'src/auth_provider/twitter_auth_provider.dart'; -part 'src/auth_credential.dart'; -part 'src/auth_exception.dart'; part 'src/firebase_auth.dart'; part 'src/firebase_user.dart'; part 'src/user_info.dart'; diff --git a/packages/firebase_auth/lib/src/additional_user_info.dart b/packages/firebase_auth/lib/src/additional_user_info.dart new file mode 100644 index 000000000000..71ab97b391c8 --- /dev/null +++ b/packages/firebase_auth/lib/src/additional_user_info.dart @@ -0,0 +1,14 @@ +part of firebase_auth; + +/// Interface representing a user's additional information +class AdditionalUserInfo { + AdditionalUserInfo._(this._data); + + final Map _data; + + bool get isNewUser => _data['isNewUser']; + + String get getUsername => _data['getUsername']; + + Map get getProfile => _data['getProfile']; +} From 10204d88c77028379763d0c68702a189d645607a Mon Sep 17 00:00:00 2001 From: Nash Ramdial Date: Fri, 17 May 2019 21:39:50 -0400 Subject: [PATCH 02/10] retrieves AdditionalUserInfo from data --- packages/firebase_auth/lib/src/firebase_user.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/firebase_auth/lib/src/firebase_user.dart b/packages/firebase_auth/lib/src/firebase_user.dart index 0a6dec1b6d3a..2311ddeae358 100644 --- a/packages/firebase_auth/lib/src/firebase_user.dart +++ b/packages/firebase_auth/lib/src/firebase_user.dart @@ -7,20 +7,22 @@ part of firebase_auth; /// Represents a user. class FirebaseUser extends UserInfo { FirebaseUser._(Map data, FirebaseApp app) - : providerData = data['providerData'] - .map((dynamic item) => UserInfo._(item, app)) - .toList(), + : providerData = data['providerData'].map((dynamic item) => UserInfo._(item, app)).toList(), _metadata = FirebaseUserMetadata._(data), + _additionalUserInfo = AdditionalUserInfo._(data['additionalUserInfo']), super._(data, app); final List providerData; final FirebaseUserMetadata _metadata; + final AdditionalUserInfo _additionalUserInfo; // Returns true if the user is anonymous; that is, the user account was // created with signInAnonymously() and has not been linked to another // account. FirebaseUserMetadata get metadata => _metadata; + AdditionalUserInfo get additionalUserInfo => _additionalUserInfo; + bool get isAnonymous => _data['isAnonymous']; /// Returns true if the user's email is verified. @@ -82,8 +84,7 @@ class FirebaseUser extends UserInfo { // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. // https://github.com/flutter/flutter/issues/26431 // ignore: strong_mode_implicit_dynamic_method - await FirebaseAuth.channel.invokeMethod( - 'sendEmailVerification', {'app': _app.name}); + await FirebaseAuth.channel.invokeMethod('sendEmailVerification', {'app': _app.name}); } /// Manually refreshes the data of the current user (for example, @@ -212,8 +213,7 @@ class FirebaseUser extends UserInfo { /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future reauthenticateWithCredential( - AuthCredential credential) async { + Future reauthenticateWithCredential(AuthCredential credential) async { assert(credential != null); // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. // https://github.com/flutter/flutter/issues/26431 From 222d5d14994040be06b5ff7da062746b38b93b04 Mon Sep 17 00:00:00 2001 From: Nash Ramdial Date: Fri, 17 May 2019 21:41:07 -0400 Subject: [PATCH 03/10] exposes AdditionalUserInfo to userMap --- .../firebaseauth/FirebaseAuthPlugin.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java index 5cce15d746bc..b9be06b0ca2c 100755 --- a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java +++ b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java @@ -16,6 +16,7 @@ import com.google.firebase.FirebaseNetworkException; import com.google.firebase.FirebaseTooManyRequestsException; import com.google.firebase.auth.ActionCodeSettings; +import com.google.firebase.auth.AdditionalUserInfo; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.EmailAuthProvider; @@ -290,7 +291,7 @@ private void handleCurrentUser( return; } Map userMap = mapFromUser(user); - result.success(userMap); + result.success(Collections.unmodifiableMap(userMap)); } private void handleSignInAnonymously( @@ -487,8 +488,8 @@ private void handleReauthenticateWithCredential( AuthCredential credential = getCredential((Map) call.arguments()); currentUser - .reauthenticate(credential) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); + .reauthenticateAndRetrieveData(credential) + .addOnCompleteListener(new SignInCompleteListener(result)); } private void handleUnlinkFromProvider(MethodCall call, Result result, FirebaseAuth firebaseAuth) { @@ -671,8 +672,11 @@ public void onComplete(@NonNull Task task) { reportException(result, task.getException()); } else { FirebaseUser user = task.getResult().getUser(); - Map userMap = Collections.unmodifiableMap(mapFromUser(user)); - result.success(userMap); + Map userMap = mapFromUser(user); + Map additionalMap = mapFromAdditionalUserInfo( + task.getResult().getAdditionalUserInfo()); + userMap.put("additionalUserInfo", Collections.unmodifiableMap(additionalMap)); + result.success(Collections.unmodifiableMap(userMap)); } } } @@ -752,12 +756,21 @@ private Map mapFromUser(FirebaseUser user) { userMap.put("isAnonymous", user.isAnonymous()); userMap.put("isEmailVerified", user.isEmailVerified()); userMap.put("providerData", Collections.unmodifiableList(providerData)); - return Collections.unmodifiableMap(userMap); + return userMap; } else { return null; } } + private Map mapFromAdditionalUserInfo(AdditionalUserInfo additionalUserInfo) { + Map map = new HashMap<>(); + map.put("providerId", additionalUserInfo.getProviderId()); + map.put("profile", additionalUserInfo.getProfile()); + map.put("username", additionalUserInfo.getUsername()); + map.put("isNewUser", additionalUserInfo.isNewUser()); + return map; + } + private void markUserRequired(Result result) { result.error("USER_REQUIRED", "Please authenticate with Firebase first", null); } From 590b6e639de7aeef27bc23c7fcba398004618cc4 Mon Sep 17 00:00:00 2001 From: Nash Ramdial Date: Sat, 18 May 2019 09:51:17 -0400 Subject: [PATCH 04/10] Added comments for exposed properties --- packages/firebase_auth/lib/src/additional_user_info.dart | 3 +++ packages/firebase_auth/lib/src/firebase_user.dart | 2 ++ 2 files changed, 5 insertions(+) diff --git a/packages/firebase_auth/lib/src/additional_user_info.dart b/packages/firebase_auth/lib/src/additional_user_info.dart index 71ab97b391c8..267b284efd40 100644 --- a/packages/firebase_auth/lib/src/additional_user_info.dart +++ b/packages/firebase_auth/lib/src/additional_user_info.dart @@ -6,9 +6,12 @@ class AdditionalUserInfo { final Map _data; + /// Returns whether the user is new or existing bool get isNewUser => _data['isNewUser']; + /// Returns the username if the provider is GitHub or Twitter String get getUsername => _data['getUsername']; + /// Returns a Map containing IDP-specific user data if the provider is one of Facebook, GitHub, Google, Twitter, Microsoft, or Yahoo. Map get getProfile => _data['getProfile']; } diff --git a/packages/firebase_auth/lib/src/firebase_user.dart b/packages/firebase_auth/lib/src/firebase_user.dart index 2311ddeae358..01d3786ab9e6 100644 --- a/packages/firebase_auth/lib/src/firebase_user.dart +++ b/packages/firebase_auth/lib/src/firebase_user.dart @@ -21,6 +21,8 @@ class FirebaseUser extends UserInfo { // account. FirebaseUserMetadata get metadata => _metadata; + /// Object that contains additional user information as a result of a successful sign-in, link, or re-authentication operation. + /// Available information contained within depends on the provider with which a sign-in, link, or re-authenticate operation was most recently done. AdditionalUserInfo get additionalUserInfo => _additionalUserInfo; bool get isAnonymous => _data['isAnonymous']; From 80d365a5e59d6d5e2cd7cdf04a45982d12101544 Mon Sep 17 00:00:00 2001 From: Nash Ramdial Date: Sat, 18 May 2019 10:13:02 -0400 Subject: [PATCH 05/10] Updated version number in pubspec --- packages/firebase_auth/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firebase_auth/pubspec.yaml b/packages/firebase_auth/pubspec.yaml index 213b75fcc28e..341f81ffb656 100755 --- a/packages/firebase_auth/pubspec.yaml +++ b/packages/firebase_auth/pubspec.yaml @@ -5,7 +5,7 @@ description: Flutter plugin for Firebase Auth, enabling Android and iOS author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_auth -version: "0.11.1" +version: "0.11.2" flutter: plugin: From b5bd40943859a1b6f06929545c7881dccbb425ad Mon Sep 17 00:00:00 2001 From: Nash Ramdial Date: Sat, 18 May 2019 10:13:22 -0400 Subject: [PATCH 06/10] Added changes to CHANGELOG.md --- packages/firebase_auth/CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/firebase_auth/CHANGELOG.md b/packages/firebase_auth/CHANGELOG.md index e47a09715f37..df8cce5a305e 100644 --- a/packages/firebase_auth/CHANGELOG.md +++ b/packages/firebase_auth/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.11.2 + +* Exposed user's additional information (isNewUser, getUsername, getProfile) + ## 0.11.1 * Support for `updatePhoneNumberCredential`. From a9ba9a0e122c46ab3a08c2bafa38ec6b3481134b Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 29 May 2019 21:50:39 -0700 Subject: [PATCH 07/10] Reformat and fix merge damage --- .../io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java | 4 ++-- packages/firebase_auth/lib/src/firebase_user.dart | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java index b9be06b0ca2c..cc157ea616f0 100755 --- a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java +++ b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java @@ -673,8 +673,8 @@ public void onComplete(@NonNull Task task) { } else { FirebaseUser user = task.getResult().getUser(); Map userMap = mapFromUser(user); - Map additionalMap = mapFromAdditionalUserInfo( - task.getResult().getAdditionalUserInfo()); + Map additionalMap = + mapFromAdditionalUserInfo(task.getResult().getAdditionalUserInfo()); userMap.put("additionalUserInfo", Collections.unmodifiableMap(additionalMap)); result.success(Collections.unmodifiableMap(userMap)); } diff --git a/packages/firebase_auth/lib/src/firebase_user.dart b/packages/firebase_auth/lib/src/firebase_user.dart index c6b30f20e102..0cc0a06ff749 100644 --- a/packages/firebase_auth/lib/src/firebase_user.dart +++ b/packages/firebase_auth/lib/src/firebase_user.dart @@ -6,6 +6,7 @@ part of firebase_auth; /// Represents a user. class FirebaseUser extends UserInfo { + FirebaseUser._(Map data, FirebaseApp app) : providerData = data['providerData'] .map((dynamic item) => UserInfo._(item, app)) .toList(), @@ -195,7 +196,8 @@ class FirebaseUser extends UserInfo { /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future reauthenticateWithCredential(AuthCredential credential) async { + Future reauthenticateWithCredential( + AuthCredential credential) async { assert(credential != null); await FirebaseAuth.channel.invokeMethod( 'reauthenticateWithCredential', From 3f82d2af7a7c6ae78f7ada724d73960746471a40 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 29 May 2019 22:00:02 -0700 Subject: [PATCH 08/10] Integration test for additionalInfo feature --- packages/firebase_auth/example/test/firebase_auth.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/firebase_auth/example/test/firebase_auth.dart b/packages/firebase_auth/example/test/firebase_auth.dart index 2c4f4c8ede32..b3f9b257d3c9 100644 --- a/packages/firebase_auth/example/test/firebase_auth.dart +++ b/packages/firebase_auth/example/test/firebase_auth.dart @@ -19,6 +19,7 @@ void main() { final FirebaseUser user = await auth.signInAnonymously(); expect(user.uid, isNotNull); expect(user.isAnonymous, isTrue); + expect(user.additionalUserInfo.isNewUser, isNotNull); }); test('isSignInWithEmailLink', () async { From c0fc37e287b7cd594232d2878f9dd1065db57ab0 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Thu, 6 Jun 2019 15:40:26 -0700 Subject: [PATCH 09/10] Update CHANGELOG.md --- packages/firebase_auth/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/firebase_auth/CHANGELOG.md b/packages/firebase_auth/CHANGELOG.md index 33334a3d08a1..99db959bbfb1 100644 --- a/packages/firebase_auth/CHANGELOG.md +++ b/packages/firebase_auth/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.11.2 -* Exposed user's additional information (isNewUser, getUsername, getProfile) +* Exposed user's additional information (`isNewUser`, `getUsername`, `getProfile`) ## 0.11.1+4 From 841c0db9508349e451017c9deeda42bfec8fe967 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Mon, 15 Jul 2019 18:34:16 -0700 Subject: [PATCH 10/10] return null `additionalUserInfo` if there is none --- packages/firebase_auth/lib/src/firebase_user.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/firebase_auth/lib/src/firebase_user.dart b/packages/firebase_auth/lib/src/firebase_user.dart index 0cc0a06ff749..6aa898bef578 100644 --- a/packages/firebase_auth/lib/src/firebase_user.dart +++ b/packages/firebase_auth/lib/src/firebase_user.dart @@ -11,7 +11,9 @@ class FirebaseUser extends UserInfo { .map((dynamic item) => UserInfo._(item, app)) .toList(), _metadata = FirebaseUserMetadata._(data), - _additionalUserInfo = AdditionalUserInfo._(data['additionalUserInfo']), + _additionalUserInfo = data.containsKey('additionalUserInfo') + ? AdditionalUserInfo._(data['additionalUserInfo']) + : null, super._(data, app); final List providerData;