Messaging auto persist switch (3/4)
b/14095333
Change-Id: I77d33a177fadba482c1571b59a10d6ebf1863a43
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index ed5ea8d..2d801e0 100644
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -65,11 +65,10 @@
@Override
public boolean onCreate() {
- if (!Telephony.AUTO_PERSIST) {
- // TODO(ywen): Temporarily enable this so not to break existing apps
- setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
- }
- mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+ setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_NONE);
+ final Context context = getContext();
+ mOpenHelper = MmsSmsDatabaseHelper.getInstance(context);
+ mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
return true;
}
@@ -277,7 +276,10 @@
@Override
public Uri insert(Uri uri, ContentValues values) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(TAG, "insert: rejected");
+ return rejectInsert(uri, values);
+ }
// Don't let anyone insert anything with the _data column
if (values != null && values.containsKey(Part._DATA)) {
return null;
@@ -543,7 +545,10 @@
@Override
public int delete(Uri uri, String selection,
String[] selectionArgs) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(TAG, "delete: rejected");
+ return 0;
+ }
int match = sURLMatcher.match(uri);
if (LOCAL_LOGV) {
Log.v(TAG, "Delete uri=" + uri + ", match=" + match);
@@ -697,7 +702,10 @@
@Override
public int update(Uri uri, ContentValues values,
String selection, String[] selectionArgs) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(TAG, "update: rejected");
+ return 0;
+ }
// Don't let anyone update the _data column
if (values != null && values.containsKey(Part._DATA)) {
return 0;
@@ -941,6 +949,8 @@
private SQLiteOpenHelper mOpenHelper;
+ private AppOpsManager mAppOps;
+
private static String concatSelections(String selection1, String selection2) {
if (TextUtils.isEmpty(selection1)) {
return selection2;
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index 3c6fae9..57ac277 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -281,15 +281,16 @@
private SQLiteOpenHelper mOpenHelper;
+ private AppOpsManager mAppOps;
+
private boolean mUseStrictPhoneNumberComparation;
@Override
public boolean onCreate() {
- if (!Telephony.AUTO_PERSIST) {
- // TODO(ywen): Temporarily enable this so not to break existing apps
- setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
- }
- mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+ setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_NONE);
+ final Context context = getContext();
+ mOpenHelper = MmsSmsDatabaseHelper.getInstance(context);
+ mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
mUseStrictPhoneNumberComparation =
getContext().getResources().getBoolean(
com.android.internal.R.bool.config_use_strict_phone_number_comparation);
@@ -1174,7 +1175,10 @@
@Override
public int delete(Uri uri, String selection,
String[] selectionArgs) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(LOG_TAG, "delete: rejected");
+ return 0;
+ }
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
Context context = getContext();
int affectedRows = 0;
@@ -1230,7 +1234,10 @@
@Override
public Uri insert(Uri uri, ContentValues values) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(LOG_TAG, "insert: rejected");
+ return rejectInsert(uri, values);
+ }
if (URI_MATCHER.match(uri) == URI_PENDING_MSG) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
long rowId = db.insert(TABLE_PENDING_MSG, null, values);
@@ -1242,7 +1249,10 @@
@Override
public int update(Uri uri, ContentValues values,
String selection, String[] selectionArgs) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(LOG_TAG, "update: rejected");
+ return 0;
+ }
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int affectedRows = 0;
switch(URI_MATCHER.match(uri)) {
diff --git a/src/com/android/providers/telephony/SmsProvider.java b/src/com/android/providers/telephony/SmsProvider.java
index 89736e5..74ff103 100644
--- a/src/com/android/providers/telephony/SmsProvider.java
+++ b/src/com/android/providers/telephony/SmsProvider.java
@@ -20,6 +20,7 @@
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
@@ -84,11 +85,10 @@
@Override
public boolean onCreate() {
- if (!Telephony.AUTO_PERSIST) {
- // TODO(ywen): Temporarily enable this so not to break existing apps
- setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
- }
- mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
+ setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_NONE);
+ final Context context = getContext();
+ mOpenHelper = MmsSmsDatabaseHelper.getInstance(context);
+ mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
return true;
}
@@ -350,7 +350,10 @@
@Override
public Uri insert(Uri url, ContentValues initialValues) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(TAG, "insert: rejected");
+ return rejectInsert(url, initialValues);
+ }
long token = Binder.clearCallingIdentity();
try {
return insertInner(url, initialValues);
@@ -543,7 +546,10 @@
@Override
public int delete(Uri url, String where, String[] whereArgs) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(TAG, "delete: rejected");
+ return 0;
+ }
int count;
int match = sURLMatcher.match(url);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
@@ -629,7 +635,10 @@
@Override
public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
- SmsWritePermission.enforce();
+ if (!SmsWritePermission.permit(mAppOps, getCallingPackage())) {
+ Log.e(TAG, "update: rejected");
+ return 0;
+ }
int count = 0;
String table = TABLE_SMS;
String extraWhere = null;
@@ -710,6 +719,8 @@
private SQLiteOpenHelper mOpenHelper;
+ private AppOpsManager mAppOps;
+
private final static String TAG = "SmsProvider";
private final static String VND_ANDROID_SMS = "vnd.android.cursor.item/sms";
private final static String VND_ANDROID_SMSCHAT =
diff --git a/src/com/android/providers/telephony/SmsWritePermission.java b/src/com/android/providers/telephony/SmsWritePermission.java
index 186a75f..6229673 100644
--- a/src/com/android/providers/telephony/SmsWritePermission.java
+++ b/src/com/android/providers/telephony/SmsWritePermission.java
@@ -16,9 +16,10 @@
package com.android.providers.telephony;
+import android.app.AppOpsManager;
+import android.content.Context;
import android.os.Binder;
import android.os.Process;
-import android.provider.Telephony;
import android.util.Log;
/**
@@ -27,15 +28,18 @@
public class SmsWritePermission {
public static final String TAG = "SmsWritePermission";
- public static void enforce() {
- if (!Telephony.AUTO_PERSIST) {
- // TODO(ywen): Temporarily disable this so not to break existing apps
- return;
+ public static boolean permit(AppOpsManager appOpsManager, String callingPkg) {
+ final int uid = Binder.getCallingUid();
+ Log.d(TAG, "SmsWritePermission.permit: calling UID " + uid);
+ if (uid == Process.SYSTEM_UID || uid == Process.PHONE_UID) {
+ // Allow system or phone process to access anyway
+ return true;
}
- final long uid = Binder.getCallingUid();
- Log.d(TAG, "Calling UID " + uid);
- if (uid != Process.SYSTEM_UID && uid != Process.PHONE_UID) {
- throw new SecurityException("Only system or phone can access");
+ if (appOpsManager.noteOp(AppOpsManager.OP_WRITE_SMS, uid, callingPkg) ==
+ AppOpsManager.MODE_ALLOWED) {
+ // Or we allow the default SMS app to access
+ return true;
}
+ return false;
}
}