2017-03-02 11:30:08 +00:00
package io.invertase.firebase.auth ;
import android.util.Log ;
2017-03-15 20:05:09 +00:00
import android.net.Uri ;
import android.support.annotation.NonNull ;
2017-03-02 11:30:08 +00:00
import java.util.Map ;
2017-03-13 17:23:41 +00:00
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
2017-03-02 11:30:08 +00:00
import com.facebook.react.bridge.Arguments ;
2017-03-13 17:23:41 +00:00
import com.facebook.react.bridge.Promise ;
2017-03-02 11:30:08 +00:00
import com.facebook.react.bridge.ReactApplicationContext ;
import com.facebook.react.bridge.ReactContextBaseJavaModule ;
import com.facebook.react.bridge.ReactMethod ;
import com.facebook.react.bridge.Callback ;
import com.facebook.react.bridge.WritableMap ;
import com.facebook.react.bridge.ReadableMap ;
import com.facebook.react.bridge.ReactContext ;
import com.google.android.gms.tasks.OnCompleteListener ;
2017-03-13 17:23:41 +00:00
import com.google.android.gms.tasks.OnFailureListener ;
import com.google.android.gms.tasks.OnSuccessListener ;
2017-03-02 11:30:08 +00:00
import com.google.android.gms.tasks.Task ;
import com.google.firebase.auth.AuthCredential ;
import com.google.firebase.auth.AuthResult ;
2017-03-17 23:33:55 +00:00
import com.google.firebase.auth.GithubAuthProvider ;
import com.google.firebase.auth.TwitterAuthCredential ;
import com.google.firebase.auth.TwitterAuthProvider ;
2017-03-02 11:30:08 +00:00
import com.google.firebase.auth.UserProfileChangeRequest ;
import com.google.firebase.auth.FacebookAuthProvider ;
import com.google.firebase.auth.FirebaseAuth ;
import com.google.firebase.auth.FirebaseAuthException ;
import com.google.firebase.auth.FirebaseUser ;
import com.google.firebase.auth.GetTokenResult ;
import com.google.firebase.auth.GoogleAuthProvider ;
import com.google.firebase.auth.EmailAuthProvider ;
import io.invertase.firebase.Utils ;
@SuppressWarnings ( "ThrowableResultOfMethodCallIgnored" )
public class RNFirebaseAuth extends ReactContextBaseJavaModule {
private final int NO_CURRENT_USER = 100 ;
private final int ERROR_FETCHING_TOKEN = 101 ;
private final int ERROR_SENDING_VERIFICATION_EMAIL = 102 ;
private static final String TAG = "RNFirebaseAuth" ;
private ReactContext mReactContext ;
private FirebaseAuth mAuth ;
private FirebaseAuth . AuthStateListener mAuthListener ;
public RNFirebaseAuth ( ReactApplicationContext reactContext ) {
super ( reactContext );
mReactContext = reactContext ;
mAuth = FirebaseAuth . getInstance ();
2017-03-15 20:05:09 +00:00
Log . d ( TAG , "RNFirebaseAuth:initialized" );
2017-03-02 11:30:08 +00:00
}
@Override
public String getName () {
return TAG ;
}
2017-03-14 19:04:16 +00:00
/**
* Add a new auth state listener - if one doesn't exist already
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-13 20:02:44 +00:00
public void addAuthStateListener () {
2017-03-15 20:05:09 +00:00
Log . d ( TAG , "addAuthStateListener" );
2017-03-02 11:30:08 +00:00
if ( mAuthListener == null ) {
mAuthListener = new FirebaseAuth . AuthStateListener () {
@Override
public void onAuthStateChanged ( @NonNull FirebaseAuth firebaseAuth ) {
FirebaseUser user = firebaseAuth . getCurrentUser ();
WritableMap msgMap = Arguments . createMap ();
if ( user != null ) {
msgMap . putBoolean ( "authenticated" , true );
2017-03-15 20:05:09 +00:00
msgMap . putMap ( "user" , firebaseUserToMap ( user ));
2017-03-13 17:23:41 +00:00
Utils . sendEvent ( mReactContext , "onAuthStateChanged" , msgMap );
2017-03-02 11:30:08 +00:00
} else {
msgMap . putBoolean ( "authenticated" , false );
2017-03-13 17:23:41 +00:00
Utils . sendEvent ( mReactContext , "onAuthStateChanged" , msgMap );
2017-03-02 11:30:08 +00:00
}
}
};
mAuth . addAuthStateListener ( mAuthListener );
}
}
2017-03-13 20:02:44 +00:00
/**
* Removes the current auth state listener
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-15 20:05:09 +00:00
public void removeAuthStateListener () {
Log . d ( TAG , "removeAuthStateListener" );
2017-03-02 11:30:08 +00:00
if ( mAuthListener != null ) {
mAuth . removeAuthStateListener ( mAuthListener );
}
}
2017-03-13 20:02:44 +00:00
/**
* signOut
2017-03-13 20:14:17 +00:00
*
2017-03-13 20:02:44 +00:00
* @param promise
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-13 20:02:44 +00:00
public void signOut ( final Promise promise ) {
2017-03-15 20:05:09 +00:00
Log . d ( TAG , "signOut" );
2017-03-13 20:02:44 +00:00
if ( mAuth == null || mAuth . getCurrentUser () == null ) {
promiseNoUser ( promise , true );
} else {
mAuth . signOut ();
promiseNoUser ( promise , false );
}
}
/**
* signInAnonymously
2017-03-13 20:14:17 +00:00
*
2017-03-13 20:02:44 +00:00
* @param promise
*/
@ReactMethod
public void signInAnonymously ( final Promise promise ) {
Log . d ( TAG , "signInAnonymously" );
mAuth . signInAnonymously ()
. addOnSuccessListener ( new OnSuccessListener < AuthResult > () {
2017-03-02 11:38:43 +00:00
@Override
2017-03-13 20:02:44 +00:00
public void onSuccess ( AuthResult authResult ) {
Log . d ( TAG , "signInAnonymously:onComplete:success" );
promiseWithUser ( authResult . getUser (), promise );
}
})
. addOnFailureListener ( new OnFailureListener () {
@Override
public void onFailure ( @NonNull Exception exception ) {
Log . e ( TAG , "signInAnonymously:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-02 11:38:43 +00:00
}
});
2017-03-02 11:30:08 +00:00
}
2017-03-13 20:02:44 +00:00
/**
* createUserWithEmailAndPassword
2017-03-13 20:14:17 +00:00
*
2017-03-13 20:02:44 +00:00
* @param email
* @param password
* @param promise
*/
@ReactMethod
public void createUserWithEmailAndPassword ( final String email , final String password , final Promise promise ) {
Log . d ( TAG , "createUserWithEmailAndPassword" );
mAuth . createUserWithEmailAndPassword ( email , password )
. addOnSuccessListener ( new OnSuccessListener < AuthResult > () {
@Override
public void onSuccess ( AuthResult authResult ) {
Log . d ( TAG , "createUserWithEmailAndPassword:onComplete:success" );
promiseWithUser ( authResult . getUser (), promise );
}
})
. addOnFailureListener ( new OnFailureListener () {
@Override
public void onFailure ( @NonNull Exception exception ) {
Log . e ( TAG , "createUserWithEmailAndPassword:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-13 20:02:44 +00:00
}
});
}
2017-03-14 19:04:16 +00:00
/**
* signInWithEmailAndPassword
*
* @param email
* @param password
* @param promise
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-14 19:04:16 +00:00
public void signInWithEmailAndPassword ( final String email , final String password , final Promise promise ) {
Log . d ( TAG , "signInWithEmailAndPassword" );
2017-03-02 11:30:08 +00:00
mAuth . signInWithEmailAndPassword ( email , password )
2017-03-14 19:04:16 +00:00
. addOnSuccessListener ( new OnSuccessListener < AuthResult > () {
2017-03-02 11:38:43 +00:00
@Override
2017-03-14 19:04:16 +00:00
public void onSuccess ( AuthResult authResult ) {
Log . d ( TAG , "signInWithEmailAndPassword:onComplete:success" );
promiseWithUser ( authResult . getUser (), promise );
}
})
. addOnFailureListener ( new OnFailureListener () {
@Override
public void onFailure ( @NonNull Exception exception ) {
Log . e ( TAG , "signInWithEmailAndPassword:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-14 19:04:16 +00:00
}
});
}
/**
* signInWithCustomToken
*
* @param token
* @param promise
*/
@ReactMethod
public void signInWithCustomToken ( final String token , final Promise promise ) {
Log . d ( TAG , "signInWithCustomToken" );
mAuth . signInWithCustomToken ( token )
. addOnSuccessListener ( new OnSuccessListener < AuthResult > () {
@Override
public void onSuccess ( AuthResult authResult ) {
Log . d ( TAG , "signInWithCustomToken:onComplete:success" );
promiseWithUser ( authResult . getUser (), promise );
}
})
. addOnFailureListener ( new OnFailureListener () {
@Override
public void onFailure ( @NonNull Exception exception ) {
Log . e ( TAG , "signInWithCustomToken:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-02 11:38:43 +00:00
}
});
2017-03-02 11:30:08 +00:00
}
2017-03-15 20:05:09 +00:00
/**
* sendPasswordResetEmail
*
* @param email
* @param promise
*/
@ReactMethod
public void sendPasswordResetEmail ( final String email , final Promise promise ) {
Log . d ( TAG , "sendPasswordResetEmail" );
mAuth . sendPasswordResetEmail ( email )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "sendPasswordResetEmail:onComplete:success" );
promiseNoUser ( promise , false );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "sendPasswordResetEmail:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-15 20:05:09 +00:00
}
}
});
}
/**
* getCurrentUser - returns the current user, probably no need for this due to
* js side already listening for user auth changes
*
* @param promise
*/
@ReactMethod
public void getCurrentUser ( final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "getCurrentUser" );
if ( user == null ) {
promiseNoUser ( promise , false );
} else {
promiseWithUser ( user , promise );
}
}
2017-03-15 20:17:04 +00:00
/* ----------------------
* .currentUser methods
* ---------------------- */
2017-03-15 12:57:36 +00:00
/**
* delete
*
* @param promise
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-14 19:04:16 +00:00
public void delete ( final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "delete" );
if ( user != null ) {
user . delete ()
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "delete:onComplete:success" );
promiseNoUser ( promise , false );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "delete:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-14 19:04:16 +00:00
}
}
});
} else {
2017-03-15 20:17:04 +00:00
Log . e ( TAG , "delete:failure:noCurrentUser" );
2017-03-14 19:04:16 +00:00
promiseNoUser ( promise , true );
}
}
2017-03-15 20:17:04 +00:00
/**
* reload
*
* @param promise
*/
@ReactMethod
public void reload ( final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "delete" );
if ( user == null ) {
promiseNoUser ( promise , false );
Log . e ( TAG , "reload:failure:noCurrentUser" );
} else {
user . reload ()
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "reload:onComplete:success" );
promiseWithUser ( mAuth . getCurrentUser (), promise );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "reload:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-15 20:17:04 +00:00
}
}
});
}
}
2017-03-14 19:04:16 +00:00
/**
* signInWithCredential
*
* @param provider
* @param authToken
* @param authSecret
* @param promise
*/
@ReactMethod
public void signInWithCredential ( final String provider , final String authToken , final String authSecret , final Promise promise ) {
2017-03-17 23:33:55 +00:00
AuthCredential credential = getCredentialForProvider ( provider , authToken , authSecret );
if ( credential == null ) {
promise . reject ( "auth/invalid-credential" , "The supplied auth credential is malformed, has expired or is not currently supported." );
} else {
Log . d ( TAG , "signInWithCredential" );
mAuth . signInWithCredential ( credential )
. addOnCompleteListener ( new OnCompleteListener < AuthResult > () {
@Override
public void onComplete ( @NonNull Task < AuthResult > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "signInWithCredential:onComplete:success" );
2017-03-18 00:04:17 +00:00
promiseWithUser ( task . getResult (). getUser (), promise );
2017-03-17 23:33:55 +00:00
} else {
Exception exception = task . getException ();
Log . e ( TAG , "signInWithCredential:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
2017-03-14 19:04:16 +00:00
}
2017-03-02 11:30:08 +00:00
}
2017-03-16 12:19:34 +00:00
/**
* link
*
* @param provider
* @param authToken
* @param authSecret
* @param promise
*/
2017-03-02 11:30:08 +00:00
@ReactMethod
2017-03-16 12:19:34 +00:00
public void link ( final String provider , final String authToken , final String authSecret , final Promise promise ) {
2017-03-17 23:33:55 +00:00
AuthCredential credential = getCredentialForProvider ( provider , authToken , authSecret );
if ( credential == null ) {
promise . reject ( "auth/invalid-credential" , "The supplied auth credential is malformed, has expired or is not currently supported." );
} else {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "link" );
if ( user != null ) {
user . linkWithCredential ( credential )
. addOnCompleteListener ( new OnCompleteListener < AuthResult > () {
@Override
public void onComplete ( @NonNull Task < AuthResult > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "link:onComplete:success" );
2017-03-18 00:04:17 +00:00
promiseWithUser ( task . getResult (). getUser (), promise );
2017-03-17 23:33:55 +00:00
} else {
Exception exception = task . getException ();
Log . e ( TAG , "link:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
} else {
promiseNoUser ( promise , true );
}
}
2017-03-16 12:19:34 +00:00
}
2017-03-18 00:04:17 +00:00
/**
* reauthenticate
*
* @param provider
* @param authToken
* @param authSecret
* @param promise
*/
@ReactMethod
public void reauthenticate ( final String provider , final String authToken , final String authSecret , final Promise promise ) {
AuthCredential credential = getCredentialForProvider ( provider , authToken , authSecret );
if ( credential == null ) {
promise . reject ( "auth/invalid-credential" , "The supplied auth credential is malformed, has expired or is not currently supported." );
} else {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "reauthenticate" );
if ( user != null ) {
user . reauthenticate ( credential )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "reauthenticate:onComplete:success" );
promiseWithUser ( mAuth . getCurrentUser (), promise );
} else {
Exception exception = task . getException ();
Log . e ( TAG , "reauthenticate:onComplete:failure" , exception );
promiseRejectAuthException ( promise , exception );
}
}
});
} else {
promiseNoUser ( promise , true );
}
}
}
2017-03-16 12:19:34 +00:00
/**
2017-03-17 23:33:55 +00:00
* Returns an instance of AuthCredential for the specified provider
2017-03-16 12:19:34 +00:00
*
2017-03-17 23:33:55 +00:00
* @param provider
* @param authToken
* @param authSecret
* @return
2017-03-16 12:19:34 +00:00
*/
2017-03-17 23:33:55 +00:00
public AuthCredential getCredentialForProvider ( String provider , String authToken , String authSecret ) {
switch ( provider ) {
case "facebook" :
return FacebookAuthProvider . getCredential ( authToken );
case "google" :
2017-03-17 23:51:26 +00:00
return GoogleAuthProvider . getCredential ( authToken , authSecret );
2017-03-17 23:33:55 +00:00
case "twitter" :
return TwitterAuthProvider . getCredential ( authToken , authSecret );
case "github" :
return GithubAuthProvider . getCredential ( authToken );
case "password" :
return EmailAuthProvider . getCredential ( authToken , authSecret );
default :
return null ;
2017-03-02 11:30:08 +00:00
}
}
2017-03-16 12:35:03 +00:00
/**
* getToken
*
* @param promise
*/
@ReactMethod
public void getToken ( final Promise promise ) {
FirebaseUser user = mAuth . getCurrentUser ();
Log . d ( TAG , "getToken" );
if ( user != null ) {
user . getToken ( true )
. addOnCompleteListener ( new OnCompleteListener < GetTokenResult > () {
@Override
public void onComplete ( @NonNull Task < GetTokenResult > task ) {
if ( task . isSuccessful ()) {
Log . d ( TAG , "getToken:onComplete:success" );
promise . resolve ( task . getResult (). getToken ());
} else {
Exception exception = task . getException ();
Log . e ( TAG , "getToken:onComplete:failure" , exception );
2017-03-17 22:00:13 +00:00
promiseRejectAuthException ( promise , exception );
2017-03-16 12:35:03 +00:00
}
}
});
} else {
promiseNoUser ( promise , true );
}
}
2017-03-16 12:19:34 +00:00
// ----------------------- CLEAN ME -----------------------------------------------------
// ----------------------- CLEAN ME -----------------------------------------------------
// ----------------------- CLEAN ME -----------------------------------------------------
// ----------------------- CLEAN ME -----------------------------------------------------
// ----------------------- CLEAN ME -----------------------------------------------------
// ----------------------- CLEAN ME -----------------------------------------------------
// ----------------------- CLEAN ME -----------------------------------------------------
// ----------------------- CLEAN ME -----------------------------------------------------
// ----------------------- CLEAN ME -----------------------------------------------------
2017-03-02 11:30:08 +00:00
@ReactMethod
public void updateUserEmail ( final String email , final Callback callback ) {
FirebaseUser user = mAuth . getCurrentUser ();
if ( user != null ) {
user
2017-03-02 11:38:43 +00:00
. updateEmail ( email )
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
try {
if ( task . isSuccessful ()) {
Log . d ( TAG , "User email address updated" );
userCallback ( mAuth . getCurrentUser (), callback );
} else {
userErrorCallback ( task , callback );
2017-03-02 11:30:08 +00:00
}
2017-03-02 11:38:43 +00:00
} catch ( Exception ex ) {
userExceptionCallback ( ex , callback );
2017-03-02 11:30:08 +00:00
}
2017-03-02 11:38:43 +00:00
}
});
2017-03-02 11:30:08 +00:00
} else {
callbackNoUser ( callback , true );
}
}
@ReactMethod
public void updateUserPassword ( final String newPassword , final Callback callback ) {
FirebaseUser user = mAuth . getCurrentUser ();
if ( user != null ) {
user . updatePassword ( newPassword )
2017-03-02 11:38:43 +00:00
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
try {
if ( task . isSuccessful ()) {
Log . d ( TAG , "User password updated" );
userCallback ( mAuth . getCurrentUser (), callback );
} else {
userErrorCallback ( task , callback );
2017-03-02 11:30:08 +00:00
}
2017-03-02 11:38:43 +00:00
} catch ( Exception ex ) {
userExceptionCallback ( ex , callback );
2017-03-02 11:30:08 +00:00
}
2017-03-02 11:38:43 +00:00
}
});
2017-03-02 11:30:08 +00:00
} else {
callbackNoUser ( callback , true );
}
}
@ReactMethod
public void sendEmailVerification ( final Callback callback ) {
FirebaseUser user = mAuth . getCurrentUser ();
if ( user != null ) {
user . sendEmailVerification ()
2017-03-02 11:38:43 +00:00
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
try {
if ( task . isSuccessful ()) {
WritableMap resp = Arguments . createMap ();
resp . putString ( "status" , "complete" );
resp . putString ( "msg" , "User verification email sent" );
callback . invoke ( null , resp );
} else {
WritableMap err = Arguments . createMap ();
err . putInt ( "errorCode" , ERROR_SENDING_VERIFICATION_EMAIL );
err . putString ( "errorMessage" , task . getException (). getMessage ());
callback . invoke ( err );
2017-03-02 11:30:08 +00:00
}
2017-03-02 11:38:43 +00:00
} catch ( Exception ex ) {
userExceptionCallback ( ex , callback );
2017-03-02 11:30:08 +00:00
}
2017-03-02 11:38:43 +00:00
}
});
2017-03-02 11:30:08 +00:00
} else {
callbackNoUser ( callback , true );
}
}
@ReactMethod
public void updateUserProfile ( ReadableMap props , final Callback callback ) {
FirebaseUser user = mAuth . getCurrentUser ();
if ( user != null ) {
UserProfileChangeRequest . Builder profileBuilder = new UserProfileChangeRequest . Builder ();
Map < String , Object > m = Utils . recursivelyDeconstructReadableMap ( props );
if ( m . containsKey ( "displayName" )) {
String displayName = ( String ) m . get ( "displayName" );
profileBuilder . setDisplayName ( displayName );
}
if ( m . containsKey ( "photoUri" )) {
String photoUriStr = ( String ) m . get ( "photoUri" );
Uri uri = Uri . parse ( photoUriStr );
profileBuilder . setPhotoUri ( uri );
}
UserProfileChangeRequest profileUpdates = profileBuilder . build ();
user . updateProfile ( profileUpdates )
2017-03-02 11:38:43 +00:00
. addOnCompleteListener ( new OnCompleteListener < Void > () {
@Override
public void onComplete ( @NonNull Task < Void > task ) {
try {
if ( task . isSuccessful ()) {
Log . d ( TAG , "User profile updated" );
userCallback ( mAuth . getCurrentUser (), callback );
} else {
userErrorCallback ( task , callback );
2017-03-02 11:30:08 +00:00
}
2017-03-02 11:38:43 +00:00
} catch ( Exception ex ) {
userExceptionCallback ( ex , callback );
2017-03-02 11:30:08 +00:00
}
2017-03-02 11:38:43 +00:00
}
});
2017-03-02 11:30:08 +00:00
} else {
callbackNoUser ( callback , true );
}
}
2017-03-13 17:23:41 +00:00
/* ------------------
* INTERNAL HELPERS
* ---------------- */
/**
2017-03-13 20:02:44 +00:00
* Resolves or rejects an auth method promise without a user (user was missing)
2017-03-13 20:14:17 +00:00
*
2017-03-13 20:02:44 +00:00
* @param promise
* @param isError
*/
private void promiseNoUser ( Promise promise , Boolean isError ) {
if ( isError ) {
promise . reject ( "auth/no_current_user" , "No user currently signed in." );
} else {
promise . resolve ( null );
}
}
/**
2017-03-13 20:14:17 +00:00
* promiseWithUser
*
2017-03-13 20:02:44 +00:00
* @param user
* @param promise
*/
private void promiseWithUser ( final FirebaseUser user , final Promise promise ) {
if ( user != null ) {
2017-03-13 20:14:17 +00:00
WritableMap userMap = firebaseUserToMap ( user );
promise . resolve ( userMap );
2017-03-13 20:02:44 +00:00
} else {
promiseNoUser ( promise , true );
}
}
/**
2017-03-17 22:00:13 +00:00
* promiseRejectAuthException
2017-03-15 20:17:04 +00:00
*
2017-03-17 22:00:13 +00:00
* @param promise
* @param exception
2017-03-13 20:02:44 +00:00
*/
2017-03-17 22:00:13 +00:00
private void promiseRejectAuthException ( Promise promise , Exception exception ) {
2017-03-13 17:23:41 +00:00
String code = "UNKNOWN" ;
String message = exception . getMessage ();
2017-03-15 18:09:14 +00:00
try {
FirebaseAuthException authException = ( FirebaseAuthException ) exception ;
code = authException . getErrorCode ();
message = authException . getMessage ();
} catch ( Exception e ) {
Matcher matcher = Pattern . compile ( "\\[(.*?)\\]" ). matcher ( message );
if ( matcher . find ()) {
code = matcher . group (). substring ( 2 , matcher . group (). length () - 2 ). trim ();
switch ( code ) {
case "INVALID_CUSTOM_TOKEN" :
message = "The custom token format is incorrect. Please check the documentation." ;
break ;
case "CUSTOM_TOKEN_MISMATCH" :
message = "The custom token corresponds to a different audience." ;
break ;
case "INVALID_CREDENTIAL" :
message = "The supplied auth credential is malformed or has expired." ;
break ;
case "INVALID_EMAIL" :
message = "The email address is badly formatted." ;
break ;
case "WRONG_PASSWORD" :
message = "The password is invalid or the user does not have a password." ;
break ;
case "USER_MISMATCH" :
message = "The supplied credentials do not correspond to the previously signed in user." ;
break ;
case "REQUIRES_RECENT_LOGIN" :
message = "This operation is sensitive and requires recent authentication. Log in again before retrying this request." ;
break ;
case "ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL" :
message = "An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address." ;
break ;
case "EMAIL_ALREADY_IN_USE" :
message = "The email address is already in use by another account." ;
break ;
case "CREDENTIAL_ALREADY_IN_USE" :
message = "This credential is already associated with a different user account." ;
break ;
2017-03-15 18:17:57 +00:00
case "USER_DISABLED" :
2017-03-15 18:09:14 +00:00
message = "The user account has been disabled by an administrator." ;
break ;
case "USER_TOKEN_EXPIRED" :
message = "The user\'s credential is no longer valid. The user must sign in again." ;
break ;
case "USER_NOT_FOUND" :
message = "There is no user record corresponding to this identifier. The user may have been deleted." ;
break ;
case "INVALID_USER_TOKEN" :
message = "The user\'s credential is no longer valid. The user must sign in again." ;
break ;
case "WEAK_PASSWORD" :
message = "The given password is invalid." ;
break ;
case "OPERATION_NOT_ALLOWED" :
message = "This operation is not allowed. You must enable this service in the console." ;
break ;
}
2017-03-13 17:23:41 +00:00
}
}
2017-03-17 22:00:13 +00:00
code = "auth/" + code . toLowerCase (). replace ( "error_" , "" ). replace ( '_' , '-' );
promise . reject ( code , message , exception );
2017-03-13 17:23:41 +00:00
}
2017-03-15 20:05:09 +00:00
2017-03-17 22:00:13 +00:00
/**
* firebaseUserToMap
*
* @param user
* @return
*/
private WritableMap firebaseUserToMap ( FirebaseUser user ) {
WritableMap userMap = Arguments . createMap ();
final String email = user . getEmail ();
final String uid = user . getUid ();
final String provider = user . getProviderId ();
final String name = user . getDisplayName ();
final Boolean verified = user . isEmailVerified ();
final Uri photoUrl = user . getPhotoUrl ();
userMap . putString ( "uid" , uid );
userMap . putString ( "providerId" , provider );
userMap . putBoolean ( "emailVerified" , verified );
userMap . putBoolean ( "isAnonymous" , user . isAnonymous ());
if ( email != null ) {
userMap . putString ( "email" , email );
} else {
userMap . putNull ( "email" );
}
if ( name != null ) {
userMap . putString ( "displayName" , name );
} else {
userMap . putNull ( "displayName" );
}
if ( photoUrl != null ) {
userMap . putString ( "photoURL" , photoUrl . toString ());
} else {
userMap . putNull ( "photoURL" );
}
return userMap ;
}
2017-03-15 20:05:09 +00:00
// ------------------ Clean me when no longer used ------------------------------
// ------------------ Clean me when no longer used ------------------------------
// ------------------ Clean me when no longer used ------------------------------
// ------------------ Clean me when no longer used ------------------------------
// ------------------ Clean me when no longer used ------------------------------
// ------------------ Clean me when no longer used ------------------------------
@Deprecated
private void userCallback ( final FirebaseUser user , final Callback callback ) {
if ( user != null ) {
user . getToken ( true ). addOnCompleteListener ( new OnCompleteListener < GetTokenResult > () {
@Override
public void onComplete ( @NonNull Task < GetTokenResult > task ) {
try {
if ( task . isSuccessful ()) {
WritableMap userMap = firebaseUserToMap ( user );
userMap . putString ( "token" , task . getResult (). getToken ());
callback . invoke ( null , userMap );
} else {
userErrorCallback ( task , callback );
}
} catch ( Exception ex ) {
userExceptionCallback ( ex , callback );
}
}
});
} else {
callbackNoUser ( callback , true );
}
}
2017-03-13 20:02:44 +00:00
@Deprecated
2017-03-13 17:23:41 +00:00
private void callbackNoUser ( Callback callback , Boolean isError ) {
WritableMap err = Arguments . createMap ();
err . putInt ( "code" , NO_CURRENT_USER );
err . putString ( "message" , "No current user" );
if ( isError ) {
callback . invoke ( err );
} else {
callback . invoke ( null , null );
}
}
2017-03-15 20:05:09 +00:00
@Deprecated
2017-03-02 11:30:08 +00:00
private void userErrorCallback ( Task task , final Callback onFail ) {
WritableMap error = Arguments . createMap ();
2017-03-13 17:23:41 +00:00
error . putString ( "message" , (( FirebaseAuthException ) task . getException ()). getMessage ());
2017-03-02 11:30:08 +00:00
onFail . invoke ( error );
}
2017-03-15 20:05:09 +00:00
@Deprecated
2017-03-02 11:30:08 +00:00
private void userExceptionCallback ( Exception ex , final Callback onFail ) {
WritableMap error = Arguments . createMap ();
error . putInt ( "code" , ex . hashCode ());
error . putString ( "message" , ex . getMessage ());
onFail . invoke ( error );
}
}