diff -r 000000000000 -r 6474c204b198 mobile/android/base/sync/setup/auth/AccountAuthenticator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/sync/setup/auth/AccountAuthenticator.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,105 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.gecko.sync.setup.auth; + +import java.util.LinkedList; +import java.util.Queue; + +import org.mozilla.gecko.background.common.log.Logger; +import org.mozilla.gecko.sync.ThreadPool; +import org.mozilla.gecko.sync.Utils; +import org.mozilla.gecko.sync.setup.activities.AccountActivity; + +public class AccountAuthenticator { + private final String LOG_TAG = "AccountAuthenticator"; + + private AccountActivity activityCallback; + private Queue stages; + + // Values for authentication. + public String password; + public String username; + + public String authServer; + public String nodeServer; + + public boolean isSuccess = false; + public boolean isCanceled = false; + + public AccountAuthenticator(AccountActivity activity) { + activityCallback = activity; + prepareStages(); + } + + private void prepareStages() { + stages = new LinkedList(); + stages.add(new EnsureUserExistenceStage()); + stages.add(new FetchUserNodeStage()); + stages.add(new AuthenticateAccountStage()); + } + + public void authenticate(String server, String account, String password) { + // Set authentication values. + if (!server.endsWith("/")) { + server += "/"; + } + nodeServer = server; + this.password = password; + + // Calculate and save username hash. + try { + username = Utils.usernameFromAccount(account); + } catch (Exception e) { + abort(AuthenticationResult.FAILURE_OTHER, e); + return; + } + Logger.pii(LOG_TAG, "Username:" + username); + Logger.debug(LOG_TAG, "Running first stage."); + // Start first stage of authentication. + runNextStage(); + } + + /** + * Run next stage of authentication. + */ + public void runNextStage() { + if (isCanceled) { + return; + } + if (stages.size() == 0) { + Logger.debug(LOG_TAG, "Authentication completed."); + activityCallback.authCallback(isSuccess ? AuthenticationResult.SUCCESS : AuthenticationResult.FAILURE_PASSWORD); + return; + } + AuthenticatorStage nextStage = stages.remove(); + try { + nextStage.execute(this); + } catch (Exception e) { + Logger.warn(LOG_TAG, "Unhandled exception in stage " + nextStage); + abort(AuthenticationResult.FAILURE_OTHER, e); + } + } + + /** + * Abort authentication. + * + * @param result + * returned to callback. + * @param e + * Exception causing abort. + */ + public void abort(AuthenticationResult result, Exception e) { + if (isCanceled) { + return; + } + Logger.warn(LOG_TAG, "Authentication failed.", e); + activityCallback.authCallback(result); + } + + /* Helper functions */ + public static void runOnThread(Runnable run) { + ThreadPool.run(run); + } +}