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

Reply via email to