diff options
Diffstat (limited to 'main/src')
3 files changed, 92 insertions, 27 deletions
diff --git a/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java b/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java index c082bac..19f4447 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java @@ -2,9 +2,13 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; +import cgeo.geocaching.connector.oc.OkapiError.OkapiErrors; import cgeo.geocaching.network.OAuthAuthorizationActivity; import cgeo.geocaching.settings.Settings; +import ch.boye.httpclientandroidlib.HttpResponse; + +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.eclipse.jdt.annotation.Nullable; @@ -52,4 +56,16 @@ public abstract class OCAuthorizationActivity extends OAuthAuthorizationActivity return res.getString(R.string.auth_dialog_completed_oc, getAuthTitle()); } + /** + * Return an extended error in case of an invalid time stamp + */ + @Override + protected String getExtendedErrorMsg(HttpResponse response) { + OkapiError error = OkapiClient.decodeErrorResponse(response); + if (error.getResult() == OkapiErrors.INVALID_TIMESTAMP) { + return res.getString(R.string.init_login_popup_invalid_timestamp); + } + return StringUtils.EMPTY; + } + } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index f4bac08..fbcda18 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -822,6 +822,21 @@ final class OkapiClient { } /** + * Retrieves error information from an unsuccessful Okapi-response + * + * @param response + * response containing an error object + * @return OkapiError object with detailed information + */ + public static OkapiError decodeErrorResponse(HttpResponse response) { + final JSONResult result = new JSONResult(response); + if (!result.isSuccess) { + return new OkapiError(result.data); + } + return new OkapiError(new JSONObject()); + } + + /** * Encapsulates response state and content of an HTTP-request that expects a JSON result. <code>isSuccess</code> is * only true, if the response state was success and <code>data</code> is not null. */ diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java index fd6ccc6..c86c3eb 100644 --- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java @@ -7,9 +7,11 @@ import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; +import ch.boye.httpclientandroidlib.HttpResponse; import ch.boye.httpclientandroidlib.ParseException; import ch.boye.httpclientandroidlib.client.entity.UrlEncodedFormEntity; import ch.boye.httpclientandroidlib.util.EntityUtils; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.eclipse.jdt.annotation.NonNull; @@ -33,6 +35,10 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { public static final int NOT_AUTHENTICATED = 0; public static final int AUTHENTICATED = 1; + private static final int STATUS_ERROR = 0; + private static final int STATUS_SUCCESS = 1; + private static final int STATUS_ERROR_EXT_MSG = 2; + @NonNull final private String host; @NonNull final private String pathRequest; @NonNull final private String pathAuthorize; @@ -61,8 +67,12 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { startButton.setOnClickListener(new StartListener()); startButton.setEnabled(true); - if (msg.what == 1) { + if (msg.what == STATUS_SUCCESS) { startButton.setText(getAuthAgain()); + } else if (msg.what == STATUS_ERROR_EXT_MSG) { + String errMsg = getErrAuthInitialize(); + errMsg += msg.obj != null ? "\n" + msg.obj.toString() : ""; + showToast(errMsg); } else { showToast(getErrAuthInitialize()); startButton.setText(getAuthStart()); @@ -160,37 +170,49 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { params.put("oauth_callback", 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)); + final HttpResponse response = Network.getRequest(getUrlPrefix() + host + pathRequest, params); - int status = 0; - if (StringUtils.isNotBlank(line)) { - assert line != null; - final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); - if (paramsMatcher1.find()) { - OAtoken = paramsMatcher1.group(1); - } - final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); - if (paramsMatcher2.find()) { - OAtokenSecret = paramsMatcher2.group(1); - } + if (Network.isSuccess(response)) { + final String line = Network.getResponseData(Network.getRequest(getUrlPrefix() + host + pathRequest, params)); - if (StringUtils.isNotBlank(OAtoken) && StringUtils.isNotBlank(OAtokenSecret)) { - setTempTokens(OAtoken, OAtokenSecret); - try { - final Parameters paramsBrowser = new Parameters(); - paramsBrowser.put("oauth_token", OAtoken); - final String encodedParams = EntityUtils.toString(new UrlEncodedFormEntity(paramsBrowser)); - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getUrlPrefix() + host + pathAuthorize + "?" + encodedParams))); - status = 1; - } catch (ParseException e) { - Log.e("OAuthAuthorizationActivity.requestToken", e); - } catch (IOException e) { - Log.e("OAuthAuthorizationActivity.requestToken", e); + int status = STATUS_ERROR; + if (StringUtils.isNotBlank(line)) { + assert line != null; + final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); + if (paramsMatcher1.find()) { + OAtoken = paramsMatcher1.group(1); + } + final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); + if (paramsMatcher2.find()) { + OAtokenSecret = paramsMatcher2.group(1); + } + + if (StringUtils.isNotBlank(OAtoken) && StringUtils.isNotBlank(OAtokenSecret)) { + setTempTokens(OAtoken, OAtokenSecret); + try { + final Parameters paramsBrowser = new Parameters(); + paramsBrowser.put("oauth_token", OAtoken); + final String encodedParams = EntityUtils.toString(new UrlEncodedFormEntity(paramsBrowser)); + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getUrlPrefix() + host + pathAuthorize + "?" + encodedParams))); + status = STATUS_SUCCESS; + } catch (ParseException e) { + Log.e("OAuthAuthorizationActivity.requestToken", e); + } catch (IOException e) { + Log.e("OAuthAuthorizationActivity.requestToken", e); + } } } - } - requestTokenHandler.sendEmptyMessage(status); + requestTokenHandler.sendEmptyMessage(status); + } else { + final String extErrMsg = getExtendedErrorMsg(response); + if (StringUtils.isNotBlank(extErrMsg)) { + final Message msg = requestTokenHandler.obtainMessage(STATUS_ERROR_EXT_MSG, extErrMsg); + requestTokenHandler.sendMessage(msg); + } else { + requestTokenHandler.sendEmptyMessage(STATUS_ERROR); + } + } } private void changeToken(final String verifier) { @@ -305,6 +327,18 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { return res.getString(R.string.err_auth_process); } + /** + * Allows deriving classes to check the response for error messages specific to their OAuth implementation + * + * @param response + * The error response of the token request + * @return String with a more detailed error message (user-facing, localized), can be empty + */ + @SuppressWarnings("static-method") + protected String getExtendedErrorMsg(HttpResponse response) { + return StringUtils.EMPTY; + } + protected String getAuthDialogWait() { return res.getString(R.string.auth_dialog_waiting, getAuthTitle()); } |
