Android Open Source - appengine-dashboard-app App Engine Dashboard Authenticator






From Project

Back to project page appengine-dashboard-app.

License

The source code is released under:

Apache License

If you think the Android project appengine-dashboard-app listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *//from   w  ww  . ja v  a  2s. c  o m
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.friedran.appengine.dashboard.client;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;

import com.friedran.appengine.dashboard.utils.LogUtils;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.IOException;

public class AppEngineDashboardAuthenticator {
    public static final String AUTH_TOKEN_TYPE = "ah";
    protected Account mAccount;
    protected DefaultHttpClient mHttpClient;
    protected Context mApplicationContext;
    protected OnUserInputRequiredCallback mOnUserInputRequiredCallback;
    protected PostAuthenticateCallback mPostAuthenticateCallback;
    protected String mAuthToken;

    public interface OnUserInputRequiredCallback {
        public void onUserInputRequired(Intent accountManagerIntent);
    }

    public interface PostAuthenticateCallback {
        public void run(boolean result);
    }

    public AppEngineDashboardAuthenticator(Account account, DefaultHttpClient httpClient, Context context,
                                           OnUserInputRequiredCallback userInputRequiredCallback,
                                           PostAuthenticateCallback postAuthenticateCallback) {
        mAccount = account;
        mHttpClient = httpClient;
        mApplicationContext = context.getApplicationContext();
        mOnUserInputRequiredCallback = userInputRequiredCallback;
        mPostAuthenticateCallback = postAuthenticateCallback;
    }

    public void invalidateAuthToken() {
        if (mAuthToken == null) {
            LogUtils.e("AppEngineDashboardAuthenticator", "AuthToken hasn't been retrieved yet..");
            return;
        }

        LogUtils.i("AppEngineDashboardAuthenticator", "Invalidating the previous authToken: " + mAuthToken);
        AccountManager.get(mApplicationContext).invalidateAuthToken(mAccount.type, mAuthToken);
        mAuthToken = null;
    }

    public void executeAuthentication() {
        // Gets the auth token asynchronously, calling the callback with its result (uses the
        // deprecated API which is the only one supported from API level 5).
        AccountManager.get(mApplicationContext).getAuthToken(mAccount, AUTH_TOKEN_TYPE, false, new AccountManagerCallback<Bundle>() {
            public void run(AccountManagerFuture result) {
                Bundle bundle;
                try {
                    LogUtils.i("AppEngineDashboardAuthenticator", "GetAuthTokenCallback.onPostExecute started...");
                    bundle = (Bundle) result.getResult();
                    Intent intent = (Intent)bundle.get(AccountManager.KEY_INTENT);
                    if(intent != null) {
                        // User input required
                        LogUtils.i("AppEngineDashboardAuthenticator", "User input is required...");
                        mOnUserInputRequiredCallback.onUserInputRequired(intent);
                    } else {
                        LogUtils.i("AppEngineDashboardAuthenticator", "Authenticated, getting auth token...");
                        onGetAuthToken(bundle);
                    }
                } catch (Exception e) {
                    // Can happen because of various like connectivity issues, google server errors, etc.
                    LogUtils.e("AppEngineDashboardAuthenticator", "Exception caught from GetAuthTokenCallback", e);
                    mPostAuthenticateCallback.run(false);
                }
            }
        }, null);
    }

    protected void onGetAuthToken(Bundle bundle) {
        mAuthToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
        LogUtils.i("AppEngineDashboardAuthenticator", "onGetAuthToken: Got the auth token " + mAuthToken);

        if (mAuthToken == null) {
            // Failure, looks like an illegal account
            mPostAuthenticateCallback.run(false);
        } else {
            new LoginToAppEngineTask().execute();
        }
    }

    private class LoginToAppEngineTask extends AsyncTask<String, Void, Boolean> {
        @Override
        protected Boolean doInBackground(String... params) {
            try {
                LogUtils.i("AppEngineDashboardAuthenticator", "LoginToAppEngine starting...");

                // Don't follow redirects
                mHttpClient.getParams().setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, false);

                String url = "https://appengine.google.com/_ah/login?continue=http://localhost/&auth=" + mAuthToken;
                LogUtils.i("LoginToAppEngineTask", "Executing GET request: " + url);
                HttpGet httpGet = new HttpGet(url);
                HttpResponse response;
                response = mHttpClient.execute(httpGet);
                response.getEntity().consumeContent();
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode != 302)
                    throw new IOException("LoginToAppEngineTask failed: Got an unexpected status code: " + statusCode);

                for(Cookie cookie : mHttpClient.getCookieStore().getCookies()) {
                    LogUtils.i("LoginToAppEngineTask", "Cookie name: " + cookie.getName());
                    if(cookie.getName().equals("SACSID"))
                        return true;
                }

                // No cookie means an invalid token, we have to fail...

            } catch (IOException e) {
                LogUtils.e("LoginToAppEngineTask", "IOException caught from authenticator logic", e);
            } finally {
                mHttpClient.getParams().setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, true);
            }
            LogUtils.e("AppEngineDashboardAuthenticator", "LoginToAppEngine failed...");

            return false;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            LogUtils.i("AppEngineDashboardAuthenticator", "LoginToAppEngine onPostExecute");
            mPostAuthenticateCallback.run(result);
        }
    }
}




Java Source Code List

com.friedran.appengine.dashboard.client.AppEngineDashboardAPI.java
com.friedran.appengine.dashboard.client.AppEngineDashboardAuthenticator.java
com.friedran.appengine.dashboard.client.AppEngineDashboardClient.java
com.friedran.appengine.dashboard.gui.DashboardActivity.java
com.friedran.appengine.dashboard.gui.DashboardLoadFragment.java
com.friedran.appengine.dashboard.gui.LoginActivity.java
com.friedran.appengine.dashboard.gui.PullToRefreshAttacher.java
com.friedran.appengine.dashboard.utils.AnalyticsUtils.java
com.friedran.appengine.dashboard.utils.AppEngineParserUtils.java
com.friedran.appengine.dashboard.utils.DashboardPreferences.java
com.friedran.appengine.dashboard.utils.LogUtils.java