diff options
| author | 2020-11-03 06:31:31 +0000 | |
|---|---|---|
| committer | 2020-11-03 06:31:31 +0000 | |
| commit | cf061c1f55a3058612e9f64418d1925d96871d80 (patch) | |
| tree | 1150995f1b5de8641304e46c288209814c2ba7cd | |
| parent | dc2e141bc9ea8be0200fbca354977117d6b24da5 (diff) | |
| parent | 38f832d4f356c2d735d7de68eb24ebea9d389089 (diff) | |
Merge "Allow voice recognition service to blame other apps access."
| -rw-r--r-- | core/java/android/app/AppOpsManager.java | 29 | ||||
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 30 |
2 files changed, 55 insertions, 4 deletions
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index e20ef7f70954..c89f16e596b5 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -31,6 +31,7 @@ import android.compat.Compatibility; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; import android.compat.annotation.UnsupportedAppUsage; +import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageManager; @@ -52,6 +53,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserManager; +import android.provider.Settings; import android.util.ArrayMap; import android.util.ArraySet; import android.util.LongSparseArray; @@ -7590,8 +7592,9 @@ public class AppOpsManager { collectNotedOpForSelf(op, proxiedAttributionTag); } else if (collectionMode == COLLECT_SYNC // Only collect app-ops when the proxy is trusted - && mContext.checkPermission(Manifest.permission.UPDATE_APP_OPS_STATS, -1, - myUid) == PackageManager.PERMISSION_GRANTED) { + && (mContext.checkPermission(Manifest.permission.UPDATE_APP_OPS_STATS, -1, + myUid) == PackageManager.PERMISSION_GRANTED + || isTrustedVoiceServiceProxy(mContext.getOpPackageName(), op))) { collectNotedOpSync(op, proxiedAttributionTag); } } @@ -7602,6 +7605,28 @@ public class AppOpsManager { } } + private boolean isTrustedVoiceServiceProxy(String packageName, int code) { + // This is a workaround for R QPR, new API change is not allowed. We only allow the current + // voice recognizer is also the voice interactor to noteproxy op. + if (code != OP_RECORD_AUDIO) { + return false; + } + final String voiceRecognitionComponent = Settings.Secure.getString( + mContext.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE); + final String voiceInteractionComponent = Settings.Secure.getString( + mContext.getContentResolver(), Settings.Secure.VOICE_INTERACTION_SERVICE); + + final String voiceRecognitionServicePackageName = + voiceRecognitionComponent != null ? ComponentName.unflattenFromString( + voiceRecognitionComponent).getPackageName() : ""; + final String voiceInteractionServicePackageName = + voiceInteractionComponent != null ? ComponentName.unflattenFromString( + voiceInteractionComponent).getPackageName() : ""; + + return Objects.equals(packageName, voiceRecognitionServicePackageName) && Objects.equals( + voiceRecognitionServicePackageName, voiceInteractionServicePackageName); + } + /** * Do a quick check for whether an application might be able to perform an operation. * This is <em>not</em> a security check; you must use {@link #noteOp(String, int, String, diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 5379f3218a6e..2b2d9b55c46e 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -94,6 +94,7 @@ import android.app.AsyncNotedAppOp; import android.app.RuntimeAppOpAccessMessage; import android.app.SyncNotedAppOp; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -3015,6 +3016,25 @@ public class AppOpsService extends IAppOpsService.Stub { } } + private boolean isTrustedVoiceServiceProxy(String packageName, int code) { + if (code != OP_RECORD_AUDIO) { + return false; + } + final String voiceRecognitionComponent = Settings.Secure.getString( + mContext.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE); + final String voiceInteractionComponent = Settings.Secure.getString( + mContext.getContentResolver(), Settings.Secure.VOICE_INTERACTION_SERVICE); + + final String voiceRecognitionServicePackageName = + voiceRecognitionComponent != null ? ComponentName.unflattenFromString( + voiceRecognitionComponent).getPackageName() : ""; + final String voiceInteractionServicePackageName = + voiceInteractionComponent != null ? ComponentName.unflattenFromString( + voiceInteractionComponent).getPackageName() : ""; + return Objects.equals(packageName, voiceRecognitionServicePackageName) && Objects.equals( + voiceRecognitionServicePackageName, voiceInteractionServicePackageName); + } + @Override public int noteProxyOperation(int code, int proxiedUid, String proxiedPackageName, String proxiedAttributionTag, int proxyUid, String proxyPackageName, @@ -3030,9 +3050,12 @@ public class AppOpsService extends IAppOpsService.Stub { return AppOpsManager.MODE_IGNORED; } + // This is a workaround for R QPR, new API change is not allowed. We only allow the current + // voice recognizer is also the voice interactor to noteproxy op. + final boolean isTrustVoiceServiceProxy = isTrustedVoiceServiceProxy(proxyPackageName, code); final boolean isProxyTrusted = mContext.checkPermission( Manifest.permission.UPDATE_APP_OPS_STATS, -1, proxyUid) - == PackageManager.PERMISSION_GRANTED; + == PackageManager.PERMISSION_GRANTED || isTrustVoiceServiceProxy; final int proxyFlags = isProxyTrusted ? AppOpsManager.OP_FLAG_TRUSTED_PROXY : AppOpsManager.OP_FLAG_UNTRUSTED_PROXY; @@ -3494,9 +3517,12 @@ public class AppOpsService extends IAppOpsService.Stub { return AppOpsManager.MODE_IGNORED; } + // This is a workaround for R QPR, new API change is not allowed. We only allow the current + // voice recognizer is also the voice interactor to noteproxy op. + final boolean isTrustVoiceServiceProxy = isTrustedVoiceServiceProxy(proxyPackageName, code); final boolean isProxyTrusted = mContext.checkPermission( Manifest.permission.UPDATE_APP_OPS_STATS, -1, proxyUid) - == PackageManager.PERMISSION_GRANTED; + == PackageManager.PERMISSION_GRANTED || isTrustVoiceServiceProxy; final int proxyFlags = isProxyTrusted ? AppOpsManager.OP_FLAG_TRUSTED_PROXY : AppOpsManager.OP_FLAG_UNTRUSTED_PROXY; |