Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,7 @@
<string name="username_invalid">Invalid username</string>
<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>
<string name="username_or_password_incorrect">The username or password you entered is incorrect</string>
<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>
<string name="nux_tap_continue">Continue</string>
<string name="nux_cannot_log_in">We can\'t log you in</string>
<string name="nux_tutorial_get_started_title">Get started!</string>
Expand Down
132 changes: 69 additions & 63 deletions src/org/wordpress/android/ui/accounts/SetupBlog.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@

public class SetupBlog {
private static final String DEFAULT_IMAGE_SIZE = "2000";

private String mUsername;
private String mPassword;
private String mHttpUsername = "";
Expand All @@ -46,7 +45,6 @@ public class SetupBlog {

private boolean mHttpAuthRequired;
private boolean mErroneousSslCertificate;
private boolean mCurrentSslCertificatesForcedTrusted;

public SetupBlog() {
}
Expand All @@ -59,12 +57,12 @@ public String getXmlrpcUrl() {
return mXmlrpcUrl;
}

public void setUsername(String mUsername) {
this.mUsername = mUsername;
public void setUsername(String username) {
mUsername = username;
}

public void setPassword(String mPassword) {
this.mPassword = mPassword;
public void setPassword(String password) {
mPassword = password;
}

public String getPassword() {
Expand All @@ -75,20 +73,20 @@ public String getUsername() {
return mUsername;
}

public void setHttpUsername(String mHttpUsername) {
this.mHttpUsername = mHttpUsername;
public void setHttpUsername(String httpUsername) {
mHttpUsername = httpUsername;
}

public void setHttpPassword(String mHttpPassword) {
this.mHttpPassword = mHttpPassword;
public void setHttpPassword(String httpPassword) {
mHttpPassword = httpPassword;
}

public void setSelfHostedURL(String mSelfHostedURL) {
this.mSelfHostedURL = mSelfHostedURL;
public void setSelfHostedURL(String selfHostedURL) {
mSelfHostedURL = selfHostedURL;
}

public void setHttpAuthRequired(boolean mHttpAuthRequired) {
this.mHttpAuthRequired = mHttpAuthRequired;
public void setHttpAuthRequired(boolean httpAuthRequired) {
mHttpAuthRequired = httpAuthRequired;
}

public boolean isHttpAuthRequired() {
Expand All @@ -99,36 +97,32 @@ public boolean isErroneousSslCertificates() {
return mErroneousSslCertificate;
}

public List<Map<String, Object>> getBlogList() {
if (mSelfHostedURL != null && mSelfHostedURL.length() != 0) {
mXmlrpcUrl = getSelfHostedXmlrpcUrl(mSelfHostedURL);
} else {
mXmlrpcUrl = Constants.wpcomXMLRPCURL;
}

if (mXmlrpcUrl == null) {
if (!mHttpAuthRequired && mErrorMsgId == 0) {
private void handleXmlRpcFault(XMLRPCFault xmlRpcFault) {
AppLog.e(T.NUX, "XMLRPCFault received from XMLRPC call wp.getUsersBlogs", xmlRpcFault);
switch (xmlRpcFault.getFaultCode()) {
case 403:
mErrorMsgId = R.string.username_or_password_incorrect;
break;
case 404:
mErrorMsgId = R.string.xmlrpc_error;
break;
case 425:
mErrorMsgId = R.string.account_two_step_auth_enabled;
break;
default:
mErrorMsgId = R.string.no_site_error;
}
return null;
}

// Validate the URL found before calling the client. Prevent a crash that can occur
// during the setup of self-hosted sites.
URI uri;
try {
uri = URI.create(mXmlrpcUrl);
} catch (Exception e1) {
mErrorMsgId = R.string.no_site_error;
return null;
break;
}
}

private List<Map<String, Object>> getUsersBlogsRequest(URI uri) {
XMLRPCClientInterface client = XMLRPCFactory.instantiate(uri, mHttpUsername, mHttpPassword);
Object[] params = {mUsername, mPassword};
try {
Object[] userBlogs = (Object[]) client.call("wp.getUsersBlogs", params);
if (userBlogs == null) { // Could happen if the returned server response is truncated
mErrorMsgId = R.string.xmlrpc_error;;
if (userBlogs == null) {
// Could happen if the returned server response is truncated
mErrorMsgId = R.string.xmlrpc_error;
return null;
}
Arrays.sort(userBlogs, Utils.BlogNameComparator);
Expand All @@ -141,29 +135,12 @@ public List<Map<String, Object>> getBlogList() {
}
}
return userBlogList;
}
catch (XmlPullParserException parserException) {
} catch (XmlPullParserException parserException) {
mErrorMsgId = R.string.xmlrpc_error;
AppLog.e(T.NUX, "invalid data received from XMLRPC call wp.getUsersBlogs", parserException);
}
catch (XMLRPCFault xmlRpcFault) {
AppLog.e(T.NUX, "XMLRPCFault received from XMLRPC call wp.getUsersBlogs", xmlRpcFault);
switch (xmlRpcFault.getFaultCode()) {
case 403:
mErrorMsgId = R.string.username_or_password_incorrect;
break;
case 404:
mErrorMsgId = R.string.xmlrpc_error;
break;
case 425:
mErrorMsgId = R.string.account_two_step_auth_enabled;
break;
default:
mErrorMsgId = R.string.no_site_error;
break;
}
}
catch (XMLRPCException xmlRpcException) {
} catch (XMLRPCFault xmlRpcFault) {
handleXmlRpcFault(xmlRpcFault);
} catch (XMLRPCException xmlRpcException) {
AppLog.e(T.NUX, "XMLRPCException received from XMLRPC call wp.getUsersBlogs", xmlRpcException);
mErrorMsgId = R.string.no_site_error;
} catch (SSLHandshakeException e) {
Expand All @@ -178,6 +155,32 @@ public List<Map<String, Object>> getBlogList() {
return null;
}

public List<Map<String, Object>> getBlogList() {
if (mSelfHostedURL != null && mSelfHostedURL.length() != 0) {
mXmlrpcUrl = getSelfHostedXmlrpcUrl(mSelfHostedURL);
} else {
mXmlrpcUrl = Constants.wpcomXMLRPCURL;
}

if (mXmlrpcUrl == null) {
if (!mHttpAuthRequired && mErrorMsgId == 0) {
mErrorMsgId = R.string.no_site_error;
}
return null;
}

// Validate the URL found before calling the client. Prevent a crash that can occur
// during the setup of self-hosted sites.
URI uri;
try {
uri = URI.create(mXmlrpcUrl);
return getUsersBlogsRequest(uri);
} catch (Exception e) {
mErrorMsgId = R.string.no_site_error;
return null;
}
}

private String getRsdUrl(String baseUrl) throws SSLHandshakeException {
String rsdUrl;
rsdUrl = ApiHelper.getRSDMetaTagHrefRegEx(baseUrl);
Expand Down Expand Up @@ -257,13 +260,13 @@ private String getmXmlrpcByUserEnteredPath(String baseUrl) {
// 2: Take whatever URL the user entered to see if that returns a correct response
// 3: Finally, just guess as to what the xmlrpc url should be
private String getSelfHostedXmlrpcUrl(String url) {
String xmlrpcUrl = null;
String xmlrpcUrl;

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

// Add http to the beginning of the URL if needed
url = UrlUtils.addHttpProcolIfNeeded(url, mCurrentSslCertificatesForcedTrusted);
url = UrlUtils.addUrlSchemeIfNeeded(url, false);

if (!URLUtil.isValidUrl(url)) {
mErrorMsgId = R.string.invalid_url_message;
Expand Down Expand Up @@ -311,13 +314,16 @@ public Blog addBlog(String blogName, String xmlRpcUrl, String homeUrl, String bl
blog.setHttpuser(mHttpUsername);
blog.setHttppassword(mHttpPassword);
blog.setBlogName(blogName);
blog.setImagePlacement(""); //deprecated
// deprecated
blog.setImagePlacement("");
blog.setFullSizeImage(false);
blog.setMaxImageWidth(DEFAULT_IMAGE_SIZE);
blog.setMaxImageWidthId(0); //deprecated
// deprecated
blog.setMaxImageWidthId(0);
blog.setRemoteBlogId(Integer.parseInt(blogId));
blog.setDotcomFlag(xmlRpcUrl.contains("wordpress.com"));
blog.setWpVersion(""); // assigned later in getOptions call
// assigned later in getOptions call
blog.setWpVersion("");
blog.setAdmin(isAdmin);
WordPress.wpDB.saveBlog(blog);
} else {
Expand Down
41 changes: 36 additions & 5 deletions src/org/wordpress/android/ui/accounts/WelcomeFragmentSignIn.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
public class WelcomeFragmentSignIn extends NewAccountAbstractPageFragment implements TextWatcher {
private static final String DOT_COM_BASE_URL = "https://wordpress.com";
private static final String FORGOT_PASSWORD_RELATIVE_URL = "/wp-login.php?action=lostpassword";
private static final int WPCOM_ERRONEOUS_LOGIN_THRESHOLD = 3;
private EditText mUsernameEditText;
private EditText mPasswordEditText;
private EditText mUrlEditText;
Expand All @@ -67,6 +68,7 @@ public class WelcomeFragmentSignIn extends NewAccountAbstractPageFragment implem
private ImageView mInfoButtonSecondary;
private EmailChecker mEmailChecker;
private boolean mEmailAutoCorrected;
private int mWPComErroneousLogInCount;

public WelcomeFragmentSignIn() {
mEmailChecker = new EmailChecker();
Expand Down Expand Up @@ -190,6 +192,10 @@ private void autocorrectUsername() {
}
}

private boolean isWPComLogin() {
return !mSelfHosted || TextUtils.isEmpty(EditTextUtils.getText(mUrlEditText).trim());
}

private View.OnClickListener mCreateAccountListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Expand All @@ -202,7 +208,7 @@ public void onClick(View v) {
@Override
public void onClick(View v) {
String baseUrl = DOT_COM_BASE_URL;
if (mSelfHosted && !TextUtils.isEmpty(EditTextUtils.getText(mUrlEditText).trim())) {
if (!isWPComLogin()) {
baseUrl = EditTextUtils.getText(mUrlEditText).trim();
String lowerCaseBaseUrl = baseUrl.toLowerCase(Locale.getDefault());
if (!lowerCaseBaseUrl.startsWith("https://") && !lowerCaseBaseUrl.startsWith("http://")) {
Expand Down Expand Up @@ -304,6 +310,16 @@ private void showUsernameError(int messageId) {
mUsernameEditText.requestFocus();
}

private void showPasswordError(int messageId, String param) {
mPasswordEditText.setError(getString(messageId, param));
mPasswordEditText.requestFocus();
}

private void showUsernameError(int messageId, String param) {
mUsernameEditText.setError(getString(messageId, param));
mUsernameEditText.requestFocus();
}

private void showUrlError(int messageId) {
mUrlEditText.setError(getString(messageId));
mUrlEditText.requestFocus();
Expand Down Expand Up @@ -470,6 +486,24 @@ public void onClick(DialogInterface dialog, int whichButton) {
endProgress();
}

private void handleInvalidUsernameOrPassword() {
if (isWPComLogin()) {
mWPComErroneousLogInCount += 1;
if (mWPComErroneousLogInCount >= WPCOM_ERRONEOUS_LOGIN_THRESHOLD) {
mErrorMsgId = R.string.username_or_password_incorrect_selfhosted_hint;
}
}
if (mErrorMsgId == R.string.username_or_password_incorrect_selfhosted_hint) {
showUsernameError(mErrorMsgId, getString(R.string.nux_add_selfhosted_blog));
showPasswordError(mErrorMsgId, getString(R.string.nux_add_selfhosted_blog));
} else {
showUsernameError(mErrorMsgId);
showPasswordError(mErrorMsgId);
}
mErrorMsgId = 0;
endProgress();
}

private void signInError() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
NUXDialogFragment nuxAlert;
Expand All @@ -480,10 +514,7 @@ private void signInError() {
"https://wordpress.com/settings/security/?ssl=forced");
} else {
if (mErrorMsgId == R.string.username_or_password_incorrect) {
showUsernameError(mErrorMsgId);
showPasswordError(mErrorMsgId);
mErrorMsgId = 0;
endProgress();
handleInvalidUsernameOrPassword();
return;
} else if (mErrorMsgId == R.string.invalid_url_message) {
showUrlError(mErrorMsgId);
Expand Down
8 changes: 4 additions & 4 deletions src/org/wordpress/android/util/UrlUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public static String getDomainFromUrl(final String urlString) {
Uri uri = Uri.parse(urlString);
return uri.getHost();
}

// Convert IDN names to punycode if necessary
public static String convertUrlToPunycodeIfNeeded(String url) {
if (!Charset.forName("US-ASCII").newEncoder().canEncode(url)) {
Expand All @@ -50,15 +50,15 @@ public static String convertUrlToPunycodeIfNeeded(String url) {
}
return url;
}
public static String addHttpProcolIfNeeded(String url, boolean isHTTPS) {

public static String addUrlSchemeIfNeeded(String url, boolean isHTTPS) {
if (url == null) {
return null;
}

if (!URLUtil.isValidUrl(url)) {
if (!(url.toLowerCase().startsWith("http://")) && !(url.toLowerCase().startsWith("https://"))) {
url = ( isHTTPS ? "https" : "http" ) + "://" + url;
url = (isHTTPS ? "https" : "http") + "://" + url;
}
}

Expand Down
Loading