diff options
author | Suprabh Shukla <suprabh@google.com> | 2017-03-13 23:42:28 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-03-13 23:42:28 +0000 |
commit | 0bdb50d6bdde5f8879f0dfa98fd784d3ca414318 (patch) | |
tree | b7a88a3d6eda9ecafb594662c1f13d494a395244 | |
parent | 9264e2d7c26356b4edbce97b1ac2520f2b5ea465 (diff) | |
parent | 0b7ca0f777ab8f196c85fdf64b7d868a92ead3c9 (diff) | |
download | android_packages_providers_DownloadProvider-0bdb50d6bdde5f8879f0dfa98fd784d3ca414318.tar.gz android_packages_providers_DownloadProvider-0bdb50d6bdde5f8879f0dfa98fd784d3ca414318.tar.bz2 android_packages_providers_DownloadProvider-0bdb50d6bdde5f8879f0dfa98fd784d3ca414318.zip |
DO NOT MERGE Deleting downloads for removed uids on downloadprovider start am: 3b15466b3c am: f17f32daec am: a6de368a91 am: 84b6c3ba56
am: 0b7ca0f777
Change-Id: I1a8179ade1626ca20755e950d9c0453271ede171
-rw-r--r-- | src/com/android/providers/downloads/DownloadProvider.java | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/src/com/android/providers/downloads/DownloadProvider.java b/src/com/android/providers/downloads/DownloadProvider.java index 72975582..e95eb50b 100644 --- a/src/com/android/providers/downloads/DownloadProvider.java +++ b/src/com/android/providers/downloads/DownloadProvider.java @@ -473,17 +473,42 @@ public final class DownloadProvider extends ContentProvider { final SQLiteDatabase db = mOpenHelper.getReadableDatabase(); final Cursor cursor = db.query(DB_TABLE, new String[] { Downloads.Impl._ID, Constants.UID }, null, null, null, null, null); + final ArrayList<Long> idsToDelete = new ArrayList<>(); try { while (cursor.moveToNext()) { - grantAllDownloadsPermission(cursor.getLong(0), cursor.getInt(1)); + final long downloadId = cursor.getLong(0); + final int uid = cursor.getInt(1); + final String ownerPackage = getPackageForUid(uid); + if (ownerPackage == null) { + idsToDelete.add(downloadId); + } else { + grantAllDownloadsPermission(ownerPackage, downloadId); + } } } finally { cursor.close(); } - + if (idsToDelete.size() > 0) { + Log.i(Constants.TAG, + "Deleting downloads with ids " + idsToDelete + " as owner package is missing"); + deleteDownloadsWithIds(idsToDelete); + } return true; } + private void deleteDownloadsWithIds(ArrayList<Long> downloadIds) { + final int N = downloadIds.size(); + if (N == 0) { + return; + } + final StringBuilder queryBuilder = new StringBuilder(Downloads.Impl._ID + " in ("); + for (int i = 0; i < N; i++) { + queryBuilder.append(downloadIds.get(i)); + queryBuilder.append((i == N - 1) ? ")" : ","); + } + delete(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, queryBuilder.toString(), null); + } + /** * Returns the content-provider-style MIME types of the various * types accessible through this content provider. @@ -703,7 +728,13 @@ public final class DownloadProvider extends ContentProvider { } insertRequestHeaders(db, rowID, values); - grantAllDownloadsPermission(rowID, Binder.getCallingUid()); + + final String callingPackage = getPackageForUid(Binder.getCallingUid()); + if (callingPackage == null) { + Log.e(Constants.TAG, "Package does not exist for calling uid"); + return null; + } + grantAllDownloadsPermission(callingPackage, rowID); notifyContentChanged(uri, match); final long token = Binder.clearCallingIdentity(); @@ -722,6 +753,15 @@ public final class DownloadProvider extends ContentProvider { return ContentUris.withAppendedId(Downloads.Impl.CONTENT_URI, rowID); } + private String getPackageForUid(int uid) { + String[] packages = getContext().getPackageManager().getPackagesForUid(uid); + if (packages == null || packages.length == 0) { + return null; + } + // For permission related purposes, any package belonging to the given uid should work. + return packages[0]; + } + /** * Check that the file URI provided for DESTINATION_FILE_URI is valid. */ @@ -1499,14 +1539,9 @@ public final class DownloadProvider extends ContentProvider { } } - private void grantAllDownloadsPermission(long id, int uid) { - final String[] packageNames = getContext().getPackageManager().getPackagesForUid(uid); - if (packageNames == null || packageNames.length == 0) return; - - // We only need to grant to the first package, since the - // platform internally tracks based on UIDs + private void grantAllDownloadsPermission(String toPackage, long id) { final Uri uri = ContentUris.withAppendedId(Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, id); - getContext().grantUriPermission(packageNames[0], uri, + getContext().grantUriPermission(toPackage, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } |