diff options
Diffstat (limited to 'src/cgeo/geocaching/cgeoauth.java')
| -rw-r--r-- | src/cgeo/geocaching/cgeoauth.java | 413 |
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); + } +} |
