package com.github.andlyticsproject.console.v2; import android.app.Activity; import android.util.Log; import com.github.andlyticsproject.console.AuthenticationException; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.CookieStore; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class PasswordAuthenticator extends BaseAuthenticator { private static final String TAG = PasswordAuthenticator.class.getSimpleName(); private static final boolean DEBUG = false; private static final String LOGIN_PAGE_URL = "https://accounts.google.com/ServiceLogin?service=androiddeveloper"; private static final String AUTHENTICATE_URL = "https://accounts.google.com/ServiceLoginAuth?service=androiddeveloper"; private static final String DEV_CONSOLE_URL = "https://play.google.com/apps/publish/v2/"; private DefaultHttpClient httpClient; private String password; public PasswordAuthenticator(String accountName, String password, DefaultHttpClient httpClient) { super(accountName); this.httpClient = httpClient; this.password = password; } // 1. Get GALX from https://accounts.google.com/ServiceLogin // 2. Post along with auth info to // https://accounts.google.com/ServiceLoginAuth // 3. Get redirected to https://play.google.com/apps/publish/v2/ on success // (all needed cookies are in HttpClient's cookie jar at this point) @Override public SessionCredentials authenticate(Activity activity, boolean invalidate) throws AuthenticationException { return authenticate(); } @Override public SessionCredentials authenticateSilently(boolean invalidate) throws AuthenticationException { return authenticate(); } private SessionCredentials authenticate() throws AuthenticationException { try { HttpGet get = new HttpGet(LOGIN_PAGE_URL); HttpResponse response = httpClient.execute(get); if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { throw new AuthenticationException("Auth error: " + response.getStatusLine()); } String galxValue = null; CookieStore cookieStore = httpClient.getCookieStore(); List<Cookie> cookies = cookieStore.getCookies(); for (Cookie c : cookies) { if ("GALX".equals(c.getName())) { galxValue = c.getValue(); } } if (DEBUG) { Log.d(TAG, "GALX: " + galxValue); } HttpPost post = new HttpPost(AUTHENTICATE_URL); List<NameValuePair> parameters = createAuthParameters(galxValue); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, "UTF-8"); post.setEntity(formEntity); response = httpClient.execute(post); if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { throw new AuthenticationException("Auth error: " + response.getStatusLine()); } String responseStr = EntityUtils.toString(response.getEntity()); if (DEBUG) { Log.d(TAG, "Response: " + responseStr); } return createSessionCredentials(accountName, AUTHENTICATE_URL, responseStr, httpClient .getCookieStore().getCookies()); } catch (ClientProtocolException e) { throw new AuthenticationException(e); } catch (IOException e) { throw new AuthenticationException(e); } } private List<NameValuePair> createAuthParameters(String galxValue) { List<NameValuePair> result = new ArrayList<NameValuePair>(); NameValuePair email = new BasicNameValuePair("Email", accountName); result.add(email); NameValuePair passwd = new BasicNameValuePair("Passwd", password); result.add(passwd); NameValuePair galx = new BasicNameValuePair("GALX", galxValue); result.add(galx); NameValuePair cont = new BasicNameValuePair("continue", DEV_CONSOLE_URL); result.add(cont); return result; } }