Fix AttachmentProvider to work properly w/ EmailProvider

* Apps trying to open attachments using AttachmentProvider were
  seeing SecurityExceptions due to the fact that internal calls
  from AttachmentProvider to EmailProvider didn't have their
  calling identity saved/restored.
* Updated provider calls so that these calls use the Email
  process' identity.

Bug: 2908737
Change-Id: Ifb71ad834530c6232728e1aad31439991f8ed379
This commit is contained in:
Marc Blank 2010-08-11 17:31:45 -07:00
parent c4de16b4ff
commit 1ec89e6290
1 changed files with 121 additions and 105 deletions

View File

@ -33,6 +33,7 @@ import android.database.MatrixCursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Binder;
import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import android.webkit.MimeTypeMap;
@ -150,8 +151,9 @@ public class AttachmentProvider extends ContentProvider {
*/
@Override
public String getType(Uri uri) {
long callingId = Binder.clearCallingIdentity();
try {
List<String> segments = uri.getPathSegments();
String accountId = segments.get(0);
String id = segments.get(1);
String format = segments.get(2);
if (FORMAT_THUMBNAIL.equals(format)) {
@ -172,6 +174,9 @@ public class AttachmentProvider extends ContentProvider {
}
return null;
}
} finally {
Binder.restoreCallingIdentity(callingId);
}
}
/**
@ -234,6 +239,8 @@ public class AttachmentProvider extends ContentProvider {
*/
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
long callingId = Binder.clearCallingIdentity();
try {
List<String> segments = uri.getPathSegments();
String accountId = segments.get(0);
String id = segments.get(1);
@ -245,7 +252,8 @@ public class AttachmentProvider extends ContentProvider {
File dir = getContext().getCacheDir();
File file = new File(dir, filename);
if (!file.exists()) {
Uri attachmentUri = getAttachmentUri(Long.parseLong(accountId), Long.parseLong(id));
Uri attachmentUri =
getAttachmentUri(Long.parseLong(accountId), Long.parseLong(id));
Cursor c = query(attachmentUri,
new String[] { AttachmentProviderColumns.DATA }, null, null, null);
if (c != null) {
@ -281,6 +289,9 @@ public class AttachmentProvider extends ContentProvider {
new File(getContext().getDatabasePath(accountId + ".db_att"), id),
ParcelFileDescriptor.MODE_READ_ONLY);
}
} finally {
Binder.restoreCallingIdentity(callingId);
}
}
@Override
@ -303,6 +314,8 @@ public class AttachmentProvider extends ContentProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
long callingId = Binder.clearCallingIdentity();
try {
if (projection == null) {
projection =
new String[] {
@ -353,6 +366,9 @@ public class AttachmentProvider extends ContentProvider {
}
ret.addRow(values);
return ret;
} finally {
Binder.restoreCallingIdentity(callingId);
}
}
@Override