aboutsummaryrefslogtreecommitdiffstats
path: root/src/cgeo/geocaching/cgeoauth.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cgeo/geocaching/cgeoauth.java')
-rw-r--r--src/cgeo/geocaching/cgeoauth.java413
1 files changed, 413 insertions, 0 deletions
diff --git a/src/cgeo/geocaching/cgeoauth.java b/src/cgeo/geocaching/cgeoauth.java
new file mode 100644
index 0000000..84514ba
--- /dev/null
+++ b/src/cgeo/geocaching/cgeoauth.java
@@ -0,0 +1,413 @@
+package cgeo.geocaching;
+
+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);
+ }
+}