package de.onyxbits.dummydroid; import java.io.File; import java.io.PrintWriter; import java.io.FileInputStream; import java.io.IOException; import java.math.BigInteger; import java.util.Properties; import javax.swing.SwingWorker; import com.akdeniz.googleplaycrawler.GooglePlay.AndroidCheckinRequest; import com.akdeniz.googleplaycrawler.GooglePlay.AndroidCheckinResponse; import com.akdeniz.googleplaycrawler.GooglePlay.ResponseWrapper; import com.akdeniz.googleplaycrawler.GooglePlay.UploadDeviceConfigRequest; import com.akdeniz.googleplaycrawler.GooglePlayAPI; import com.akdeniz.googleplaycrawler.Utils; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.HttpClient; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.impl.client.DefaultHttpClient; /** * A swingworker for uploading the checkinrequest to Play and getting a GSF ID. * * @author patrick * */ class CheckinWorker extends SwingWorker<String, Object> { private FormData formData; private CheckinForm callback; /** * Name of the file containing the network config */ public static final String NETCFG = "network.cfg"; public static final String PROXYHOST = "proxyhost"; public static final String PROXYPORT = "proxyport"; public static final String PROXYUSER = "proxyuser"; public static final String PROXYPASS = "proxypass"; public CheckinWorker(CheckinForm callback, FormData formData) { this.formData = formData; this.callback = callback; } protected void setProxy(HttpClient client) throws IOException { File cfgfile = new File(NETCFG); if (cfgfile.exists()) { Properties cfg = new Properties(); cfg.load(new FileInputStream(cfgfile)); String ph = cfg.getProperty(PROXYHOST, null); String pp = cfg.getProperty(PROXYPORT, null); String pu = cfg.getProperty(PROXYUSER, null); String pw = cfg.getProperty(PROXYPASS, null); if (ph == null || pp == null) { return; } final HttpHost proxy = new HttpHost(ph, Integer.parseInt(pp)); client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); if (pu != null && pw != null) { ((DefaultHttpClient) client).getCredentialsProvider().setCredentials( new AuthScope(proxy), new UsernamePasswordCredentials(pu, pw)); } } } @Override protected String doInBackground() throws Exception { GooglePlayAPI api = new GooglePlayAPI(formData.getUsername(), formData.getPassword()); setProxy(api.getClient()); // this first checkin is for generating android-id AndroidCheckinResponse checkinResponse = api.postCheckin(Utils.generateAndroidCheckinRequest() .toByteArray()); api.setAndroidID(BigInteger.valueOf(checkinResponse.getAndroidId()).toString(16).toUpperCase()); api.setSecurityToken((BigInteger.valueOf(checkinResponse.getSecurityToken()).toString(16))); String c2dmAuth = api.loginAC2DM(); AndroidCheckinRequest.Builder checkInbuilder = AndroidCheckinRequest.newBuilder(formData .getAndroidCheckinRequestBuilder().build()); AndroidCheckinRequest build = checkInbuilder .setId(new BigInteger(api.getAndroidID(), 16).longValue()) .setSecurityToken(new BigInteger(api.getSecurityToken(), 16).longValue()) .addAccountCookie("[" + formData.getUsername() + "]").addAccountCookie(c2dmAuth).build(); // this is the second checkin to match credentials with android-id api.postCheckin(build.toByteArray()); api.login(); UploadDeviceConfigRequest request = UploadDeviceConfigRequest.newBuilder() .setDeviceConfiguration(formData.getDeviceConfigurationProtoBuilder()).build(); ResponseWrapper responseWrapper = api.executePOSTRequest(GooglePlayAPI.UPLOADDEVICECONFIG_URL, request.toByteArray(), "application/x-protobuf"); responseWrapper.getPayload().getUploadDeviceConfigResponse(); PrintWriter pw = new PrintWriter(new File(api.getAndroidID().toUpperCase()+".txt")); pw.println(formData.assemble()); pw.close(); return api.getAndroidID(); } public void done() { try { callback.finished(get()); } catch (Exception e) { callback.finished(e); } } }