summaryrefslogtreecommitdiffstats
path: root/src/com/android/providers/downloads/DownloadProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/providers/downloads/DownloadProvider.java')
-rw-r--r--src/com/android/providers/downloads/DownloadProvider.java41
1 files changed, 34 insertions, 7 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java
index db005542..d7c24f9a 100644
--- a/src/com/android/providers/downloads/DownloadProvider.java
+++ b/src/com/android/providers/downloads/DownloadProvider.java
@@ -413,23 +413,40 @@ public final class DownloadProvider extends ContentProvider {
callingUid != mSystemUid &&
callingUid != mDefContainerUid &&
Process.supportsProcesses()) {
- if (!emptyWhere) {
- qb.appendWhere(" AND ");
- }
- qb.appendWhere("( " + Constants.UID + "=" + Binder.getCallingUid() + " OR "
- + Downloads.Impl.COLUMN_OTHER_UID + "=" + Binder.getCallingUid() + " )");
- emptyWhere = false;
-
+ boolean canSeeAllExternal;
if (projection == null) {
projection = sAppReadableColumnsArray;
+ // sAppReadableColumnsArray includes _DATA, which is not allowed
+ // to be seen except by the initiating application
+ canSeeAllExternal = false;
} else {
+ canSeeAllExternal = getContext().checkCallingPermission(
+ Downloads.Impl.PERMISSION_SEE_ALL_EXTERNAL)
+ == PackageManager.PERMISSION_GRANTED;
for (int i = 0; i < projection.length; ++i) {
if (!sAppReadableColumnsSet.contains(projection[i])) {
throw new IllegalArgumentException(
"column " + projection[i] + " is not allowed in queries");
}
+ canSeeAllExternal = canSeeAllExternal
+ && !projection[i].equals(Downloads.Impl._DATA);
}
}
+ if (!emptyWhere) {
+ qb.appendWhere(" AND ");
+ emptyWhere = false;
+ }
+ String validUid = "( " + Constants.UID + "="
+ + Binder.getCallingUid() + " OR "
+ + Downloads.Impl.COLUMN_OTHER_UID + "="
+ + Binder.getCallingUid() + " )";
+ if (canSeeAllExternal) {
+ qb.appendWhere("( " + validUid + " OR "
+ + Downloads.Impl.DESTINATION_EXTERNAL + " = "
+ + Downloads.Impl.COLUMN_DESTINATION + " )");
+ } else {
+ qb.appendWhere(validUid);
+ }
}
if (Constants.LOGVV) {
@@ -526,6 +543,16 @@ public final class DownloadProvider extends ContentProvider {
copyString(Downloads.Impl.COLUMN_DESCRIPTION, values, filteredValues);
} else {
filteredValues = values;
+ String filename = values.getAsString(Downloads.Impl._DATA);
+ if (filename != null) {
+ Cursor c = query(uri, new String[]
+ { Downloads.Impl.COLUMN_TITLE }, null, null, null);
+ if (!c.moveToFirst() || c.getString(0) == null) {
+ values.put(Downloads.Impl.COLUMN_TITLE,
+ new File(filename).getName());
+ }
+ c.close();
+ }
}
int match = sURIMatcher.match(uri);
switch (match) {