Skip to content

Commit

Permalink
Make call and update UI if a user is not whitelisted with the respect…
Browse files Browse the repository at this point in the history
…ive server
  • Loading branch information
patelneel55 committed Jan 15, 2021
1 parent 0767fcc commit ebda489
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 49 deletions.
4 changes: 4 additions & 0 deletions frontend/memoree_client/lib/app/models/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> PRESET_QUERIES = ["Birthday", "weddings", "waterfalls", "Mountains"];
19 changes: 19 additions & 0 deletions frontend/memoree_client/lib/app/pages/login.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,19 @@ class LoginPage extends StatefulWidget {
}

class _LoginPageState extends State<LoginPage> {
String _errorMessage;

@override
void initState() {
_errorMessage = null;
}

void _showError(err) {
setState(() {
_errorMessage = err;
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
Expand All @@ -35,6 +48,8 @@ class _LoginPageState extends State<LoginPage> {
},
),);
}
}).catchError((error) {
_showError(error);
});
},
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(40)),
Expand All @@ -55,6 +70,10 @@ class _LoginPageState extends State<LoginPage> {
),
),
),
if(_errorMessage != null)
SizedBox(height: 10,),
if(_errorMessage != null)
Text(_errorMessage, style: TextStyle(color: Colors.red),),
]
),
),
Expand Down
109 changes: 61 additions & 48 deletions frontend/memoree_client/lib/app/services/firebase_auth.dart
Original file line number Diff line number Diff line change
@@ -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<User> get onAuthStateChanged {
return _firebaseAuth.authStateChanges().map(_userFromFirebase);
}

Future<User> 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<void> signOut() async {
await _googleSignIn.disconnect();
return _firebaseAuth.signOut();
}

Future<User> 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<User> get onAuthStateChanged {
return _firebaseAuth.authStateChanges().map(_userFromFirebase);
}

Future<User> 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<void> signOut() async {
await _googleSignIn.disconnect();
return _firebaseAuth.signOut();
}

Future<User> currentUser() async {
final user = _firebaseAuth.currentUser;
return _userFromFirebase(user);
}
}
16 changes: 15 additions & 1 deletion frontend/memoree_client/lib/app/services/search.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class SearchService {

static Future<Image> 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(<String, dynamic>{'video_url': videoUrl});
Expand All @@ -39,4 +39,18 @@ class SearchService {
return null;
}
}

static Future<bool> isWhitelisted(String email) async
{
final HttpsCallable funcCallable = FirebaseFunctions.instance.httpsCallable("checkWhitelist");

try {
final HttpsCallableResult result = await funcCallable.call(<String, dynamic>{});
return result.data;
}
catch(err)
{
return false;
}
}
}

0 comments on commit ebda489

Please sign in to comment.