jenkins-bot has submitted this change and it was merged. Change subject: Fix server logout case when logged in user edits ......................................................................
Fix server logout case when logged in user edits When a user is logged into the app and makes an edit, EditClient requests that the server verify the user is still logged in and that the edit will be associated with their account. If the user is logged out, the request fails. This patch checks for and retries in that scenario. I no longer reproduce this issue but I wrote a test to exercise the scenario. Bug: T150529 Change-Id: I88b700b2bfb9433ddcaab86829b32557000f772d --- M app/src/main/java/org/wikipedia/edit/EditClient.java M app/src/main/java/org/wikipedia/edit/EditSectionActivity.java A app/src/main/java/org/wikipedia/edit/UserNotLoggedInException.java M app/src/test/java/org/wikipedia/edit/EditUnitTest.java A app/src/test/res/raw/edit_user_not_logged_in.json 5 files changed, 42 insertions(+), 9 deletions(-) Approvals: BearND: Looks good to me, approved Mholloway: Looks good to me, but someone else must approve jenkins-bot: Verified diff --git a/app/src/main/java/org/wikipedia/edit/EditClient.java b/app/src/main/java/org/wikipedia/edit/EditClient.java index 6af48a3..f8ee30e 100644 --- a/app/src/main/java/org/wikipedia/edit/EditClient.java +++ b/app/src/main/java/org/wikipedia/edit/EditClient.java @@ -68,6 +68,8 @@ } else { cb.failure(call, new RuntimeException("Received unrecognized edit response")); } + } else if ("assertuserfailed".equals(response.body().code())) { + cb.failure(call, new UserNotLoggedInException()); } else if (response.body().info() != null) { String info = response.body().info(); cb.failure(call, new RuntimeException(info)); diff --git a/app/src/main/java/org/wikipedia/edit/EditSectionActivity.java b/app/src/main/java/org/wikipedia/edit/EditSectionActivity.java index 20e2529..68fa763 100644 --- a/app/src/main/java/org/wikipedia/edit/EditSectionActivity.java +++ b/app/src/main/java/org/wikipedia/edit/EditSectionActivity.java @@ -338,10 +338,12 @@ if (caught instanceof ApiException) { // This is a fairly standard editing exception. Handle it appropriately. handleEditingException((ApiException) caught); + } else if (caught instanceof UserNotLoggedInException) { + retry(); } else { // If it's not an API exception, we have no idea what's wrong. // Show the user a generic error message. - L.w("Caught " + caught.toString()); + L.w(caught); showRetryDialog(); } } @@ -382,20 +384,23 @@ retryDialog.show(); } + private void retry() { + // looks like our session expired. + app.getEditTokenStorage().clearAllTokens(); + app.getCookieManager().clearAllCookies(); + + User user = User.getUser(); + doLoginAndSave(user); + } + /** * Processes API error codes encountered during editing, and handles them as appropriate. * @param e The ApiException to handle. */ private void handleEditingException(@NonNull ApiException e) { String code = e.getCode(); - if (User.isLoggedIn() && ("badtoken".equals(code) - || "assertuserfailed".equals(code))) { - // looks like our session expired. - app.getEditTokenStorage().clearAllTokens(); - app.getCookieManager().clearAllCookies(); - - User user = User.getUser(); - doLoginAndSave(user); + if (User.isLoggedIn() && ("badtoken".equals(code) || "assertuserfailed".equals(code))) { + retry(); } else if ("blocked".equals(code) || "wikimedia-globalblocking-ipblocked".equals(code)) { // User is blocked, locally or globally // If they were anon, canedit does not catch this, so we can't show them the locked pencil diff --git a/app/src/main/java/org/wikipedia/edit/UserNotLoggedInException.java b/app/src/main/java/org/wikipedia/edit/UserNotLoggedInException.java new file mode 100644 index 0000000..7464302 --- /dev/null +++ b/app/src/main/java/org/wikipedia/edit/UserNotLoggedInException.java @@ -0,0 +1,8 @@ +package org.wikipedia.edit; + +// https://www.mediawiki.org/wiki/API:Assert +public class UserNotLoggedInException extends RuntimeException { + public UserNotLoggedInException() { + super("User not logged in."); + } +} \ No newline at end of file diff --git a/app/src/test/java/org/wikipedia/edit/EditUnitTest.java b/app/src/test/java/org/wikipedia/edit/EditUnitTest.java index b74de97..9bc0687 100644 --- a/app/src/test/java/org/wikipedia/edit/EditUnitTest.java +++ b/app/src/test/java/org/wikipedia/edit/EditUnitTest.java @@ -45,6 +45,16 @@ assertExpectedEditError(call, cb, "Invalid token"); } + @Test public void testRequestUserNotLoggedIn() throws Throwable { + enqueueFromFile("edit_user_not_logged_in.json"); + + Callback cb = mock(Callback.class); + Call<Edit> call = request(cb); + + server().takeRequest(); + assertExpectedEditError(call, cb, "User not logged in."); + } + @NonNull private Call<Edit> request(@NonNull Callback cb) { return client.request(service(Service.class), new PageTitle("FAKE TITLE", WikiSite.forLanguageCode("test")), 0, "FAKE EDIT TEXT", "+/", "FAKE SUMMARY", false, diff --git a/app/src/test/res/raw/edit_user_not_logged_in.json b/app/src/test/res/raw/edit_user_not_logged_in.json new file mode 100644 index 0000000..ac1821b --- /dev/null +++ b/app/src/test/res/raw/edit_user_not_logged_in.json @@ -0,0 +1,8 @@ +{ + "servedby": "mw1221", + "error": { + "code": "assertuserfailed", + "info": "Assertion that the user is logged in failed", + "docref": "See https://en.wikipedia.org/w/api.php for API usage" + } +} \ No newline at end of file -- To view, visit https://gerrit.wikimedia.org/r/322018 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I88b700b2bfb9433ddcaab86829b32557000f772d Gerrit-PatchSet: 2 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org> Gerrit-Reviewer: BearND <bsitzm...@wikimedia.org> Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Dbrant <dbr...@wikimedia.org> Gerrit-Reviewer: Mholloway <mhollo...@wikimedia.org> Gerrit-Reviewer: Niedzielski <sniedziel...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits