Merge "Fix content capture not being usable from hotword detector." into sc-dev am: 78456de866
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15379071 Change-Id: Ic7db23b4c0c7a70b6fd79f3de9c5e2e0b5fd1045
This commit is contained in:
@@ -70,6 +70,7 @@ import android.provider.Settings;
|
|||||||
import android.service.contentcapture.ActivityEvent.ActivityEventType;
|
import android.service.contentcapture.ActivityEvent.ActivityEventType;
|
||||||
import android.service.contentcapture.IDataShareCallback;
|
import android.service.contentcapture.IDataShareCallback;
|
||||||
import android.service.contentcapture.IDataShareReadAdapter;
|
import android.service.contentcapture.IDataShareReadAdapter;
|
||||||
|
import android.service.voice.VoiceInteractionManagerInternal;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.LocalLog;
|
import android.util.LocalLog;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
@@ -302,6 +303,37 @@ public final class ContentCaptureManagerService extends
|
|||||||
|| super.isDisabledLocked(userId);
|
|| super.isDisabledLocked(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void assertCalledByPackageOwner(@NonNull String packageName) {
|
||||||
|
try {
|
||||||
|
super.assertCalledByPackageOwner(packageName);
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
final int callingUid = Binder.getCallingUid();
|
||||||
|
|
||||||
|
VoiceInteractionManagerInternal.HotwordDetectionServiceIdentity
|
||||||
|
hotwordDetectionServiceIdentity =
|
||||||
|
LocalServices.getService(VoiceInteractionManagerInternal.class)
|
||||||
|
.getHotwordDetectionServiceIdentity();
|
||||||
|
|
||||||
|
if (callingUid != hotwordDetectionServiceIdentity.getIsolatedUid()) {
|
||||||
|
super.assertCalledByPackageOwner(packageName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final String[] packages =
|
||||||
|
getContext()
|
||||||
|
.getPackageManager()
|
||||||
|
.getPackagesForUid(hotwordDetectionServiceIdentity.getOwnerUid());
|
||||||
|
if (packages != null) {
|
||||||
|
for (String candidate : packages) {
|
||||||
|
if (packageName.equals(candidate)) return; // Found it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isDisabledBySettingsLocked(@UserIdInt int userId) {
|
private boolean isDisabledBySettingsLocked(@UserIdInt int userId) {
|
||||||
return mDisabledBySettings != null && mDisabledBySettings.get(userId);
|
return mDisabledBySettings != null && mDisabledBySettings.get(userId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ import android.service.contentcapture.FlushMetrics;
|
|||||||
import android.service.contentcapture.IContentCaptureServiceCallback;
|
import android.service.contentcapture.IContentCaptureServiceCallback;
|
||||||
import android.service.contentcapture.IDataShareCallback;
|
import android.service.contentcapture.IDataShareCallback;
|
||||||
import android.service.contentcapture.SnapshotData;
|
import android.service.contentcapture.SnapshotData;
|
||||||
|
import android.service.voice.VoiceInteractionManagerInternal;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
@@ -415,12 +416,25 @@ final class ContentCapturePerUserService
|
|||||||
}
|
}
|
||||||
if (callingUid != packageUid && !LocalServices.getService(ActivityManagerInternal.class)
|
if (callingUid != packageUid && !LocalServices.getService(ActivityManagerInternal.class)
|
||||||
.hasRunningActivity(callingUid, packageName)) {
|
.hasRunningActivity(callingUid, packageName)) {
|
||||||
final String[] packages = pm.getPackagesForUid(callingUid);
|
|
||||||
final String callingPackage = packages != null ? packages[0] : "uid-" + callingUid;
|
|
||||||
Slog.w(TAG, "App (package=" + callingPackage + ", UID=" + callingUid
|
|
||||||
+ ") passed package (" + packageName + ") owned by UID " + packageUid);
|
|
||||||
|
|
||||||
throw new SecurityException("Invalid package: " + packageName);
|
VoiceInteractionManagerInternal.HotwordDetectionServiceIdentity
|
||||||
|
hotwordDetectionServiceIdentity =
|
||||||
|
LocalServices.getService(VoiceInteractionManagerInternal.class)
|
||||||
|
.getHotwordDetectionServiceIdentity();
|
||||||
|
|
||||||
|
boolean isHotwordDetectionServiceCall =
|
||||||
|
hotwordDetectionServiceIdentity != null
|
||||||
|
&& callingUid == hotwordDetectionServiceIdentity.getIsolatedUid()
|
||||||
|
&& packageUid == hotwordDetectionServiceIdentity.getOwnerUid();
|
||||||
|
|
||||||
|
if (!isHotwordDetectionServiceCall) {
|
||||||
|
final String[] packages = pm.getPackagesForUid(callingUid);
|
||||||
|
final String callingPackage = packages != null ? packages[0] : "uid-" + callingUid;
|
||||||
|
Slog.w(TAG, "App (package=" + callingPackage + ", UID=" + callingUid
|
||||||
|
+ ") passed package (" + packageName + ") owned by UID " + packageUid);
|
||||||
|
|
||||||
|
throw new SecurityException("Invalid package: " + packageName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -744,7 +744,7 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem
|
|||||||
*
|
*
|
||||||
* @throws SecurityException when it's not...
|
* @throws SecurityException when it's not...
|
||||||
*/
|
*/
|
||||||
protected final void assertCalledByPackageOwner(@NonNull String packageName) {
|
protected void assertCalledByPackageOwner(@NonNull String packageName) {
|
||||||
Objects.requireNonNull(packageName);
|
Objects.requireNonNull(packageName);
|
||||||
final int uid = Binder.getCallingUid();
|
final int uid = Binder.getCallingUid();
|
||||||
final String[] packages = getContext().getPackageManager().getPackagesForUid(uid);
|
final String[] packages = getContext().getPackageManager().getPackagesForUid(uid);
|
||||||
|
|||||||
Reference in New Issue
Block a user