From ebda48916d323747d661b77d5cee6345e09edc7c Mon Sep 17 00:00:00 2001 From: Neel Patel Date: Fri, 15 Jan 2021 00:23:53 -0600 Subject: [PATCH] Make call and update UI if a user is not whitelisted with the respective server --- .../lib/app/models/constants.dart | 4 + .../memoree_client/lib/app/pages/login.dart | 19 +++ .../lib/app/services/firebase_auth.dart | 109 ++++++++++-------- .../lib/app/services/search.dart | 16 ++- 4 files changed, 99 insertions(+), 49 deletions(-) diff --git a/frontend/memoree_client/lib/app/models/constants.dart b/frontend/memoree_client/lib/app/models/constants.dart index 8d53ac0..7b08237 100755 --- a/frontend/memoree_client/lib/app/models/constants.dart +++ b/frontend/memoree_client/lib/app/models/constants.dart @@ -15,4 +15,8 @@ class ActionNames { static const String search = "Search"; } +class PageErrors { + static const String no_access = " does not have access to this server.\nPlease contact your admin for more details."; +} + const List PRESET_QUERIES = ["Birthday", "weddings", "waterfalls", "Mountains"]; diff --git a/frontend/memoree_client/lib/app/pages/login.dart b/frontend/memoree_client/lib/app/pages/login.dart index 5add71f..007f9f0 100755 --- a/frontend/memoree_client/lib/app/pages/login.dart +++ b/frontend/memoree_client/lib/app/pages/login.dart @@ -10,6 +10,19 @@ class LoginPage extends StatefulWidget { } class _LoginPageState extends State { + String _errorMessage; + + @override + void initState() { + _errorMessage = null; + } + + void _showError(err) { + setState(() { + _errorMessage = err; + }); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -35,6 +48,8 @@ class _LoginPageState extends State { }, ),); } + }).catchError((error) { + _showError(error); }); }, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(40)), @@ -55,6 +70,10 @@ class _LoginPageState extends State { ), ), ), + if(_errorMessage != null) + SizedBox(height: 10,), + if(_errorMessage != null) + Text(_errorMessage, style: TextStyle(color: Colors.red),), ] ), ), diff --git a/frontend/memoree_client/lib/app/services/firebase_auth.dart b/frontend/memoree_client/lib/app/services/firebase_auth.dart index 23231cc..a998683 100755 --- a/frontend/memoree_client/lib/app/services/firebase_auth.dart +++ b/frontend/memoree_client/lib/app/services/firebase_auth.dart @@ -1,49 +1,62 @@ -import 'package:firebase_auth/firebase_auth.dart' as auth; -import 'package:google_sign_in/google_sign_in.dart'; -import 'package:memoree_client/app/models/user.dart'; - -class FirebaseAuthService { - final auth.FirebaseAuth _firebaseAuth; - final GoogleSignIn _googleSignIn; - - FirebaseAuthService({auth.FirebaseAuth firebaseAuth, GoogleSignIn googleSignin}) - : _firebaseAuth = firebaseAuth ?? auth.FirebaseAuth.instance, - _googleSignIn = googleSignin ?? GoogleSignIn(); - - User _userFromFirebase(auth.User user) { - if (user == null) { - return null; - } - return User( - uid: user.uid, - email: user.email, - displayName: user.displayName, - photoUrl: user.photoURL, - ); - } - - Stream get onAuthStateChanged { - return _firebaseAuth.authStateChanges().map(_userFromFirebase); - } - - Future signInWithGoogle() async { - final googleUser = await _googleSignIn.signIn(); - final googleAuth = await googleUser.authentication; - final credential = auth.GoogleAuthProvider.credential( - accessToken: googleAuth.accessToken, - idToken: googleAuth.idToken, - ); - final authResult = await _firebaseAuth.signInWithCredential(credential); - return _userFromFirebase(authResult.user); - } - - Future signOut() async { - await _googleSignIn.disconnect(); - return _firebaseAuth.signOut(); - } - - Future currentUser() async { - final user = _firebaseAuth.currentUser; - return _userFromFirebase(user); - } +import 'package:firebase_auth/firebase_auth.dart' as auth; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:memoree_client/app/models/constants.dart'; +import 'package:memoree_client/app/models/user.dart'; +import 'package:memoree_client/app/services/search.dart'; + +class FirebaseAuthService { + final auth.FirebaseAuth _firebaseAuth; + final GoogleSignIn _googleSignIn; + + FirebaseAuthService({auth.FirebaseAuth firebaseAuth, GoogleSignIn googleSignin}) + : _firebaseAuth = firebaseAuth ?? auth.FirebaseAuth.instance, + _googleSignIn = googleSignin ?? GoogleSignIn(); + + User _userFromFirebase(auth.User user) { + if (user == null) { + return null; + } + return User( + uid: user.uid, + email: user.email, + displayName: user.displayName, + photoUrl: user.photoURL, + ); + } + + Stream get onAuthStateChanged { + return _firebaseAuth.authStateChanges().map(_userFromFirebase); + } + + Future signInWithGoogle() async { + final googleUser = await _googleSignIn.signIn(); + final googleAuth = await googleUser.authentication; + final credential = auth.GoogleAuthProvider.credential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + final authResult = await _firebaseAuth.signInWithCredential(credential); + User signedIn = _userFromFirebase(authResult.user); + + // Check if user is allowed to access the server + final isAllowed = await SearchService.isWhitelisted(signedIn.email); + if(!isAllowed) + { + await _googleSignIn.disconnect(); + await _firebaseAuth.signOut(); + throw(signedIn.email + PageErrors.no_access); + } + + return signedIn; + } + + Future signOut() async { + await _googleSignIn.disconnect(); + return _firebaseAuth.signOut(); + } + + Future currentUser() async { + final user = _firebaseAuth.currentUser; + return _userFromFirebase(user); + } } \ No newline at end of file diff --git a/frontend/memoree_client/lib/app/services/search.dart b/frontend/memoree_client/lib/app/services/search.dart index 1ec2838..558330b 100755 --- a/frontend/memoree_client/lib/app/services/search.dart +++ b/frontend/memoree_client/lib/app/services/search.dart @@ -26,7 +26,7 @@ class SearchService { static Future fetchThumbnail(String videoUrl) async { - final HttpsCallable funcCallable = FirebaseFunctions.instance.httpsCallable("generate_thumbnail"); + final HttpsCallable funcCallable = FirebaseFunctions.instance.httpsCallable("generateThumbnail"); try { final HttpsCallableResult result = await funcCallable.call({'video_url': videoUrl}); @@ -39,4 +39,18 @@ class SearchService { return null; } } + + static Future isWhitelisted(String email) async + { + final HttpsCallable funcCallable = FirebaseFunctions.instance.httpsCallable("checkWhitelist"); + + try { + final HttpsCallableResult result = await funcCallable.call({}); + return result.data; + } + catch(err) + { + return false; + } + } }