Skip to content

Commit d38dde0

Browse files
committed
Use clientlogin API module
This is the first step to allowing 2 factor authentication #328. This uses the new API module clientlogin instead of the login module. We still report the same set of errors in a 'nice' way with real error messages, how ever there are lots more that can probably be handled, for example #507.
1 parent 2e7aadd commit d38dde0

File tree

12 files changed

+80
-23
lines changed

12 files changed

+80
-23
lines changed

app/src/main/java/fr/free/nrw/commons/CommonsApplication.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
3333
import org.apache.http.params.BasicHttpParams;
3434
import org.apache.http.params.CoreProtocolPNames;
35-
import org.mediawiki.api.MWApi;
3635

3736
import java.io.IOException;
3837

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package fr.free.nrw.commons;
2+
3+
import java.io.IOException;
4+
5+
import org.apache.http.impl.client.AbstractHttpClient;
6+
import org.mediawiki.api.ApiResult;
7+
8+
/**
9+
* @author Addshore
10+
*/
11+
public class MWApi extends org.mediawiki.api.MWApi {
12+
13+
public MWApi(String apiURL, AbstractHttpClient client) {
14+
super(apiURL, client);
15+
}
16+
17+
/**
18+
* @param username String
19+
* @param password String
20+
* @return String On success: "PASS"
21+
* failure: A failure message code (deifned by mediawiki)
22+
* misc: genericerror-UI, genericerror-REDIRECT, genericerror-RESTART
23+
* @throws IOException On api request IO issue
24+
*/
25+
public String login(String username, String password) throws IOException {
26+
27+
/** Request a login token to be used later to log in. */
28+
ApiResult tokenData = this.action("query")
29+
.param("action", "query")
30+
.param("meta", "tokens")
31+
.param("type", "login")
32+
.post();
33+
String token = tokenData.getString("/api/query/tokens/@logintoken");
34+
35+
/** Actually log in. */
36+
ApiResult loginData = this.action("clientlogin")
37+
.param("rememberMe", "1")
38+
.param("username", username)
39+
.param("password", password)
40+
.param("logintoken", token)
41+
.param("loginreturnurl", "http://example.com/")//TODO return to url?
42+
.post();
43+
String status = loginData.getString("/api/clientlogin/@status");
44+
45+
if (status.equals("PASS")) {
46+
this.isLoggedIn = true;
47+
return status;
48+
49+
} else if (status.equals("FAIL")) {
50+
return loginData.getString("/api/clientlogin/@messagecode");
51+
}
52+
53+
// UI, REDIRECT, RESTART
54+
return "genericerror-" + status;
55+
}
56+
57+
58+
}

app/src/main/java/fr/free/nrw/commons/MediaDataExtractor.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package fr.free.nrw.commons;
22

33
import org.mediawiki.api.ApiResult;
4-
import org.mediawiki.api.MWApi;
54
import org.w3c.dom.Document;
65
import org.w3c.dom.Element;
76
import org.w3c.dom.Node;

app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ protected void onPostExecute(String result) {
6666
.param("result", result)
6767
.log();
6868

69-
if (result.equals("Success")) {
69+
if (result.equals("PASS")) {
7070
if (dialog != null && dialog.isShowing()) {
7171
dialog.dismiss();
7272
}
@@ -100,20 +100,27 @@ protected void onPostExecute(String result) {
100100

101101
} else {
102102
int response;
103+
// Match known failure message codes and provide messages
103104
if(result.equals("NetworkFailure")) {
105+
// Matches NetworkFailure which is created by the doInBackground method
104106
response = R.string.login_failed_network;
105-
} else if(result.equals("NotExists") || result.equals("Illegal") || result.equals("NotExists")) {
107+
} else if (result.toLowerCase().contains("nosuchuser".toLowerCase()) || result.toLowerCase().contains("noname".toLowerCase())) {
108+
// Matches nosuchuser, nosuchusershort, noname
106109
response = R.string.login_failed_username;
107110
passwordEdit.setText("");
108-
} else if(result.equals("EmptyPass") || result.equals("WrongPass") || result.equals("WrongPluginPass")) {
111+
112+
} else if (result.toLowerCase().contains("wrongpassword".toLowerCase())) {
113+
// Matches wrongpassword, wrongpasswordempty
109114
response = R.string.login_failed_password;
110115
passwordEdit.setText("");
111-
} else if(result.equals("Throttled")) {
116+
} else if (result.toLowerCase().contains("throttle".toLowerCase())) {
117+
// Matches unknown throttle error codes
112118
response = R.string.login_failed_throttled;
113-
} else if(result.equals("Blocked")) {
119+
} else if (result.toLowerCase().contains("userblocked".toLowerCase())) {
120+
// Matches login-userblocked
114121
response = R.string.login_failed_blocked;
115122
} else {
116-
// Should never really happen
123+
// Occurs with unhandled login failure codes
117124
Timber.d("Login failed with reason: %s", result);
118125
response = R.string.login_failed_generic;
119126
}

app/src/main/java/fr/free/nrw/commons/auth/WikiAccountAuthenticator.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
import android.content.Intent;
1010
import android.os.Bundle;
1111

12-
import org.mediawiki.api.MWApi;
13-
1412
import java.io.IOException;
1513

1614
import fr.free.nrw.commons.CommonsApplication;
15+
import fr.free.nrw.commons.MWApi;
1716

1817
public class WikiAccountAuthenticator extends AbstractAccountAuthenticator {
1918

@@ -46,7 +45,7 @@ public Bundle editProperties(AccountAuthenticatorResponse response, String accou
4645
private String getAuthCookie(String username, String password) throws IOException {
4746
MWApi api = CommonsApplication.createMWApi();
4847
String result = api.login(username, password);
49-
if(result.equals("Success")) {
48+
if(result.equals("PASS")) {
5049
return api.getAuthCookie();
5150
} else {
5251
return null;

app/src/main/java/fr/free/nrw/commons/category/MethodAUpdater.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import android.os.AsyncTask;
44
import android.view.View;
55

6+
import fr.free.nrw.commons.MWApi;
67
import org.mediawiki.api.ApiResult;
7-
import org.mediawiki.api.MWApi;
88

99
import java.io.IOException;
1010
import java.util.ArrayList;

app/src/main/java/fr/free/nrw/commons/category/PrefixUpdater.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import android.text.TextUtils;
55
import android.view.View;
66

7+
import fr.free.nrw.commons.MWApi;
78
import org.mediawiki.api.ApiResult;
8-
import org.mediawiki.api.MWApi;
99

1010
import java.io.IOException;
1111
import java.util.ArrayList;

app/src/main/java/fr/free/nrw/commons/category/TitleCategories.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import android.os.AsyncTask;
44

5+
import fr.free.nrw.commons.MWApi;
56
import org.mediawiki.api.ApiResult;
6-
import org.mediawiki.api.MWApi;
77

88
import java.io.IOException;
99
import java.util.ArrayList;

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsSyncAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import android.os.RemoteException;
1313
import android.text.TextUtils;
1414

15+
import fr.free.nrw.commons.MWApi;
1516
import org.mediawiki.api.ApiResult;
16-
import org.mediawiki.api.MWApi;
1717

1818
import java.io.IOException;
1919
import java.util.ArrayList;

app/src/main/java/fr/free/nrw/commons/modifications/ModificationsSyncAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import android.os.Bundle;
1313
import android.os.RemoteException;
1414

15+
import fr.free.nrw.commons.MWApi;
1516
import org.mediawiki.api.ApiResult;
16-
import org.mediawiki.api.MWApi;
1717

1818
import java.io.IOException;
1919

app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import android.os.AsyncTask;
77
import android.support.v7.app.AlertDialog;
88

9+
import fr.free.nrw.commons.MWApi;
910
import org.mediawiki.api.ApiResult;
10-
import org.mediawiki.api.MWApi;
1111

1212
import java.io.IOException;
1313
import java.util.ArrayList;

app/src/main/java/fr/free/nrw/commons/upload/UploadService.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import android.webkit.MimeTypeMap;
1414
import android.widget.Toast;
1515

16+
import fr.free.nrw.commons.*;
1617
import org.mediawiki.api.ApiResult;
17-
import org.mediawiki.api.MWApi;
1818

1919
import java.io.FileNotFoundException;
2020
import java.io.IOException;
@@ -25,11 +25,6 @@
2525
import java.util.regex.Matcher;
2626
import java.util.regex.Pattern;
2727

28-
import fr.free.nrw.commons.CommonsApplication;
29-
import fr.free.nrw.commons.EventLog;
30-
import fr.free.nrw.commons.HandlerService;
31-
import fr.free.nrw.commons.R;
32-
import fr.free.nrw.commons.Utils;
3328
import fr.free.nrw.commons.contributions.Contribution;
3429
import fr.free.nrw.commons.contributions.ContributionsActivity;
3530
import fr.free.nrw.commons.contributions.ContributionsContentProvider;

0 commit comments

Comments
 (0)