/* Android IMSI-Catcher Detector | (c) AIMSICD Privacy Project
* -----------------------------------------------------------
* LICENSE: http://git.io/vki47 | TERMS: http://git.io/vki4o
* -----------------------------------------------------------
*/
package com.secupwn.aimsicd.ui.activities;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import com.secupwn.aimsicd.R;
import com.secupwn.aimsicd.service.AimsicdService;
import com.secupwn.aimsicd.service.CellTracker;
import com.secupwn.aimsicd.utils.Helpers;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;
import io.freefair.android.injection.annotation.Inject;
import io.freefair.android.injection.annotation.XmlLayout;
import io.freefair.android.util.logging.Logger;
/**
* Popup toast messages asking if user wants to download
* new API key to access OpenCellId services and data.
*/
@XmlLayout(R.layout.activity_open_cell_id)
public class OpenCellIdActivity extends BaseActivity {
private SharedPreferences prefs;
@Inject
private Logger log;
private ProgressDialog pd;
@Inject
private OkHttpClient okHttpClient;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
prefs = getSharedPreferences(AimsicdService.SHARED_PREFERENCES_BASENAME, 0);
}
public void onAcceptedClicked(View v) {
pd = new ProgressDialog(this);
pd.setMessage(getString(R.string.getting_ocid_key));
pd.show();
OpenCellIdKeyDownloaderTask ocikd = new OpenCellIdKeyDownloaderTask();
ocikd.execute(); //starts background thread
}
public void onCancelClicked(View v) {
finish();
}
/**
* Background thread to send and parse response from OCID
*/
private class OpenCellIdKeyDownloaderTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... voids) {
try {
return requestNewOCIDKey();
} catch (final IOException e) {
log.warn("Error getting new OCID-API", e);
/**
* In case response from OCID takes more time and user pressed back or anything else,
* application will crash due to 'UI modification from background thread, starting new
* runOnUIThread will prevent it.
*/
runOnUiThread(new Runnable() {
@Override
public void run() {
pd.dismiss();
Helpers.msgLong(OpenCellIdActivity.this, getString(R.string.ocid_api_error) +
e.getClass().getName() + " - " + e.getMessage());
finish();
}
});
return null;
}
}
@Override
protected void onPostExecute(String s) {
if (s == null || s.isEmpty()) {
return;
}
// Check key validity (is done on foreign server)
if (isKeyValid(s)) {
String opcidKey = getString(R.string.pref_ocid_key);
prefs.edit().putString(opcidKey, s).commit();
CellTracker.OCID_API_KEY = s;
Helpers.msgShort(OpenCellIdActivity.this, getString(R.string.ocid_api_success));
} else if (s.contains("Error: You can not register new account")) {
Helpers.msgLong(getApplicationContext(), getString(R.string.only_one_key_per_day));
} else if (s.contains("Bad Request")) {
Helpers.msgShort(OpenCellIdActivity.this, "Bad Request 400, 403 or 500 error ");
} else {
Helpers.msgShort(OpenCellIdActivity.this, "Unknown error please view logcat");
}
pd.dismiss();
finish();
}
// This might be extended in the future.
// Newly obtained keys start with: "dev-usr", not sure if that's a rule.
private boolean isKeyValid(String key) {
return key.startsWith("dev-");
}
/**
*
* Get an API key for Open Cell ID. Do not call this from the UI/Main thread.
* For the various server responses, pleas refer to the OpenCellID API wiki:
* See: http://wiki.opencellid.org/wiki/API#Error_codes
*
* OCID status codes http://wiki.opencellid.org/wiki/API#Error_codes
*
* 1 200 Cell not found
* 2 401 Invalid API key
* 3 400 Invalid input data
* 4 403 Your API key must be white listed in order to run this operation
* 5 500 Internal server error
* 6 503 Too many requests. Try later again
* 7 429 Daily limit 1000 requests exceeded for your API key.
*
* @return null or newly generated key
*/
public String requestNewOCIDKey() throws IOException {
Request request = new Request.Builder()
.get()
.url(getString(R.string.opencellid_api_get_key))
.build();
Response response = okHttpClient.newCall(request).execute();
int responseCode = response.code();
String htmlResponse = response.body().string();
// For debugging HTTP server response and codes
log.debug("Response Html=" + htmlResponse + " Response Code=" + String.valueOf(responseCode));
if (responseCode == 200) {
log.debug("OCID Code 1: Cell Not found: " + htmlResponse);
return htmlResponse;
} else if (responseCode == 401) {
log.debug("OCID Code 2: Invalid API Key! :" + htmlResponse);
return htmlResponse;
} else if (responseCode == 400) {
log.debug("OCID Code 3: Invalid input data: " + htmlResponse);
return "Bad Request"; // For making a toast!
} else if (responseCode == 403) {
log.debug("OCID Code 4: Your API key must be white listed: " + htmlResponse);
return "Bad Request"; // For making a toast!
} else if (responseCode == 500) {
log.debug("OCID Code 5: Remote internal server error: " + htmlResponse);
return "Bad Request"; // For making a toast!
} else if (responseCode == 503) {
log.debug("OCID Code 6: Reached 24hr API key request limit: " + htmlResponse);
return htmlResponse;
} else if (responseCode == 429) {
log.debug("OCID Code 7: Exceeded daily request limit (1000) for your API key: " + htmlResponse);
return htmlResponse;
} else {
log.debug("OCID Returned Unknown Response: " + responseCode);
return null;
}
}
}
}