Skip to content

Commit c9d204d

Browse files
committed
Merge pull request #1277 from wordpress-mobile/issue/1146-change-login-hint-after-N-retries
fix #1146 change login hint after n retries
2 parents c0f0d61 + f6723d2 commit c9d204d

File tree

5 files changed

+123
-82
lines changed

5 files changed

+123
-82
lines changed

res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@
690690
<string name="username_invalid">Invalid username</string>
691691
<string name="limit_reached">Limit reached. You can try again in 1 minute. Trying again before that will only increase the time you have to wait before the ban is lifted. If you think this is in error, contact support.</string>
692692
<string name="username_or_password_incorrect">The username or password you entered is incorrect</string>
693+
<string name="username_or_password_incorrect_selfhosted_hint">The username or password you entered is incorrect. Have a self-hosted site? Tap \"%s\" and add the URL.</string>
693694
<string name="nux_tap_continue">Continue</string>
694695
<string name="nux_cannot_log_in">We can\'t log you in</string>
695696
<string name="nux_tutorial_get_started_title">Get started!</string>

src/org/wordpress/android/ui/accounts/SetupBlog.java

Lines changed: 69 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333

3434
public class SetupBlog {
3535
private static final String DEFAULT_IMAGE_SIZE = "2000";
36-
3736
private String mUsername;
3837
private String mPassword;
3938
private String mHttpUsername = "";
@@ -46,7 +45,6 @@ public class SetupBlog {
4645

4746
private boolean mHttpAuthRequired;
4847
private boolean mErroneousSslCertificate;
49-
private boolean mCurrentSslCertificatesForcedTrusted;
5048

5149
public SetupBlog() {
5250
}
@@ -59,12 +57,12 @@ public String getXmlrpcUrl() {
5957
return mXmlrpcUrl;
6058
}
6159

62-
public void setUsername(String mUsername) {
63-
this.mUsername = mUsername;
60+
public void setUsername(String username) {
61+
mUsername = username;
6462
}
6563

66-
public void setPassword(String mPassword) {
67-
this.mPassword = mPassword;
64+
public void setPassword(String password) {
65+
mPassword = password;
6866
}
6967

7068
public String getPassword() {
@@ -75,20 +73,20 @@ public String getUsername() {
7573
return mUsername;
7674
}
7775

78-
public void setHttpUsername(String mHttpUsername) {
79-
this.mHttpUsername = mHttpUsername;
76+
public void setHttpUsername(String httpUsername) {
77+
mHttpUsername = httpUsername;
8078
}
8179

82-
public void setHttpPassword(String mHttpPassword) {
83-
this.mHttpPassword = mHttpPassword;
80+
public void setHttpPassword(String httpPassword) {
81+
mHttpPassword = httpPassword;
8482
}
8583

86-
public void setSelfHostedURL(String mSelfHostedURL) {
87-
this.mSelfHostedURL = mSelfHostedURL;
84+
public void setSelfHostedURL(String selfHostedURL) {
85+
mSelfHostedURL = selfHostedURL;
8886
}
8987

90-
public void setHttpAuthRequired(boolean mHttpAuthRequired) {
91-
this.mHttpAuthRequired = mHttpAuthRequired;
88+
public void setHttpAuthRequired(boolean httpAuthRequired) {
89+
mHttpAuthRequired = httpAuthRequired;
9290
}
9391

9492
public boolean isHttpAuthRequired() {
@@ -99,36 +97,32 @@ public boolean isErroneousSslCertificates() {
9997
return mErroneousSslCertificate;
10098
}
10199

102-
public List<Map<String, Object>> getBlogList() {
103-
if (mSelfHostedURL != null && mSelfHostedURL.length() != 0) {
104-
mXmlrpcUrl = getSelfHostedXmlrpcUrl(mSelfHostedURL);
105-
} else {
106-
mXmlrpcUrl = Constants.wpcomXMLRPCURL;
107-
}
108-
109-
if (mXmlrpcUrl == null) {
110-
if (!mHttpAuthRequired && mErrorMsgId == 0) {
100+
private void handleXmlRpcFault(XMLRPCFault xmlRpcFault) {
101+
AppLog.e(T.NUX, "XMLRPCFault received from XMLRPC call wp.getUsersBlogs", xmlRpcFault);
102+
switch (xmlRpcFault.getFaultCode()) {
103+
case 403:
104+
mErrorMsgId = R.string.username_or_password_incorrect;
105+
break;
106+
case 404:
107+
mErrorMsgId = R.string.xmlrpc_error;
108+
break;
109+
case 425:
110+
mErrorMsgId = R.string.account_two_step_auth_enabled;
111+
break;
112+
default:
111113
mErrorMsgId = R.string.no_site_error;
112-
}
113-
return null;
114-
}
115-
116-
// Validate the URL found before calling the client. Prevent a crash that can occur
117-
// during the setup of self-hosted sites.
118-
URI uri;
119-
try {
120-
uri = URI.create(mXmlrpcUrl);
121-
} catch (Exception e1) {
122-
mErrorMsgId = R.string.no_site_error;
123-
return null;
114+
break;
124115
}
116+
}
125117

118+
private List<Map<String, Object>> getUsersBlogsRequest(URI uri) {
126119
XMLRPCClientInterface client = XMLRPCFactory.instantiate(uri, mHttpUsername, mHttpPassword);
127120
Object[] params = {mUsername, mPassword};
128121
try {
129122
Object[] userBlogs = (Object[]) client.call("wp.getUsersBlogs", params);
130-
if (userBlogs == null) { // Could happen if the returned server response is truncated
131-
mErrorMsgId = R.string.xmlrpc_error;;
123+
if (userBlogs == null) {
124+
// Could happen if the returned server response is truncated
125+
mErrorMsgId = R.string.xmlrpc_error;
132126
return null;
133127
}
134128
Arrays.sort(userBlogs, Utils.BlogNameComparator);
@@ -141,29 +135,12 @@ public List<Map<String, Object>> getBlogList() {
141135
}
142136
}
143137
return userBlogList;
144-
}
145-
catch (XmlPullParserException parserException) {
138+
} catch (XmlPullParserException parserException) {
146139
mErrorMsgId = R.string.xmlrpc_error;
147140
AppLog.e(T.NUX, "invalid data received from XMLRPC call wp.getUsersBlogs", parserException);
148-
}
149-
catch (XMLRPCFault xmlRpcFault) {
150-
AppLog.e(T.NUX, "XMLRPCFault received from XMLRPC call wp.getUsersBlogs", xmlRpcFault);
151-
switch (xmlRpcFault.getFaultCode()) {
152-
case 403:
153-
mErrorMsgId = R.string.username_or_password_incorrect;
154-
break;
155-
case 404:
156-
mErrorMsgId = R.string.xmlrpc_error;
157-
break;
158-
case 425:
159-
mErrorMsgId = R.string.account_two_step_auth_enabled;
160-
break;
161-
default:
162-
mErrorMsgId = R.string.no_site_error;
163-
break;
164-
}
165-
}
166-
catch (XMLRPCException xmlRpcException) {
141+
} catch (XMLRPCFault xmlRpcFault) {
142+
handleXmlRpcFault(xmlRpcFault);
143+
} catch (XMLRPCException xmlRpcException) {
167144
AppLog.e(T.NUX, "XMLRPCException received from XMLRPC call wp.getUsersBlogs", xmlRpcException);
168145
mErrorMsgId = R.string.no_site_error;
169146
} catch (SSLHandshakeException e) {
@@ -178,6 +155,32 @@ public List<Map<String, Object>> getBlogList() {
178155
return null;
179156
}
180157

158+
public List<Map<String, Object>> getBlogList() {
159+
if (mSelfHostedURL != null && mSelfHostedURL.length() != 0) {
160+
mXmlrpcUrl = getSelfHostedXmlrpcUrl(mSelfHostedURL);
161+
} else {
162+
mXmlrpcUrl = Constants.wpcomXMLRPCURL;
163+
}
164+
165+
if (mXmlrpcUrl == null) {
166+
if (!mHttpAuthRequired && mErrorMsgId == 0) {
167+
mErrorMsgId = R.string.no_site_error;
168+
}
169+
return null;
170+
}
171+
172+
// Validate the URL found before calling the client. Prevent a crash that can occur
173+
// during the setup of self-hosted sites.
174+
URI uri;
175+
try {
176+
uri = URI.create(mXmlrpcUrl);
177+
return getUsersBlogsRequest(uri);
178+
} catch (Exception e) {
179+
mErrorMsgId = R.string.no_site_error;
180+
return null;
181+
}
182+
}
183+
181184
private String getRsdUrl(String baseUrl) throws SSLHandshakeException {
182185
String rsdUrl;
183186
rsdUrl = ApiHelper.getRSDMetaTagHrefRegEx(baseUrl);
@@ -257,13 +260,13 @@ private String getmXmlrpcByUserEnteredPath(String baseUrl) {
257260
// 2: Take whatever URL the user entered to see if that returns a correct response
258261
// 3: Finally, just guess as to what the xmlrpc url should be
259262
private String getSelfHostedXmlrpcUrl(String url) {
260-
String xmlrpcUrl = null;
263+
String xmlrpcUrl;
261264

262265
// Convert IDN names to punycode if necessary
263266
url = UrlUtils.convertUrlToPunycodeIfNeeded(url);
264267

265268
// Add http to the beginning of the URL if needed
266-
url = UrlUtils.addHttpProcolIfNeeded(url, mCurrentSslCertificatesForcedTrusted);
269+
url = UrlUtils.addUrlSchemeIfNeeded(url, false);
267270

268271
if (!URLUtil.isValidUrl(url)) {
269272
mErrorMsgId = R.string.invalid_url_message;
@@ -311,13 +314,16 @@ public Blog addBlog(String blogName, String xmlRpcUrl, String homeUrl, String bl
311314
blog.setHttpuser(mHttpUsername);
312315
blog.setHttppassword(mHttpPassword);
313316
blog.setBlogName(blogName);
314-
blog.setImagePlacement(""); //deprecated
317+
// deprecated
318+
blog.setImagePlacement("");
315319
blog.setFullSizeImage(false);
316320
blog.setMaxImageWidth(DEFAULT_IMAGE_SIZE);
317-
blog.setMaxImageWidthId(0); //deprecated
321+
// deprecated
322+
blog.setMaxImageWidthId(0);
318323
blog.setRemoteBlogId(Integer.parseInt(blogId));
319324
blog.setDotcomFlag(xmlRpcUrl.contains("wordpress.com"));
320-
blog.setWpVersion(""); // assigned later in getOptions call
325+
// assigned later in getOptions call
326+
blog.setWpVersion("");
321327
blog.setAdmin(isAdmin);
322328
WordPress.wpDB.saveBlog(blog);
323329
} else {

src/org/wordpress/android/ui/accounts/WelcomeFragmentSignIn.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
public class WelcomeFragmentSignIn extends NewAccountAbstractPageFragment implements TextWatcher {
5252
private static final String DOT_COM_BASE_URL = "https://wordpress.com";
5353
private static final String FORGOT_PASSWORD_RELATIVE_URL = "/wp-login.php?action=lostpassword";
54+
private static final int WPCOM_ERRONEOUS_LOGIN_THRESHOLD = 3;
5455
private EditText mUsernameEditText;
5556
private EditText mPasswordEditText;
5657
private EditText mUrlEditText;
@@ -67,6 +68,7 @@ public class WelcomeFragmentSignIn extends NewAccountAbstractPageFragment implem
6768
private ImageView mInfoButtonSecondary;
6869
private EmailChecker mEmailChecker;
6970
private boolean mEmailAutoCorrected;
71+
private int mWPComErroneousLogInCount;
7072

7173
public WelcomeFragmentSignIn() {
7274
mEmailChecker = new EmailChecker();
@@ -190,6 +192,10 @@ private void autocorrectUsername() {
190192
}
191193
}
192194

195+
private boolean isWPComLogin() {
196+
return !mSelfHosted || TextUtils.isEmpty(EditTextUtils.getText(mUrlEditText).trim());
197+
}
198+
193199
private View.OnClickListener mCreateAccountListener = new View.OnClickListener() {
194200
@Override
195201
public void onClick(View v) {
@@ -202,7 +208,7 @@ public void onClick(View v) {
202208
@Override
203209
public void onClick(View v) {
204210
String baseUrl = DOT_COM_BASE_URL;
205-
if (mSelfHosted && !TextUtils.isEmpty(EditTextUtils.getText(mUrlEditText).trim())) {
211+
if (!isWPComLogin()) {
206212
baseUrl = EditTextUtils.getText(mUrlEditText).trim();
207213
String lowerCaseBaseUrl = baseUrl.toLowerCase(Locale.getDefault());
208214
if (!lowerCaseBaseUrl.startsWith("https://") && !lowerCaseBaseUrl.startsWith("http://")) {
@@ -304,6 +310,16 @@ private void showUsernameError(int messageId) {
304310
mUsernameEditText.requestFocus();
305311
}
306312

313+
private void showPasswordError(int messageId, String param) {
314+
mPasswordEditText.setError(getString(messageId, param));
315+
mPasswordEditText.requestFocus();
316+
}
317+
318+
private void showUsernameError(int messageId, String param) {
319+
mUsernameEditText.setError(getString(messageId, param));
320+
mUsernameEditText.requestFocus();
321+
}
322+
307323
private void showUrlError(int messageId) {
308324
mUrlEditText.setError(getString(messageId));
309325
mUrlEditText.requestFocus();
@@ -470,6 +486,24 @@ public void onClick(DialogInterface dialog, int whichButton) {
470486
endProgress();
471487
}
472488

489+
private void handleInvalidUsernameOrPassword() {
490+
if (isWPComLogin()) {
491+
mWPComErroneousLogInCount += 1;
492+
if (mWPComErroneousLogInCount >= WPCOM_ERRONEOUS_LOGIN_THRESHOLD) {
493+
mErrorMsgId = R.string.username_or_password_incorrect_selfhosted_hint;
494+
}
495+
}
496+
if (mErrorMsgId == R.string.username_or_password_incorrect_selfhosted_hint) {
497+
showUsernameError(mErrorMsgId, getString(R.string.nux_add_selfhosted_blog));
498+
showPasswordError(mErrorMsgId, getString(R.string.nux_add_selfhosted_blog));
499+
} else {
500+
showUsernameError(mErrorMsgId);
501+
showPasswordError(mErrorMsgId);
502+
}
503+
mErrorMsgId = 0;
504+
endProgress();
505+
}
506+
473507
private void signInError() {
474508
FragmentTransaction ft = getFragmentManager().beginTransaction();
475509
NUXDialogFragment nuxAlert;
@@ -480,10 +514,7 @@ private void signInError() {
480514
"https://wordpress.com/settings/security/?ssl=forced");
481515
} else {
482516
if (mErrorMsgId == R.string.username_or_password_incorrect) {
483-
showUsernameError(mErrorMsgId);
484-
showPasswordError(mErrorMsgId);
485-
mErrorMsgId = 0;
486-
endProgress();
517+
handleInvalidUsernameOrPassword();
487518
return;
488519
} else if (mErrorMsgId == R.string.invalid_url_message) {
489520
showUrlError(mErrorMsgId);

src/org/wordpress/android/util/UrlUtils.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static String getDomainFromUrl(final String urlString) {
3636
Uri uri = Uri.parse(urlString);
3737
return uri.getHost();
3838
}
39-
39+
4040
// Convert IDN names to punycode if necessary
4141
public static String convertUrlToPunycodeIfNeeded(String url) {
4242
if (!Charset.forName("US-ASCII").newEncoder().canEncode(url)) {
@@ -50,15 +50,15 @@ public static String convertUrlToPunycodeIfNeeded(String url) {
5050
}
5151
return url;
5252
}
53-
54-
public static String addHttpProcolIfNeeded(String url, boolean isHTTPS) {
53+
54+
public static String addUrlSchemeIfNeeded(String url, boolean isHTTPS) {
5555
if (url == null) {
5656
return null;
5757
}
5858

5959
if (!URLUtil.isValidUrl(url)) {
6060
if (!(url.toLowerCase().startsWith("http://")) && !(url.toLowerCase().startsWith("https://"))) {
61-
url = ( isHTTPS ? "https" : "http" ) + "://" + url;
61+
url = (isHTTPS ? "https" : "http") + "://" + url;
6262
}
6363
}
6464

0 commit comments

Comments
 (0)