summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Atneya Nair <atneya@google.com> 2023-05-05 16:45:33 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-05-05 16:45:33 +0000
commit8fc7d8d1abbd1a47b2221f535738dea596d4d98f (patch)
tree5d33541dc7bd55f7f827a8e4bfec0711d285be93
parent2f80e5e175ae7da6a2e3f5920b3e3d0a02f9cbc0 (diff)
parent62b2bbe5ffd8d62fa0456f4b36ecf24d472c7fd4 (diff)
Merge changes from topic "hds_identity" into udc-dev
* changes: Remove voiceinteraction identity fabrication Plumb trusted config through soundtrigger stack
-rw-r--r--core/java/android/hardware/soundtrigger/SoundTrigger.java2
-rw-r--r--core/java/android/hardware/soundtrigger/SoundTriggerModule.java6
-rw-r--r--media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl6
-rw-r--r--services/core/java/com/android/server/SoundTriggerInternal.java9
-rw-r--r--services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImplTest.java38
-rw-r--r--services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingLatencyTest.java21
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java11
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal.java5
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java3
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java8
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java17
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java6
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java4
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java60
14 files changed, 94 insertions, 102 deletions
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java
index 301b412e6ce2..bfff4dbdd627 100644
--- a/core/java/android/hardware/soundtrigger/SoundTrigger.java
+++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java
@@ -2306,7 +2306,7 @@ public class SoundTrigger {
Looper looper = handler != null ? handler.getLooper() : Looper.getMainLooper();
try {
return new SoundTriggerModule(getService(), moduleId, listener, looper,
- middlemanIdentity, originatorIdentity);
+ middlemanIdentity, originatorIdentity, false);
} catch (Exception e) {
Log.e(TAG, "", e);
return null;
diff --git a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
index 48d4ea40fecd..8813a17c504b 100644
--- a/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
+++ b/core/java/android/hardware/soundtrigger/SoundTriggerModule.java
@@ -83,7 +83,8 @@ public class SoundTriggerModule {
*/
public SoundTriggerModule(@NonNull ISoundTriggerMiddlewareService service,
int moduleId, @NonNull SoundTrigger.StatusListener listener, @NonNull Looper looper,
- @NonNull Identity middlemanIdentity, @NonNull Identity originatorIdentity) {
+ @NonNull Identity middlemanIdentity, @NonNull Identity originatorIdentity,
+ boolean isTrusted) {
mId = moduleId;
mEventHandlerDelegate = new EventHandlerDelegate(listener, looper);
@@ -91,7 +92,8 @@ public class SoundTriggerModule {
try (SafeCloseable ignored = ClearCallingIdentityContext.create()) {
mService = service.attachAsMiddleman(moduleId, middlemanIdentity,
originatorIdentity,
- mEventHandlerDelegate);
+ mEventHandlerDelegate,
+ isTrusted);
}
mService.asBinder().linkToDeath(mEventHandlerDelegate, 0);
} catch (RemoteException e) {
diff --git a/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl b/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl
index 531b3ae0c230..bc6a2591f386 100644
--- a/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl
+++ b/media/aidl/android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.aidl
@@ -80,14 +80,16 @@ interface ISoundTriggerMiddlewareService {
* This implies that the caller must clear its caller identity to protect from the case where
* it resides in the same process as the callee.
* - The identity of the entity on behalf of which module operations are to be performed.
- *
+ * @param isTrusted - {@code true} if the middleware should not audit data delivery, since the
+ * callback is being delivered to another trusted component which will audit access.
* listModules() must be called prior to calling this method and the provided handle must be
* one of the handles from the returned list.
*/
ISoundTriggerModule attachAsMiddleman(int handle,
in Identity middlemanIdentity,
in Identity originatorIdentity,
- ISoundTriggerCallback callback);
+ ISoundTriggerCallback callback,
+ boolean isTrusted);
/**
* Attach an injection interface interface to the ST mock HAL.
diff --git a/services/core/java/com/android/server/SoundTriggerInternal.java b/services/core/java/com/android/server/SoundTriggerInternal.java
index f184574c9a36..f8830ea705c6 100644
--- a/services/core/java/com/android/server/SoundTriggerInternal.java
+++ b/services/core/java/com/android/server/SoundTriggerInternal.java
@@ -47,7 +47,14 @@ public interface SoundTriggerInternal {
int STATUS_OK = SoundTrigger.STATUS_OK;
// Attach to a specific underlying STModule
- Session attach(@NonNull IBinder client, ModuleProperties underlyingModule);
+ /**
+ * Attach to a specific underlying STModule.
+ * @param client - Binder token representing the app client for death notifications
+ * @param underlyingModule - Properties of the underlying STModule to attach to
+ * @param isTrusted - {@code true} if callbacks will be appropriately AppOps attributed by
+ * a trusted component prior to delivery to the ultimate client.
+ */
+ Session attach(@NonNull IBinder client, ModuleProperties underlyingModule, boolean isTrusted);
// Enumerate possible STModules to attach to
List<ModuleProperties> listModuleProperties(Identity originatorIdentity);
diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImplTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImplTest.java
index 3d963ed4fe37..56bd1929b1d4 100644
--- a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImplTest.java
+++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImplTest.java
@@ -164,7 +164,7 @@ public class SoundTriggerMiddlewareImplTest {
public void testAttachDetach() throws Exception {
// Normal attachment / detachment.
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
assertNotNull(module);
module.detach();
}
@@ -172,7 +172,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testLoadUnloadModel() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
final int hwHandle = 7;
int handle = loadGenericModel(module, hwHandle).first;
@@ -183,7 +183,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testLoadPreemptModel() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
final int hwHandle = 7;
Pair<Integer, SoundTriggerHwCallback> loadResult = loadGenericModel(module, hwHandle);
@@ -202,7 +202,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testLoadUnloadPhraseModel() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
final int hwHandle = 73;
int handle = loadPhraseModel(module, hwHandle).first;
@@ -213,7 +213,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testStartStopRecognition() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 7;
@@ -233,7 +233,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testStartRecognitionBusy() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 7;
@@ -257,7 +257,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testStartStopPhraseRecognition() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 67;
@@ -277,7 +277,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testRecognition() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 7;
@@ -322,7 +322,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testPhraseRecognition() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 7;
@@ -352,7 +352,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testForceRecognition() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 17;
@@ -389,7 +389,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testForceRecognitionNotSupported() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 17;
@@ -420,7 +420,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testForcePhraseRecognition() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 17;
@@ -457,7 +457,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testForcePhraseRecognitionNotSupported() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 17;
@@ -489,7 +489,7 @@ public class SoundTriggerMiddlewareImplTest {
public void testAbortRecognition() throws Exception {
// Make sure the HAL doesn't support concurrent capture.
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 11;
@@ -521,7 +521,7 @@ public class SoundTriggerMiddlewareImplTest {
public void testAbortPhraseRecognition() throws Exception {
// Make sure the HAL doesn't support concurrent capture.
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
// Load the model.
final int hwHandle = 11;
@@ -552,7 +552,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testParameterSupported() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
final int hwHandle = 12;
int modelHandle = loadGenericModel(module, hwHandle).first;
@@ -574,7 +574,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testParameterNotSupported() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
final int hwHandle = 13;
int modelHandle = loadGenericModel(module, hwHandle).first;
@@ -592,7 +592,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testGetParameter() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
final int hwHandle = 14;
int modelHandle = loadGenericModel(module, hwHandle).first;
@@ -609,7 +609,7 @@ public class SoundTriggerMiddlewareImplTest {
@Test
public void testSetParameter() throws Exception {
ISoundTriggerCallback callback = createCallbackMock();
- ISoundTriggerModule module = mService.attach(0, callback);
+ ISoundTriggerModule module = mService.attach(0, callback, false);
final int hwHandle = 17;
int modelHandle = loadGenericModel(module, hwHandle).first;
diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingLatencyTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingLatencyTest.java
index cc357d76cb4a..385c28ae7152 100644
--- a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingLatencyTest.java
+++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingLatencyTest.java
@@ -20,6 +20,7 @@ import static com.android.internal.util.LatencyTracker.ACTION_SHOW_VOICE_INTERAC
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.verify;
@@ -101,8 +102,9 @@ public class SoundTriggerMiddlewareLoggingLatencyTest {
throws RemoteException {
ArgumentCaptor<ISoundTriggerCallback> soundTriggerCallbackCaptor = ArgumentCaptor.forClass(
ISoundTriggerCallback.class);
- mSoundTriggerMiddlewareLogging.attach(0, mISoundTriggerCallback);
- verify(mDelegateMiddleware).attach(anyInt(), soundTriggerCallbackCaptor.capture());
+ mSoundTriggerMiddlewareLogging.attach(0, mISoundTriggerCallback, false);
+ verify(mDelegateMiddleware).attach(anyInt(), soundTriggerCallbackCaptor.capture(),
+ anyBoolean());
triggerPhraseRecognitionEvent(soundTriggerCallbackCaptor.getValue(),
RecognitionStatus.SUCCESS, 100 /* keyphraseId */);
@@ -116,8 +118,9 @@ public class SoundTriggerMiddlewareLoggingLatencyTest {
public void testOnPhraseRecognitionRestartsActiveSession() throws RemoteException {
ArgumentCaptor<ISoundTriggerCallback> soundTriggerCallbackCaptor = ArgumentCaptor.forClass(
ISoundTriggerCallback.class);
- mSoundTriggerMiddlewareLogging.attach(0, mISoundTriggerCallback);
- verify(mDelegateMiddleware).attach(anyInt(), soundTriggerCallbackCaptor.capture());
+ mSoundTriggerMiddlewareLogging.attach(0, mISoundTriggerCallback, false);
+ verify(mDelegateMiddleware).attach(anyInt(), soundTriggerCallbackCaptor.capture(),
+ anyBoolean());
triggerPhraseRecognitionEvent(soundTriggerCallbackCaptor.getValue(),
RecognitionStatus.SUCCESS, 100 /* keyphraseId */);
@@ -137,8 +140,9 @@ public class SoundTriggerMiddlewareLoggingLatencyTest {
throws RemoteException {
ArgumentCaptor<ISoundTriggerCallback> soundTriggerCallbackCaptor = ArgumentCaptor.forClass(
ISoundTriggerCallback.class);
- mSoundTriggerMiddlewareLogging.attach(0, mISoundTriggerCallback);
- verify(mDelegateMiddleware).attach(anyInt(), soundTriggerCallbackCaptor.capture());
+ mSoundTriggerMiddlewareLogging.attach(0, mISoundTriggerCallback, false);
+ verify(mDelegateMiddleware).attach(anyInt(), soundTriggerCallbackCaptor.capture(),
+ anyBoolean());
triggerPhraseRecognitionEvent(soundTriggerCallbackCaptor.getValue(),
RecognitionStatus.ABORTED, 100 /* keyphraseId */);
@@ -154,8 +158,9 @@ public class SoundTriggerMiddlewareLoggingLatencyTest {
throws RemoteException {
ArgumentCaptor<ISoundTriggerCallback> soundTriggerCallbackCaptor = ArgumentCaptor.forClass(
ISoundTriggerCallback.class);
- mSoundTriggerMiddlewareLogging.attach(0, mISoundTriggerCallback);
- verify(mDelegateMiddleware).attach(anyInt(), soundTriggerCallbackCaptor.capture());
+ mSoundTriggerMiddlewareLogging.attach(0, mISoundTriggerCallback, false);
+ verify(mDelegateMiddleware).attach(anyInt(), soundTriggerCallbackCaptor.capture(),
+ anyBoolean());
triggerPhraseRecognitionEvent(soundTriggerCallbackCaptor.getValue(),
RecognitionStatus.SUCCESS);
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index 67320009e9aa..a67524887086 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -303,6 +303,10 @@ public class SoundTriggerService extends SystemService {
private SoundTriggerHelper newSoundTriggerHelper(
ModuleProperties moduleProperties, EventLogger eventLogger) {
+ return newSoundTriggerHelper(moduleProperties, eventLogger, false);
+ }
+ private SoundTriggerHelper newSoundTriggerHelper(
+ ModuleProperties moduleProperties, EventLogger eventLogger, boolean isTrusted) {
Identity middlemanIdentity = new Identity();
middlemanIdentity.packageName = ActivityThread.currentOpPackageName();
@@ -325,7 +329,7 @@ public class SoundTriggerService extends SystemService {
eventLogger,
(SoundTrigger.StatusListener statusListener) -> new SoundTriggerModule(
mMiddlewareService, moduleId, statusListener,
- Looper.getMainLooper(), middlemanIdentity, originatorIdentity),
+ Looper.getMainLooper(), middlemanIdentity, originatorIdentity, isTrusted),
moduleId,
() -> listUnderlyingModuleProperties(originatorIdentity)
);
@@ -1724,7 +1728,8 @@ public class SoundTriggerService extends SystemService {
}
@Override
- public Session attach(@NonNull IBinder client, ModuleProperties underlyingModule) {
+ public Session attach(@NonNull IBinder client, ModuleProperties underlyingModule,
+ boolean isTrusted) {
var identity = IdentityContext.getNonNull();
int sessionId = mSessionIdCounter.getAndIncrement();
mServiceEventLogger.enqueue(new ServiceEvent(
@@ -1733,7 +1738,7 @@ public class SoundTriggerService extends SystemService {
"LocalSoundTriggerEventLogger for package: " +
identity.packageName + "#" + sessionId);
- return new SessionImpl(newSoundTriggerHelper(underlyingModule, eventLogger),
+ return new SessionImpl(newSoundTriggerHelper(underlyingModule, eventLogger, isTrusted),
client, eventLogger, identity);
}
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal.java
index 60f89da8e4d3..ca35b5188515 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ISoundTriggerMiddlewareInternal.java
@@ -38,7 +38,10 @@ public interface ISoundTriggerMiddlewareInternal {
*
* listModules() must be called prior to calling this method and the provided handle must be
* one of the handles from the returned list.
+ * @param isTrusted - {@code true} if this service should not note AppOps for recognitions,
+ * and should delegate these checks to the **trusted** client.
*/
public ISoundTriggerModule attach(int handle,
- ISoundTriggerCallback callback);
+ ISoundTriggerCallback callback,
+ boolean isTrusted);
}
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java
index c8c0f3d00cbf..3b800de2f30b 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl.java
@@ -116,7 +116,8 @@ public class SoundTriggerMiddlewareImpl implements ISoundTriggerMiddlewareIntern
@Override
public @NonNull
- ISoundTriggerModule attach(int handle, @NonNull ISoundTriggerCallback callback) {
+ ISoundTriggerModule attach(int handle, @NonNull ISoundTriggerCallback callback,
+ boolean isTrusted) {
return mModules[handle].attach(callback);
}
}
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
index ecd65ae9fa2f..e3366f8e994b 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java
@@ -149,22 +149,22 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt
@Override
public @NonNull
- ISoundTriggerModule attach(int handle, ISoundTriggerCallback callback) {
+ ISoundTriggerModule attach(int handle, ISoundTriggerCallback callback, boolean isTrusted) {
try {
var originatorIdentity = IdentityContext.getNonNull();
String packageIdentification = originatorIdentity.packageName
- + mSessionCount.getAndIncrement();
+ + mSessionCount.getAndIncrement() + (isTrusted ? "trusted" : "");
ModuleLogging result = new ModuleLogging();
var eventLogger = new EventLogger(SESSION_MAX_EVENT_SIZE,
"Session logger for: " + packageIdentification);
var callbackWrapper = new CallbackLogging(callback, eventLogger, originatorIdentity);
- result.attach(mDelegate.attach(handle, callbackWrapper), eventLogger);
+ result.attach(mDelegate.attach(handle, callbackWrapper, isTrusted), eventLogger);
mServiceEventLogger.enqueue(ServiceEvent.createForReturn(
ServiceEvent.Type.ATTACH,
- packageIdentification, result, handle, callback)
+ packageIdentification, result, handle, callback, isTrusted)
.printLog(ALOGI, TAG));
mSessionEventLoggers.add(eventLogger);
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java
index 6b724de73488..2e641a26e9b4 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewarePermission.java
@@ -85,11 +85,11 @@ public class SoundTriggerMiddlewarePermission implements ISoundTriggerMiddleware
@Override
public @NonNull
ISoundTriggerModule attach(int handle,
- @NonNull ISoundTriggerCallback callback) {
+ @NonNull ISoundTriggerCallback callback, boolean isTrusted) {
Identity identity = getIdentity();
enforcePermissionsForPreflight(identity);
- ModuleWrapper wrapper = new ModuleWrapper(identity, callback);
- return wrapper.attach(mDelegate.attach(handle, wrapper.getCallbackWrapper()));
+ ModuleWrapper wrapper = new ModuleWrapper(identity, callback, isTrusted);
+ return wrapper.attach(mDelegate.attach(handle, wrapper.getCallbackWrapper(), isTrusted));
}
// Override toString() in order to have the delegate's ID in it.
@@ -204,11 +204,14 @@ public class SoundTriggerMiddlewarePermission implements ISoundTriggerMiddleware
private ISoundTriggerModule mDelegate;
private final @NonNull Identity mOriginatorIdentity;
private final @NonNull CallbackWrapper mCallbackWrapper;
+ private final boolean mIsTrusted;
ModuleWrapper(@NonNull Identity originatorIdentity,
- @NonNull ISoundTriggerCallback callback) {
+ @NonNull ISoundTriggerCallback callback,
+ boolean isTrusted) {
mOriginatorIdentity = originatorIdentity;
mCallbackWrapper = new CallbackWrapper(callback);
+ mIsTrusted = isTrusted;
}
ModuleWrapper attach(@NonNull ISoundTriggerModule delegate) {
@@ -347,7 +350,11 @@ public class SoundTriggerMiddlewarePermission implements ISoundTriggerMiddleware
}
private void enforcePermissions(String reason) {
- enforcePermissionsForDataDelivery(mOriginatorIdentity, reason);
+ if (mIsTrusted) {
+ enforcePermissionsForPreflight(mOriginatorIdentity);
+ } else {
+ enforcePermissionsForDataDelivery(mOriginatorIdentity, reason);
+ }
}
}
}
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java
index 1558acf547d1..9de24383ba75 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java
@@ -105,17 +105,17 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic
public ISoundTriggerModule attachAsOriginator(int handle, Identity identity,
ISoundTriggerCallback callback) {
try (SafeCloseable ignored = establishIdentityDirect(Objects.requireNonNull(identity))) {
- return new ModuleService(mDelegate.attach(handle, callback));
+ return new ModuleService(mDelegate.attach(handle, callback, /* isTrusted= */ false));
}
}
@Override
public ISoundTriggerModule attachAsMiddleman(int handle, Identity middlemanIdentity,
- Identity originatorIdentity, ISoundTriggerCallback callback) {
+ Identity originatorIdentity, ISoundTriggerCallback callback, boolean isTrusted) {
try (SafeCloseable ignored = establishIdentityIndirect(
Objects.requireNonNull(middlemanIdentity),
Objects.requireNonNull(originatorIdentity))) {
- return new ModuleService(mDelegate.attach(handle, callback));
+ return new ModuleService(mDelegate.attach(handle, callback, isTrusted));
}
}
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java
index 2924c124f22e..31fab89d1d4e 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareValidation.java
@@ -191,7 +191,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware
@Override
public @NonNull ISoundTriggerModule attach(int handle,
- @NonNull ISoundTriggerCallback callback) {
+ @NonNull ISoundTriggerCallback callback, boolean isTrusted) {
// Input validation.
Objects.requireNonNull(callback);
Objects.requireNonNull(callback.asBinder());
@@ -209,7 +209,7 @@ public class SoundTriggerMiddlewareValidation implements ISoundTriggerMiddleware
// From here on, every exception isn't client's fault.
try {
Session session = new Session(handle, callback);
- session.attach(mDelegate.attach(handle, session.getCallbackWrapper()));
+ session.attach(mDelegate.attach(handle, session.getCallbackWrapper(), isTrusted));
return session;
} catch (Exception e) {
throw handleException(e);
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 27f3fb3898ee..423a81ac0523 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -381,51 +381,21 @@ public class VoiceInteractionManagerService extends SystemService {
@NonNull Identity originatorIdentity, IBinder client,
ModuleProperties moduleProperties) {
Objects.requireNonNull(originatorIdentity);
- boolean forHotwordDetectionService;
+ boolean forHotwordDetectionService = false;
synchronized (VoiceInteractionManagerServiceStub.this) {
enforceIsCurrentVoiceInteractionService();
forHotwordDetectionService =
mImpl != null && mImpl.mHotwordDetectionConnection != null;
}
- IVoiceInteractionSoundTriggerSession session;
- if (forHotwordDetectionService) {
- // Use our own identity and handle the permission checks ourselves. This allows
- // properly checking/noting against the voice interactor or hotword detection
- // service as needed.
- if (HotwordDetectionConnection.DEBUG) {
- Slog.d(TAG, "Creating a SoundTriggerSession for a HotwordDetectionService");
- }
- originatorIdentity.uid = Binder.getCallingUid();
- originatorIdentity.pid = Binder.getCallingPid();
- session = new SoundTriggerSessionPermissionsDecorator(
- createSoundTriggerSessionForSelfIdentity(client, moduleProperties),
- mContext,
- originatorIdentity);
- } else {
- if (HotwordDetectionConnection.DEBUG) {
- Slog.d(TAG, "Creating a SoundTriggerSession");
- }
- try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
- originatorIdentity)) {
- session = new SoundTriggerSession(mSoundTriggerInternal.attach(client,
- moduleProperties));
- }
+ if (HotwordDetectionConnection.DEBUG) {
+ Slog.d(TAG, "Creating a SoundTriggerSession, for HDS: "
+ + forHotwordDetectionService);
+ }
+ try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect(
+ originatorIdentity)) {
+ return new SoundTriggerSession(mSoundTriggerInternal.attach(client,
+ moduleProperties, forHotwordDetectionService));
}
- return new SoundTriggerSessionBinderProxy(session);
- }
-
- private IVoiceInteractionSoundTriggerSession createSoundTriggerSessionForSelfIdentity(
- IBinder client, ModuleProperties moduleProperties) {
- Identity identity = new Identity();
- identity.uid = Process.myUid();
- identity.pid = Process.myPid();
- identity.packageName = ActivityThread.currentOpPackageName();
- return Binder.withCleanCallingIdentity(() -> {
- try (SafeCloseable ignored = IdentityContext.create(identity)) {
- return new SoundTriggerSession(
- mSoundTriggerInternal.attach(client, moduleProperties));
- }
- });
}
@Override
@@ -1700,11 +1670,7 @@ public class VoiceInteractionManagerService extends SystemService {
return null;
}
- /**
- * Implementation of SoundTriggerSession. Does not implement {@link #asBinder()} as it's
- * intended to be wrapped by an {@link IVoiceInteractionSoundTriggerSession.Stub} object.
- */
- private class SoundTriggerSession implements IVoiceInteractionSoundTriggerSession {
+ private class SoundTriggerSession extends IVoiceInteractionSoundTriggerSession.Stub {
final SoundTriggerInternal.Session mSession;
private IHotwordRecognitionStatusCallback mSessionExternalCallback;
private IRecognitionStatusCallback mSessionInternalCallback;
@@ -1851,12 +1817,6 @@ public class VoiceInteractionManagerService extends SystemService {
}
@Override
- public IBinder asBinder() {
- throw new UnsupportedOperationException(
- "This object isn't intended to be used as a Binder.");
- }
-
- @Override
public void detach() {
mSession.detach();
}