package carnero.cgeo;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import android.net.Uri;
import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.view.View;
import android.widget.EditText;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.Button;
import java.io.IOException;
import javax.net.ssl.HttpsURLConnection;
public class cgeoauth extends Activity {
private cgeoapplication app = null;
private Resources res = null;
private Activity activity = null;
private cgSettings settings = null;
private cgBase base = null;
private cgWarning warning = null;
private SharedPreferences prefs = null;
private String OAtoken = null;
private String OAtokenSecret = null;
private final Pattern paramsPattern1 = Pattern.compile("oauth_token=([a-zA-Z0-9\\-\\_\\.]+)");
private final Pattern paramsPattern2 = Pattern.compile("oauth_token_secret=([a-zA-Z0-9\\-\\_\\.]+)");
private Button startButton = null;
private EditText pinEntry = null;
private Button pinEntryButton = null;
private ProgressDialog requestTokenDialog = null;
private ProgressDialog changeTokensDialog = null;
private Handler requestTokenHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (requestTokenDialog != null && requestTokenDialog.isShowing() == true) {
requestTokenDialog.dismiss();
}
startButton.setOnClickListener(new startListener());
startButton.setEnabled(true);
if (msg.what == 1) {
startButton.setText(res.getString(R.string.auth_again));
pinEntry.setVisibility(View.VISIBLE);
pinEntryButton.setVisibility(View.VISIBLE);
pinEntryButton.setOnClickListener(new confirmPINListener());
} else {
warning.showToast(res.getString(R.string.err_auth_initialize));
startButton.setText(res.getString(R.string.auth_start));
}
}
};
private Handler changeTokensHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (changeTokensDialog != null && changeTokensDialog.isShowing() == true) {
changeTokensDialog.dismiss();
}
pinEntryButton.setOnClickListener(new confirmPINListener());
pinEntryButton.setEnabled(true);
if (msg.what == 1) {
warning.showToast(res.getString(R.string.auth_dialog_completed));
pinEntryButton.setVisibility(View.GONE);
finish();
} else {
warning.showToast(res.getString(R.string.err_auth_process));
pinEntry.setVisibility(View.GONE);
pinEntryButton.setVisibility(View.GONE);
startButton.setText(res.getString(R.string.auth_start));
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// init
activity = this;
res = this.getResources();
app = (cgeoapplication) this.getApplication();
app.setAction("setting up");
prefs = getSharedPreferences(cgSettings.preferences, 0);
settings = new cgSettings(this, prefs);
base = new cgBase(app, settings, prefs);
warning = new cgWarning(this);
// set layout
if (settings.skin == 1) {
setTheme(R.style.light);
} else {
setTheme(R.style.dark);
}
setContentView(R.layout.auth);
base.setTitle(activity, res.getString(R.string.auth_twitter));
// google analytics
base.sendAnal(activity, "/auth");
init();
}
@Override
public void onResume() {
super.onResume();
settings.load();
}
private void init() {
startButton = (Button) findViewById(R.id.start);
pinEntry = (EditText) findViewById(R.id.pin);
pinEntryButton = (Button) findViewById(R.id.pin_button);
OAtoken = prefs.getString("temp-token-public", null);
OAtokenSecret = prefs.getString("temp-token-secret", null);
startButton.setEnabled(true);
startButton.setOnClickListener(new startListener());
if (OAtoken == null || OAtoken.length() == 0 || OAtokenSecret == null || OAtokenSecret.length() == 0) {
// start authorization process
startButton.setText(res.getString(R.string.auth_start));
} else {
// already have temporary tokens, continue from pin
startButton.setText(res.getString(R.string.auth_again));
pinEntry.setVisibility(View.VISIBLE);
pinEntryButton.setVisibility(View.VISIBLE);
pinEntryButton.setOnClickListener(new confirmPINListener());
}
}
private void requestToken() {
final String host = "twitter.com";
final String pathRequest = "/oauth/request_token";
final String pathAuthorize = "/oauth/authorize";
final String method = "GET";
int status = 0;
try {
String lineOne = null;
HttpsURLConnection connection = null;
try {
final StringBuilder sb = new StringBuilder();
final String params = cgOAuth.signOAuth(host, pathRequest, method, true, new HashMap<String, String>(), null, null);
int code = -1;
int retries = 0;
do {
// base.trustAllHosts();
Log.d(cgSettings.tag, "https://" + host + pathRequest + "?" + params);
final URL u = new URL("https://" + host + pathRequest + "?" + params);
final URLConnection uc = u.openConnection();
connection = (HttpsURLConnection) uc;
// connection.setHostnameVerifier(base.doNotVerify);
connection.setReadTimeout(30000);
connection.setRequestMethod(method);
HttpsURLConnection.setFollowRedirects(true);
connection.setDoInput(true);
connection.setDoOutput(false);
final InputStream in = connection.getInputStream();
final InputStreamReader ins = new InputStreamReader(in);
final BufferedReader br = new BufferedReader(ins);
while ((lineOne = br.readLine()) != null) {
sb.append(lineOne);
sb.append("\n");
}
code = connection.getResponseCode();
retries++;
Log.i(cgSettings.tag, host + ": " + connection.getResponseCode() + " " + connection.getResponseMessage());
br.close();
in.close();
ins.close();
} while (code == -1 && retries < 5);
final String line = sb.toString();
if (line != null && line.length() > 0) {
final Matcher paramsMatcher1 = paramsPattern1.matcher(line);
if (paramsMatcher1.find() == true && paramsMatcher1.groupCount() > 0) {
OAtoken = paramsMatcher1.group(1).toString();
}
final Matcher paramsMatcher2 = paramsPattern2.matcher(line);
if (paramsMatcher2.find() == true && paramsMatcher2.groupCount() > 0) {
OAtokenSecret = paramsMatcher2.group(1).toString();
}
if (OAtoken != null && OAtoken.length() > 0 && OAtokenSecret != null && OAtokenSecret.length() > 0) {
final SharedPreferences.Editor prefsEdit = getSharedPreferences(cgSettings.preferences, 0).edit();
prefsEdit.putString("temp-token-public", OAtoken);
prefsEdit.putString("temp-token-secret", OAtokenSecret);
prefsEdit.commit();
try {
final HashMap<String, String> paramsPre = new HashMap<String, String>();
paramsPre.put("oauth_callback", "oob");
final String paramsBrowser = cgOAuth.signOAuth(host, pathAuthorize, "GET", true, paramsPre, OAtoken, OAtokenSecret);
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://" + host + pathAuthorize + "?" + paramsBrowser)));
status = 1;
} catch (Exception e) {
Log.e(cgSettings.tag, "cgeoauth.requestToken(2): " + e.toString());
}
}
}
} catch (IOException eio) {
Log.e(cgSettings.tag, "cgeoauth.requestToken(IO): " + eio.toString() + " ~ " + connection.getResponseCode() + ": " + connection.getResponseMessage());
} catch (Exception e) {
Log.e(cgSettings.tag, "cgeoauth.requestToken(1): " + e.toString());
} finally {
if (connection != null) {
connection.disconnect();
}
}
} catch (Exception e2) {
Log.e(cgSettings.tag, "cgeoauth.requestToken(3): " + e2.toString());
}
requestTokenHandler.sendEmptyMessage(status);
}
private void changeToken() {
final String host = "twitter.com";
final String path = "/oauth/access_token";
final String method = "POST";
int status = 0;
String lineOne = null;
try {
final HashMap<String, String> paramsPre = new HashMap<String, String>();
paramsPre.put("oauth_verifier", pinEntry.getText().toString());
int code = -1;
int retries = 0;
final String params = cgOAuth.signOAuth(host, path, method, true, paramsPre, OAtoken, OAtokenSecret);
final StringBuilder sb = new StringBuilder();
do {
// base.trustAllHosts();
final URL u = new URL("https://" + host + path);
final URLConnection uc = u.openConnection();
final HttpsURLConnection connection = (HttpsURLConnection) uc;
// connection.setHostnameVerifier(base.doNotVerify);
connection.setReadTimeout(30000);
connection.setRequestMethod(method);
HttpsURLConnection.setFollowRedirects(true);
connection.setDoOutput(true);
connection.setDoInput(true);
final OutputStream out = connection.getOutputStream();
final OutputStreamWriter wr = new OutputStreamWriter(out);
wr.write(params);
wr.flush();
wr.close();
out.close();
final InputStream in = connection.getInputStream();
final InputStreamReader ins = new InputStreamReader(in);
final BufferedReader br = new BufferedReader(ins);
while ((lineOne = br.readLine()) != null) {
sb.append(lineOne);
sb.append("\n");
}
code = connection.getResponseCode();
retries++;
Log.i(cgSettings.tag, host + ": " + connection.getResponseCode() + " " + connection.getResponseMessage());
br.close();
ins.close();
in.close();
connection.disconnect();
} while (code == -1 && retries < 5);
final String line = sb.toString();
OAtoken = "";
OAtokenSecret = "";
final Matcher paramsMatcher1 = paramsPattern1.matcher(line);
if (paramsMatcher1.find() == true && paramsMatcher1.groupCount() > 0) {
OAtoken = paramsMatcher1.group(1).toString();
}
final Matcher paramsMatcher2 = paramsPattern2.matcher(line);
if (paramsMatcher2.find() == true && paramsMatcher2.groupCount() > 0) {
OAtokenSecret = paramsMatcher2.group(1).toString();
}
if (OAtoken.length() == 0 || OAtokenSecret.length() == 0) {
OAtoken = "";
OAtokenSecret = "";
final SharedPreferences.Editor prefs = getSharedPreferences(cgSettings.preferences, 0).edit();
prefs.putString("tokenpublic", null);
prefs.putString("tokensecret", null);
prefs.putInt("twitter", 0);
prefs.commit();
} else {
final SharedPreferences.Editor prefs = getSharedPreferences(cgSettings.preferences, 0).edit();
prefs.remove("temp-token-public");
prefs.remove("temp-token-secret");
prefs.putString("tokenpublic", OAtoken);
prefs.putString("tokensecret", OAtokenSecret);
prefs.putInt("twitter", 1);
prefs.commit();
status = 1;
}
} catch (Exception e) {
Log.e(cgSettings.tag, "cgeoauth.changeToken: " + e.toString());
}
changeTokensHandler.sendEmptyMessage(status);
}
private class startListener implements View.OnClickListener {
public void onClick(View arg0) {
if (requestTokenDialog == null) {
requestTokenDialog = new ProgressDialog(activity);
requestTokenDialog.setCancelable(false);
requestTokenDialog.setMessage(res.getString(R.string.auth_dialog_wait));
}
requestTokenDialog.show();
startButton.setEnabled(false);
startButton.setOnTouchListener(null);
startButton.setOnClickListener(null);
final SharedPreferences.Editor prefs = getSharedPreferences(cgSettings.preferences, 0).edit();
prefs.putString("temp-token-public", null);
prefs.putString("temp-token-secret", null);
prefs.commit();
(new Thread() {
@Override
public void run() {
requestToken();
}
}).start();
}
}
private class confirmPINListener implements View.OnClickListener {
public void onClick(View arg0) {
if (((EditText) findViewById(R.id.pin)).getText().toString().length() == 0) {
warning.helpDialog(res.getString(R.string.auth_dialog_pin_title), res.getString(R.string.auth_dialog_pin_message));
return;
}
if (changeTokensDialog == null) {
changeTokensDialog = new ProgressDialog(activity);
changeTokensDialog.setCancelable(false);
changeTokensDialog.setMessage(res.getString(R.string.auth_dialog_wait));
}
changeTokensDialog.show();
pinEntryButton.setEnabled(false);
pinEntryButton.setOnTouchListener(null);
pinEntryButton.setOnClickListener(null);
(new Thread() {
@Override
public void run() {
changeToken();
}
}).start();
}
}
public void goHome(View view) {
base.goHome(activity);
}
}