package org.wordpress.android.ui.accounts.helpers; import android.annotation.SuppressLint; import com.android.volley.Request; import com.android.volley.VolleyError; import com.wordpress.rest.Oauth; import com.wordpress.rest.Oauth.ErrorListener; import com.wordpress.rest.Oauth.Listener; import org.json.JSONException; import org.json.JSONObject; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.Account; import org.wordpress.android.models.Blog; import org.wordpress.android.models.AccountHelper; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; import org.wordpress.android.util.VolleyUtils; public class LoginWPCom extends LoginAbstract { private String mTwoStepCode; private boolean mShouldSendTwoStepSMS; private Blog mJetpackBlog; public LoginWPCom(String username, String password, String twoStepCode, boolean shouldSendTwoStepSMS, Blog blog) { super(username, password); mTwoStepCode = twoStepCode; mShouldSendTwoStepSMS = shouldSendTwoStepSMS; mJetpackBlog = blog; } public static int restLoginErrorToMsgId(JSONObject errorObject) { // Default to generic error message int errorMsgId = org.wordpress.android.R.string.nux_cannot_log_in; // Map REST errors to local error codes if (errorObject != null) { try { String error = errorObject.optString("error", ""); String errorDescription = errorObject.getString("error_description"); if (error.equals("invalid_request")) { if (errorDescription.contains("Incorrect username or password.")) { errorMsgId = org.wordpress.android.R.string.username_or_password_incorrect; } } else if (error.equals("needs_2fa")) { errorMsgId = org.wordpress.android.R.string.account_two_step_auth_enabled; } else if (error.equals("invalid_otp")) { errorMsgId = org.wordpress.android.R.string.invalid_verification_code; } } catch (JSONException e) { AppLog.e(T.NUX, e); } } return errorMsgId; } private Request makeOAuthRequest(final String username, final String password, final Listener listener, final ErrorListener errorListener) { Oauth oauth = new Oauth(org.wordpress.android.BuildConfig.OAUTH_APP_ID, org.wordpress.android.BuildConfig.OAUTH_APP_SECRET, org.wordpress.android.BuildConfig.OAUTH_REDIRECT_URI); Request oauthRequest; oauthRequest = oauth.makeRequest(username, password, mTwoStepCode, mShouldSendTwoStepSMS, listener, errorListener); return oauthRequest; } protected void login() { // Get OAuth token for the first time and check for errors WordPress.requestQueue.add(makeOAuthRequest(mUsername, mPassword, new Oauth.Listener() { @SuppressLint("CommitPrefEdits") @Override public void onResponse(final Oauth.Token token) { configureAccountOnSuccess(token); } }, new Oauth.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { JSONObject errorObject = VolleyUtils.volleyErrorToJSON(volleyError); int errorMsgId = restLoginErrorToMsgId(errorObject); mCallback.onError(errorMsgId, errorMsgId == R.string.account_two_step_auth_enabled, false, false); } })); } private void configureAccountOnSuccess(Oauth.Token token) { if (mJetpackBlog != null) { // Store token in blog object for Jetpack sites mJetpackBlog.setApi_key(token.toString()); mJetpackBlog.setDotcom_username(mUsername); WordPress.wpDB.saveBlog(mJetpackBlog); } Account account = AccountHelper.getDefaultAccount(); if (mJetpackBlog == null) { // Store token in global account account.setAccessToken(token.toString()); account.setUserName(mUsername); account.save(); account.fetchAccountDetails(); } mCallback.onSuccess(); } }