summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDongwon Kang <dwkang@google.com>2015-04-15 14:25:51 +0900
committerDongwon Kang <dwkang@google.com>2015-04-17 07:18:18 +0900
commitdc327386750e29e09bdb1f88daada8188a3f0c38 (patch)
tree9e181608e18038d7b5b242ec892652135bb65916
parentc988ce484ba066e47629346ea1fdb1290930d0c1 (diff)
downloadTvProvider-dc327386750e29e09bdb1f88daada8188a3f0c38.tar.gz
Allow 3rd-party apps to supply sort order.
Previously, we blocked sort order to make TvProvider secure, but this limited developers to access EPG data in an efficient way. This change allows the sort order with validation on the input param. Bug: 19357901 Change-Id: I8a2f601f1a736d53a11cd4b973d90e41d827d9ee
-rw-r--r--src/com/android/providers/tv/TvProvider.java35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/com/android/providers/tv/TvProvider.java b/src/com/android/providers/tv/TvProvider.java
index 3f928d9..88d9de2 100644
--- a/src/com/android/providers/tv/TvProvider.java
+++ b/src/com/android/providers/tv/TvProvider.java
@@ -487,22 +487,26 @@ public class TvProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
- if (needsToLimitPackage(uri) && !TextUtils.isEmpty(sortOrder)) {
- throw new SecurityException("Sort order not allowed for " + uri);
- }
+ boolean needsToValidateSortOrder = needsToLimitPackage(uri);
SqlParams params = createSqlParams(OP_QUERY, uri, selection, selectionArgs);
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
+ queryBuilder.setStrict(needsToValidateSortOrder);
queryBuilder.setTables(params.getTables());
String orderBy = null;
+ Map<String, String> projectionMap;
if (params.getTables().equals(PROGRAMS_TABLE)) {
- queryBuilder.setProjectionMap(sProgramProjectionMap);
+ projectionMap = sProgramProjectionMap;
orderBy = DEFAULT_PROGRAMS_SORT_ORDER;
} else if (params.getTables().equals(WATCHED_PROGRAMS_TABLE)) {
- queryBuilder.setProjectionMap(sWatchedProgramProjectionMap);
+ projectionMap = sWatchedProgramProjectionMap;
orderBy = DEFAULT_WATCHED_PROGRAMS_SORT_ORDER;
} else {
- queryBuilder.setProjectionMap(sChannelProjectionMap);
+ projectionMap = sChannelProjectionMap;
+ }
+ queryBuilder.setProjectionMap(projectionMap);
+ if (needsToValidateSortOrder) {
+ validateSortOrder(sortOrder, projectionMap.keySet());
}
// Use the default sort order only if no sort order is specified.
@@ -933,6 +937,25 @@ public class TvProvider extends ContentProvider {
}
}
+ /**
+ * Validates the sort order based on the given field set.
+ *
+ * @throws IllegalArgumentException if there is any unknown field.
+ */
+ private static void validateSortOrder(String sortOrder, Set<String> possibleFields) {
+ if (TextUtils.isEmpty(sortOrder) || possibleFields.isEmpty()) {
+ return;
+ }
+ String[] orders = sortOrder.split(",");
+ for (String order : orders) {
+ String field = order.replaceAll("\\s+", " ").trim().toLowerCase().replace(" asc", "")
+ .replace(" desc", "");
+ if (!possibleFields.contains(field)) {
+ throw new IllegalArgumentException("Illegal field in sort order " + order);
+ }
+ }
+ }
+
private class PipeMonitor extends AsyncTask<Void, Void, Void> {
private final ParcelFileDescriptor mPfd;
private final long mChannelId;