/* 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.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; import java.security.GeneralSecurityException; import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.net.BaseResource; import org.mozilla.gecko.sync.net.SyncResourceDelegate; import org.mozilla.gecko.sync.setup.Constants; import ch.boye.httpclientandroidlib.HttpResponse; import ch.boye.httpclientandroidlib.client.ClientProtocolException; public class EnsureUserExistenceStage implements AuthenticatorStage { private final String LOG_TAG = "EnsureUserExistence"; public interface EnsureUserExistenceStageDelegate { public void handleSuccess(); public void handleFailure(AuthenticationResult result); public void handleError(Exception e); } @Override public void execute(final AccountAuthenticator aa) throws URISyntaxException, UnsupportedEncodingException { final EnsureUserExistenceStageDelegate callbackDelegate = new EnsureUserExistenceStageDelegate() { @Override public void handleSuccess() { // User exists; now determine auth node. Logger.debug(LOG_TAG, "handleSuccess()"); aa.runNextStage(); } @Override public void handleFailure(AuthenticationResult result) { aa.abort(result, new Exception("Failure in EnsureUser")); } @Override public void handleError(Exception e) { Logger.info(LOG_TAG, "Error checking for user existence."); aa.abort(AuthenticationResult.FAILURE_SERVER, e); } }; String userRequestUrl = aa.nodeServer + Constants.AUTH_NODE_PATHNAME + Constants.AUTH_NODE_VERSION + aa.username; final BaseResource httpResource = new BaseResource(userRequestUrl); httpResource.delegate = new SyncResourceDelegate(httpResource) { @Override public void handleHttpResponse(HttpResponse response) { int statusCode = response.getStatusLine().getStatusCode(); switch(statusCode) { case 200: try { InputStream content = response.getEntity().getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(content, "UTF-8"), 1024); String inUse = reader.readLine(); BaseResource.consumeReader(reader); reader.close(); // Removed Logger.debug inUse, because stalling. if (inUse.equals("1")) { // Username exists. callbackDelegate.handleSuccess(); } else { // User does not exist. Logger.info(LOG_TAG, "No such user."); callbackDelegate.handleFailure(AuthenticationResult.FAILURE_USERNAME); } } catch (Exception e) { Logger.error(LOG_TAG, "Failure in content parsing.", e); callbackDelegate.handleFailure(AuthenticationResult.FAILURE_OTHER); } break; default: // No other response is acceptable. callbackDelegate.handleFailure(AuthenticationResult.FAILURE_OTHER); } Logger.debug(LOG_TAG, "Consuming entity."); BaseResource.consumeEntity(response.getEntity()); } @Override public void handleHttpProtocolException(ClientProtocolException e) { callbackDelegate.handleError(e); } @Override public void handleHttpIOException(IOException e) { callbackDelegate.handleError(e); } @Override public void handleTransportException(GeneralSecurityException e) { callbackDelegate.handleError(e); } }; // Make request. AccountAuthenticator.runOnThread(new Runnable() { @Override public void run() { httpResource.get(); } }); } }