use of com.firebase.ui.auth.util.data.AuthOperationManager in project FirebaseUI-Android by firebase.
the class EmailLinkSignInHandler method handleLinkingFlow.
private void handleLinkingFlow(final AuthOperationManager authOperationManager, final EmailLinkPersistenceManager persistenceManager, final IdpResponse response, final String link) {
final AuthCredential storedCredentialForLink = ProviderUtils.getAuthCredential(response);
final AuthCredential emailLinkCredential = EmailAuthProvider.getCredentialWithLink(response.getEmail(), link);
if (authOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
authOperationManager.safeLink(emailLinkCredential, storedCredentialForLink, getArguments()).addOnCompleteListener(task -> {
persistenceManager.clearAllData(getApplication());
if (task.isSuccessful()) {
handleMergeFailure(storedCredentialForLink);
} else {
setResult(Resource.forFailure(task.getException()));
}
});
} else {
getAuth().signInWithCredential(emailLinkCredential).continueWithTask(task -> {
persistenceManager.clearAllData(getApplication());
if (!task.isSuccessful()) {
return task;
}
return task.getResult().getUser().linkWithCredential(storedCredentialForLink).continueWithTask(new ProfileMerger(response)).addOnFailureListener(new TaskFailureLogger(TAG, "linkWithCredential+merge failed."));
}).addOnSuccessListener(authResult -> {
FirebaseUser user = authResult.getUser();
IdpResponse response1 = new IdpResponse.Builder(new User.Builder(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD, user.getEmail()).setName(user.getDisplayName()).setPhotoUri(user.getPhotoUrl()).build()).build();
handleSuccess(response1, authResult);
}).addOnFailureListener(e -> setResult(Resource.forFailure(e)));
}
}
use of com.firebase.ui.auth.util.data.AuthOperationManager in project FirebaseUI-Android by firebase.
the class EmailLinkSignInHandler method finishSignIn.
private void finishSignIn(@NonNull String email, @Nullable IdpResponse response) {
if (TextUtils.isEmpty(email)) {
setResult(Resource.forFailure(new FirebaseUiException(ErrorCodes.EMAIL_MISMATCH_ERROR)));
return;
}
final AuthOperationManager authOperationManager = AuthOperationManager.getInstance();
final EmailLinkPersistenceManager persistenceManager = EmailLinkPersistenceManager.getInstance();
String link = getArguments().emailLink;
if (response == null) {
handleNormalFlow(authOperationManager, persistenceManager, email, link);
} else {
handleLinkingFlow(authOperationManager, persistenceManager, response, link);
}
}
use of com.firebase.ui.auth.util.data.AuthOperationManager in project FirebaseUI-Android by firebase.
the class EmailLinkSignInHandler method handleNormalFlow.
private void handleNormalFlow(final AuthOperationManager authOperationManager, final EmailLinkPersistenceManager persistenceManager, final String email, final String link) {
final AuthCredential emailLinkCredential = EmailAuthProvider.getCredentialWithLink(email, link);
// Bug in core SDK - credential is mutated and won't be usable for sign in, so create
// a new one to pass back. b/117425827
final AuthCredential emailLinkCredentialForLinking = EmailAuthProvider.getCredentialWithLink(email, link);
// Either regular sign in or anonymous user upgrade
authOperationManager.signInAndLinkWithCredential(getAuth(), getArguments(), emailLinkCredential).addOnSuccessListener(authResult -> {
persistenceManager.clearAllData(getApplication());
FirebaseUser user = authResult.getUser();
IdpResponse response = new IdpResponse.Builder(new User.Builder(EMAIL_LINK_PROVIDER, user.getEmail()).setName(user.getDisplayName()).setPhotoUri(user.getPhotoUrl()).build()).build();
handleSuccess(response, authResult);
}).addOnFailureListener(e -> {
persistenceManager.clearAllData(getApplication());
if (e instanceof FirebaseAuthUserCollisionException) {
handleMergeFailure(emailLinkCredentialForLinking);
} else {
setResult(Resource.forFailure(e));
}
});
}
use of com.firebase.ui.auth.util.data.AuthOperationManager in project FirebaseUI-Android by firebase.
the class LinkingSocialProviderResponseHandler method startSignIn.
public void startSignIn(@NonNull final IdpResponse response) {
if (!response.isSuccessful()) {
setResult(Resource.forFailure(response.getError()));
return;
}
if (isInvalidProvider(response.getProviderType())) {
throw new IllegalStateException("This handler cannot be used to link email or phone providers.");
}
if (mEmail != null && !mEmail.equals(response.getEmail())) {
setResult(Resource.forFailure(new FirebaseUiException(ErrorCodes.EMAIL_MISMATCH_ERROR)));
return;
}
setResult(Resource.forLoading());
// return a credential.
if (isGenericIdpLinkingFlow(response.getProviderType())) {
getAuth().getCurrentUser().linkWithCredential(mRequestedSignInCredential).addOnSuccessListener(authResult -> handleSuccess(response, authResult)).addOnFailureListener(e -> Resource.<IdpResponse>forFailure(e));
return;
}
final AuthOperationManager authOperationManager = AuthOperationManager.getInstance();
final AuthCredential credential = ProviderUtils.getAuthCredential(response);
if (authOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
if (mRequestedSignInCredential == null) {
// The user has provided a valid credential by signing in with a federated
// idp. linkWithCredential will fail because the user is anonymous and the account
// exists (we're in the welcome back flow).
// We know that they are signing in with the same IDP because requestSignInCredential
// is null.
// We just need to have the developer handle the merge failure.
handleMergeFailure(credential);
} else {
// The user has logged in with an IDP that has the same email with another IDP
// present on the account.
// These IDPs belong to the same account - they must be linked, but we can't lose
// our anonymous user session
authOperationManager.safeLink(credential, mRequestedSignInCredential, getArguments()).addOnSuccessListener(result -> handleMergeFailure(credential)).addOnFailureListener(e -> setResult(Resource.forFailure(e)));
}
} else {
getAuth().signInWithCredential(credential).continueWithTask(task -> {
final AuthResult result = task.getResult();
if (mRequestedSignInCredential == null) {
return Tasks.forResult(result);
} else {
return result.getUser().linkWithCredential(mRequestedSignInCredential).continueWith(task1 -> {
if (task1.isSuccessful()) {
return task1.getResult();
} else {
// to backtrack so we just ignore any errors.
return result;
}
});
}
}).addOnCompleteListener(task -> {
if (task.isSuccessful()) {
handleSuccess(response, task.getResult());
} else {
setResult(Resource.forFailure(task.getException()));
}
});
}
}
use of com.firebase.ui.auth.util.data.AuthOperationManager in project FirebaseUI-Android by firebase.
the class WelcomeBackPasswordHandler method startSignIn.
/**
* Kick off the sign-in process.
*/
public void startSignIn(@NonNull final String email, @NonNull final String password, @NonNull final IdpResponse inputResponse, @Nullable final AuthCredential credential) {
setResult(Resource.forLoading());
// Store the password before signing in so it can be used for later credential building
mPendingPassword = password;
// Build appropriate IDP response based on inputs
final IdpResponse outputResponse;
if (credential == null) {
// New credential for the email provider
outputResponse = new IdpResponse.Builder(new User.Builder(EmailAuthProvider.PROVIDER_ID, email).build()).build();
} else {
// New credential for an IDP (Phone or Social)
outputResponse = new IdpResponse.Builder(inputResponse.getUser()).setPendingCredential(inputResponse.getCredentialForLinking()).setToken(inputResponse.getIdpToken()).setSecret(inputResponse.getIdpSecret()).build();
}
final AuthOperationManager authOperationManager = AuthOperationManager.getInstance();
if (authOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
final AuthCredential credToValidate = EmailAuthProvider.getCredential(email, password);
// Check to see if we need to link (for social providers with the same email)
if (AuthUI.SOCIAL_PROVIDERS.contains(inputResponse.getProviderType())) {
// Add the provider to the same account before triggering a merge failure.
authOperationManager.safeLink(credToValidate, credential, getArguments()).addOnSuccessListener(result -> handleMergeFailure(credToValidate)).addOnFailureListener(e -> setResult(Resource.forFailure(e)));
} else {
// The user has not tried to log in with a federated IDP containing the same email.
// In this case, we just need to verify that the credential they provided is valid.
// No linking is done for non-federated IDPs.
// A merge failure occurs because the account exists and the user is anonymous.
authOperationManager.validateCredential(credToValidate, getArguments()).addOnCompleteListener(task -> {
if (task.isSuccessful()) {
handleMergeFailure(credToValidate);
} else {
setResult(Resource.forFailure(task.getException()));
}
});
}
} else {
// Kick off the flow including signing in, linking accounts, and saving with SmartLock
getAuth().signInWithEmailAndPassword(email, password).continueWithTask(task -> {
// Forward task failure by asking for result
AuthResult result = task.getResult(Exception.class);
// Task succeeded, link user if necessary
if (credential == null) {
return Tasks.forResult(result);
} else {
return result.getUser().linkWithCredential(credential).continueWithTask(new ProfileMerger(outputResponse)).addOnFailureListener(new TaskFailureLogger(TAG, "linkWithCredential+merge failed."));
}
}).addOnSuccessListener(result -> handleSuccess(outputResponse, result)).addOnFailureListener(e -> setResult(Resource.forFailure(e))).addOnFailureListener(new TaskFailureLogger(TAG, "signInWithEmailAndPassword failed."));
}
}
Aggregations