diff options
author | Samuel Tardieu <sam@rfc1149.net> | 2013-09-13 17:44:13 +0200 |
---|---|---|
committer | Samuel Tardieu <sam@rfc1149.net> | 2013-09-13 19:29:39 +0200 |
commit | 19dbcd81c8bacc6c07238006d3a1a165a3a86250 (patch) | |
tree | 8d664c189724a0e2d6577eb74967f8656ceb42d0 | |
parent | 6f159746cbffff44108a015fad80b78ddf2b5aad (diff) | |
download | cgeo-19dbcd81c8bacc6c07238006d3a1a165a3a86250.zip cgeo-19dbcd81c8bacc6c07238006d3a1a165a3a86250.tar.gz cgeo-19dbcd81c8bacc6c07238006d3a1a165a3a86250.tar.bz2 |
Allow an OAuth process to specify a callback URI
3 files changed, 73 insertions, 37 deletions
diff --git a/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java b/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java index ec6bbf4..4524e91 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java @@ -18,7 +18,8 @@ public class OCAuthorizationActivity extends OAuthAuthorizationActivity { "/okapi/services/oauth/access_token", false, CgeoApplication.getInstance().getResources().getString(authParams.getCKResId()), - CgeoApplication.getInstance().getResources().getString(authParams.getCSResId())); + CgeoApplication.getInstance().getResources().getString(authParams.getCSResId()), + null); this.authParams = authParams; } diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java index 79bda16..b5b35d6 100644 --- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java @@ -30,6 +30,9 @@ import java.util.regex.Pattern; public abstract class OAuthAuthorizationActivity extends AbstractActivity { + public static final int NOT_AUTHENTICATED = 0; + public static final int AUTHENTICATED = 1; + private String host; private String pathRequest; private String pathAuthorize; @@ -37,6 +40,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { private boolean https; private String consumerKey; private String consumerSecret; + @Nullable private String callback; private String OAtoken = null; private String OAtokenSecret = null; private final Pattern paramsPattern1 = Pattern.compile("oauth_token=([a-zA-Z0-9\\-\\_.]+)"); @@ -62,9 +66,11 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { if (msg.what == 1) { startButton.setText(getAuthAgain()); - pinEntry.setVisibility(View.VISIBLE); - pinEntryButton.setVisibility(View.VISIBLE); - pinEntryButton.setOnClickListener(new ConfirmPINListener()); + if (isOOB()) { + pinEntry.setVisibility(View.VISIBLE); + pinEntryButton.setVisibility(View.VISIBLE); + pinEntryButton.setOnClickListener(new ConfirmPINListener()); + } } else { showToast(getErrAuthInitialize()); startButton.setText(getAuthStart()); @@ -83,7 +89,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { pinEntryButton.setOnClickListener(new ConfirmPINListener()); pinEntryButton.setEnabled(true); - if (msg.what == 1) { + if (msg.what == AUTHENTICATED) { showToast(getAuthDialogCompleted()); pinEntryButton.setVisibility(View.GONE); @@ -106,7 +112,8 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { String pathAccess, boolean https, String consumerKey, - String consumerSecret) { + String consumerSecret, + @Nullable String callback) { this.host = host; this.pathRequest = pathRequest; this.pathAuthorize = pathAuthorize; @@ -114,6 +121,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { this.https = https; this.consumerKey = consumerKey; this.consumerSecret = consumerSecret; + this.callback = callback; } @Override @@ -122,10 +130,6 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { setTitle(getAuthTitle()); - init(); - } - - private void init() { auth_1.setText(getAboutAuth1()); auth_2.setText(getAboutAuth2()); @@ -145,18 +149,43 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { } else { // already have temporary tokens, continue from pin startButton.setText(getAuthAgain()); + if (isOOB()) { + pinEntry.setHint(getAuthPinHint()); + pinEntry.setVisibility(View.VISIBLE); + pinEntryButton.setVisibility(View.VISIBLE); + pinEntryButton.setOnClickListener(new ConfirmPINListener()); + } + } + } - pinEntry.setHint(getAuthPinHint()); - pinEntry.setVisibility(View.VISIBLE); - pinEntryButton.setVisibility(View.VISIBLE); - pinEntryButton.setOnClickListener(new ConfirmPINListener()); + @Override + public void onNewIntent(final Intent intent) { + setIntent(intent); + } + + @Override + public void onResume() { + super.onResume(); + final Uri uri = getIntent().getData(); + if (uri != null) { + final String verifier = uri.getQueryParameter("oauth_verifier"); + if (StringUtils.isNotBlank(verifier)) { + exchangeTokens(verifier); + } else { + // We can shortcut the whole verification process if we do not have a token at all. + changeTokensHandler.sendEmptyMessage(NOT_AUTHENTICATED); + } } } + private boolean isOOB() { + return callback == null; + } + private void requestToken() { final Parameters params = new Parameters(); - params.put("oauth_callback", "oob"); + params.put("oauth_callback", isOOB() ? "oob" : callback); final String method = "GET"; OAuth.signOAuth(host, pathRequest, method, https, params, null, null, consumerKey, consumerSecret); final String line = Network.getResponseData(Network.getRequest(getUrlPrefix() + host + pathRequest, params)); @@ -192,12 +221,12 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { requestTokenHandler.sendEmptyMessage(status); } - private void changeToken() { + private void changeToken(final String verifier) { - int status = 0; + int status = NOT_AUTHENTICATED; try { - final Parameters params = new Parameters("oauth_verifier", pinEntry.getText().toString()); + final Parameters params = new Parameters("oauth_verifier", verifier); final String method = "POST"; OAuth.signOAuth(host, pathAccess, method, https, params, OAtoken, OAtokenSecret, consumerKey, consumerSecret); @@ -221,7 +250,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { setTokens(null, null, false); } else { setTokens(OAtoken, OAtokenSecret, true); - status = 1; + status = AUTHENTICATED; } } catch (Exception e) { Log.e("OAuthAuthorizationActivity.changeToken", e); @@ -263,29 +292,34 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { @Override public void onClick(View arg0) { - if (StringUtils.isEmpty(pinEntry.getText().toString())) { + final String verifier = pinEntry.getText().toString(); + if (StringUtils.isEmpty(verifier)) { helpDialog(getAuthDialogPinTitle(), getAuthDialogPinMessage()); return; } - if (changeTokensDialog == null) { - changeTokensDialog = new ProgressDialog(OAuthAuthorizationActivity.this); - changeTokensDialog.setCancelable(false); - changeTokensDialog.setMessage(getAuthDialogWait()); - } - changeTokensDialog.show(); - pinEntryButton.setEnabled(false); - pinEntryButton.setOnTouchListener(null); - pinEntryButton.setOnClickListener(null); - - (new Thread() { + exchangeTokens(verifier); + } + } - @Override - public void run() { - changeToken(); - } - }).start(); + private void exchangeTokens(final String verifier) { + if (changeTokensDialog == null) { + changeTokensDialog = new ProgressDialog(this); + changeTokensDialog.setCancelable(false); + changeTokensDialog.setMessage(getAuthDialogWait()); } + changeTokensDialog.show(); + pinEntryButton.setEnabled(false); + pinEntryButton.setOnTouchListener(null); + pinEntryButton.setOnClickListener(null); + + (new Thread() { + + @Override + public void run() { + changeToken(verifier); + } + }).start(); } protected abstract ImmutablePair<String, String> getTempTokens(); diff --git a/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java b/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java index 4d9a1f2..49588e7 100644 --- a/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java @@ -15,7 +15,8 @@ public class TwitterAuthorizationActivity extends OAuthAuthorizationActivity { "/oauth/access_token", true, Settings.getKeyConsumerPublic(), - Settings.getKeyConsumerSecret()); + Settings.getKeyConsumerSecret(), + null); } @Override |