diff options
14 files changed, 86 insertions, 54 deletions
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index 6d43ddf7fe94..44fe6671e0da 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -2269,7 +2269,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 37c5213e0359..c83615073394 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 3bebc94fe0ed..fe3e37b6d02d 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 @@ -163,7 +163,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(); } @@ -171,7 +171,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; @@ -182,7 +182,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); @@ -201,7 +201,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; @@ -212,7 +212,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; @@ -237,7 +237,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; @@ -261,7 +261,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; @@ -286,7 +286,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; @@ -331,7 +331,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; @@ -361,7 +361,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; @@ -398,7 +398,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; @@ -429,7 +429,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; @@ -466,7 +466,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; @@ -498,7 +498,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; @@ -528,7 +528,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; @@ -557,7 +557,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; @@ -579,7 +579,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; @@ -597,7 +597,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; @@ -614,7 +614,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 f8a068c7f121..444d5eed95f7 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; @@ -105,8 +106,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, Optional.of(100) /* keyphraseId */); @@ -120,8 +122,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, Optional.of(100) /* keyphraseId */); @@ -141,8 +144,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, Optional.of(100) /* keyphraseId */); @@ -158,8 +162,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, Optional.empty() /* keyphraseId */); diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 913535e06a21..30ea127eca6b 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -266,6 +266,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(); @@ -288,7 +292,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) ); @@ -1667,7 +1671,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( @@ -1676,7 +1681,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 0e796d1afbd6..c6a8c470bd95 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java @@ -137,22 +137,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 00cedd77414e..2247d67ef84f 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) { @@ -348,7 +351,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 91e546696971..902f10f66a48 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java @@ -104,17 +104,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 15c9ba923d3a..c2f2939f0b96 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..f2824683837a 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -408,7 +408,7 @@ public class VoiceInteractionManagerService extends SystemService { try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect( originatorIdentity)) { session = new SoundTriggerSession(mSoundTriggerInternal.attach(client, - moduleProperties)); + moduleProperties, false)); } } return new SoundTriggerSessionBinderProxy(session); @@ -423,7 +423,7 @@ public class VoiceInteractionManagerService extends SystemService { return Binder.withCleanCallingIdentity(() -> { try (SafeCloseable ignored = IdentityContext.create(identity)) { return new SoundTriggerSession( - mSoundTriggerInternal.attach(client, moduleProperties)); + mSoundTriggerInternal.attach(client, moduleProperties, false)); } }); } |