Merge "Forbid granting access to NLSes with too-long component names" into rvc-dev am: 7e6c75ccb5

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23728043

Change-Id: I30e3aee591614bb9e98af9db85b51fc4f459a9d0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Matías Hernández
2023-06-29 16:25:28 +00:00
committed by Automerger Merge Worker
4 changed files with 44 additions and 1 deletions

View File

@@ -465,6 +465,12 @@ public class NotificationManager {
*/
public static final int BUBBLE_PREFERENCE_SELECTED = 2;
/**
* Maximum length of the component name of a registered NotificationListenerService.
* @hide
*/
public static int MAX_SERVICE_COMPONENT_NAME_LENGTH = 500;
@UnsupportedAppUsage
private static INotificationManager sService;

View File

@@ -4942,6 +4942,11 @@ public class NotificationManagerService extends SystemService {
boolean granted) {
Objects.requireNonNull(listener);
checkCallerIsSystemOrShell();
if (granted && listener.flattenToString().length()
> NotificationManager.MAX_SERVICE_COMPONENT_NAME_LENGTH) {
throw new IllegalArgumentException(
"Component name too long: " + listener.flattenToString());
}
final long identity = Binder.clearCallingIdentity();
try {
if (mAllowedManagedServicePackages.test(

View File

@@ -1045,7 +1045,11 @@ public class VrManagerService extends SystemService
for (ComponentName c : possibleServices) {
if (Objects.equals(c.getPackageName(), pkg)) {
nm.setNotificationListenerAccessGrantedForUser(c, userId, true);
try {
nm.setNotificationListenerAccessGrantedForUser(c, userId, true);
} catch (Exception e) {
Slog.w(TAG, "Could not grant NLS access to package " + pkg, e);
}
}
}
}

View File

@@ -3166,6 +3166,34 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
any(), anyInt(), anyBoolean(), anyBoolean());
}
@Test
public void testSetListenerAccessForUser_grantWithNameTooLong_throws() throws Exception {
UserHandle user = UserHandle.of(mContext.getUserId() + 10);
ComponentName c = new ComponentName("com.example.package",
com.google.common.base.Strings.repeat("Blah", 150));
try {
mBinderService.setNotificationListenerAccessGrantedForUser(c, user.getIdentifier(),
/* enabled= */ true);
fail("Should've thrown IllegalArgumentException");
} catch (IllegalArgumentException e) {
// Good!
}
}
@Test
public void testSetListenerAccessForUser_revokeWithNameTooLong_okay() throws Exception {
UserHandle user = UserHandle.of(mContext.getUserId() + 10);
ComponentName c = new ComponentName("com.example.package",
com.google.common.base.Strings.repeat("Blah", 150));
mBinderService.setNotificationListenerAccessGrantedForUser(
c, user.getIdentifier(), /* enabled= */ false);
verify(mListeners).setPackageOrComponentEnabled(
c.flattenToString(), user.getIdentifier(), true, /* enabled= */ false);
}
@Test
public void testSetAssistantAccessForUser() throws Exception {
UserHandle user = UserHandle.of(10);