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