Dbrant has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/405339 )

Change subject: Add more checks to protect and bullet-proof the Default list.
......................................................................

Add more checks to protect and bullet-proof the Default list.

This adds several logical checks to prevent renaming or deleting the
Default list, both at the database level and at the UI level.

There can be a few cases where the UI might lead the user to allow
renaming or deleting the default list (e.g. through a RecyclerView quirk,
or through some other logic that we missed), and we need to prevent this
at all costs.

Bug: T185330
Change-Id: Ibf1c4f85210b9d129424c38d73351df342cea82f
---
M app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java
M app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java
M app/src/main/java/org/wikipedia/readinglist/database/ReadingListDbHelper.java
M app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
4 files changed, 53 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/39/405339/1

diff --git 
a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java 
b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java
index 18e83cb..9dbf0b2 100644
--- a/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java
+++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListFragment.java
@@ -48,6 +48,7 @@
 import org.wikipedia.util.FeedbackUtil;
 import org.wikipedia.util.ShareUtil;
 import org.wikipedia.util.StringUtil;
+import org.wikipedia.util.log.L;
 import org.wikipedia.views.DefaultViewHolder;
 import org.wikipedia.views.DrawableItemDecoration;
 import org.wikipedia.views.MultiSelectActionModeCallback;
@@ -325,6 +326,9 @@
     private void rename() {
         if (readingList == null) {
             return;
+        } else if (readingList.isDefault()) {
+            L.w("Attempted to rename default list.");
+            return;
         }
 
         List<ReadingList> tempLists = 
ReadingListDbHelper.instance().getAllListsWithoutContents();
@@ -347,6 +351,9 @@
     private void editDescription() {
         if (readingList == null) {
             return;
+        } else if (readingList.isDefault()) {
+            L.w("Attempted to edit description of default list.");
+            return;
         }
         TextInputDialog.newInstance(getContext(), new 
TextInputDialog.DefaultCallback() {
             @Override
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java 
b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java
index 52d6c53..77d2dcb 100644
--- a/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java
+++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListsFragment.java
@@ -42,6 +42,7 @@
 import org.wikipedia.settings.SettingsActivity;
 import org.wikipedia.util.FeedbackUtil;
 import org.wikipedia.util.ReleaseUtil;
+import org.wikipedia.util.log.L;
 import org.wikipedia.views.DrawableItemDecoration;
 import org.wikipedia.views.SearchEmptyView;
 import org.wikipedia.views.TextInputDialog;
@@ -296,6 +297,10 @@
 
         @Override
         public void onRename(@NonNull ReadingList readingList) {
+            if (readingList.isDefault()) {
+                L.w("Attempted to rename default list.");
+                return;
+            }
             List<String> existingTitles = new ArrayList<>();
             for (ReadingList list : readingLists) {
                 existingTitles.add(list.title());
@@ -315,6 +320,10 @@
 
         @Override
         public void onEditDescription(@NonNull ReadingList readingList) {
+            if (readingList.isDefault()) {
+                L.w("Attempted to edit description of default list.");
+                return;
+            }
             TextInputDialog.newInstance(getContext(), new 
TextInputDialog.DefaultCallback() {
                 @Override
                 public void onShow(@NonNull TextInputDialog dialog) {
@@ -376,6 +385,11 @@
 
     private void deleteList(@Nullable ReadingList readingList) {
         if (readingList != null) {
+            if (readingList.isDefault()) {
+                L.w("Attempted to delete default list.");
+                return;
+            }
+
             showDeleteListUndoSnackbar(readingList);
 
             ReadingListDbHelper.instance().deleteList(readingList);
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/database/ReadingListDbHelper.java 
b/app/src/main/java/org/wikipedia/readinglist/database/ReadingListDbHelper.java
index 60ef621..4db8a96 100644
--- 
a/app/src/main/java/org/wikipedia/readinglist/database/ReadingListDbHelper.java
+++ 
b/app/src/main/java/org/wikipedia/readinglist/database/ReadingListDbHelper.java
@@ -5,7 +5,9 @@
 import android.database.sqlite.SQLiteDatabase;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.text.TextUtils;
 
+import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.database.contract.ReadingListContract;
 import org.wikipedia.database.contract.ReadingListPageContract;
@@ -72,12 +74,15 @@
 
     @NonNull
     public ReadingList createList(@NonNull String title, @Nullable String 
description) {
-        SQLiteDatabase db = getWritableDatabase();
-        return createList(db, title, description);
+        if (TextUtils.isEmpty(title)) {
+            L.w("Attempted to create list with empty title (default).");
+            return getDefaultList();
+        }
+        return createList(getWritableDatabase(), title, description);
     }
 
     @NonNull
-    public ReadingList createList(@NonNull SQLiteDatabase db, @NonNull String 
title, @Nullable String description) {
+    ReadingList createList(@NonNull SQLiteDatabase db, @NonNull String title, 
@Nullable String description) {
         db.beginTransaction();
         try {
             ReadingList protoList = new ReadingList(title, description);
@@ -96,7 +101,7 @@
         updateLists(db, Collections.singletonList(list), queueForSync);
     }
 
-    public void updateList(@NonNull SQLiteDatabase db, @NonNull ReadingList 
list, boolean queueForSync) {
+    void updateList(@NonNull SQLiteDatabase db, @NonNull ReadingList list, 
boolean queueForSync) {
         updateLists(db, Collections.singletonList(list), queueForSync);
     }
 
@@ -123,6 +128,10 @@
     }
 
     public void deleteList(@NonNull ReadingList list, boolean queueForSync) {
+        if (list.isDefault()) {
+            L.w("Attempted to delete the default list.");
+            return;
+        }
         SQLiteDatabase db = getWritableDatabase();
         db.beginTransaction();
         try {
@@ -419,6 +428,24 @@
     }
 
     @NonNull
+    ReadingList createDefaultList(@NonNull SQLiteDatabase db) {
+        return createList(db, "",
+                
WikipediaApp.getInstance().getString(R.string.default_reading_list_description));
+    }
+
+    @NonNull
+    private ReadingList getDefaultList() {
+        List<ReadingList> lists = getAllListsWithoutContents();
+        for (ReadingList list : lists) {
+            if (list.isDefault()) {
+                return list;
+            }
+        }
+        L.logRemoteErrorIfProd(new RuntimeException("Recreating default list 
(should not happen)."));
+        return createDefaultList(getWritableDatabase());
+    }
+
+    @NonNull
     public List<ReadingListPage> getAllPagesToBeSaved() {
         List<ReadingListPage> pages = new ArrayList<>();
         SQLiteDatabase db = getReadableDatabase();
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
 
b/app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
index 79dd510..be1aaf5 100644
--- 
a/app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
+++ 
b/app/src/main/java/org/wikipedia/readinglist/database/ReadingListPageTable.java
@@ -127,8 +127,7 @@
                 return;
             }
         }
-        currentLists.add(ReadingListDbHelper.instance().createList(db, "",
-                
WikipediaApp.getInstance().getString(R.string.default_reading_list_description)));
+        currentLists.add(ReadingListDbHelper.instance().createDefaultList(db));
     }
 
     private void renameListsWithIdenticalNameAsDefault(SQLiteDatabase db, 
List<ReadingList> lists) {

-- 
To view, visit https://gerrit.wikimedia.org/r/405339
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibf1c4f85210b9d129424c38d73351df342cea82f
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to