Add a limit on channel group creation
Same as exists for channels
This is a backport of the fix in ag/16659457, including the adjustment from ag/20920023 (changed the max value from 50000 to 6000).
Test: PreferencesHelperTest
Bug: 210114537
Bug: 261723753
Change-Id: Ic27efba4c54e22eebca16fc948879e652df4467b
(cherry picked from commit 37b3549807 & I3f3a99765c161369e1b026686a0e5f0c83ed839e)
Merged-In: I3f3a99765c161369e1b026686a0e5f0c83ed839e
Merged-In: Ic27efba4c54e22eebca16fc948879e652df4467b
This commit is contained in:
committed by
Ioana Alexandru
parent
aec76152d6
commit
0f29716ab6
@@ -90,7 +90,9 @@ public class PreferencesHelper implements RankingConfig {
|
|||||||
private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":";
|
private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":";
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 50000;
|
static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000;
|
||||||
|
@VisibleForTesting
|
||||||
|
static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 6000;
|
||||||
|
|
||||||
private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000;
|
private static final int NOTIFICATION_PREFERENCES_PULL_LIMIT = 1000;
|
||||||
private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000;
|
private static final int NOTIFICATION_CHANNEL_PULL_LIMIT = 2000;
|
||||||
@@ -230,6 +232,7 @@ public class PreferencesHelper implements RankingConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
boolean skipWarningLogged = false;
|
boolean skipWarningLogged = false;
|
||||||
|
boolean skipGroupWarningLogged = false;
|
||||||
boolean hasSAWPermission = false;
|
boolean hasSAWPermission = false;
|
||||||
if (upgradeForBubbles && uid != UNKNOWN_UID) {
|
if (upgradeForBubbles && uid != UNKNOWN_UID) {
|
||||||
hasSAWPermission = mAppOps.noteOpNoThrow(
|
hasSAWPermission = mAppOps.noteOpNoThrow(
|
||||||
@@ -280,6 +283,14 @@ public class PreferencesHelper implements RankingConfig {
|
|||||||
String tagName = parser.getName();
|
String tagName = parser.getName();
|
||||||
// Channel groups
|
// Channel groups
|
||||||
if (TAG_GROUP.equals(tagName)) {
|
if (TAG_GROUP.equals(tagName)) {
|
||||||
|
if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) {
|
||||||
|
if (!skipGroupWarningLogged) {
|
||||||
|
Slog.w(TAG, "Skipping further groups for " + r.pkg
|
||||||
|
+ "; app has too many");
|
||||||
|
skipGroupWarningLogged = true;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
String id = parser.getAttributeValue(null, ATT_ID);
|
String id = parser.getAttributeValue(null, ATT_ID);
|
||||||
CharSequence groupName = parser.getAttributeValue(null,
|
CharSequence groupName = parser.getAttributeValue(null,
|
||||||
ATT_NAME);
|
ATT_NAME);
|
||||||
@@ -761,6 +772,9 @@ public class PreferencesHelper implements RankingConfig {
|
|||||||
}
|
}
|
||||||
if (fromTargetApp) {
|
if (fromTargetApp) {
|
||||||
group.setBlocked(false);
|
group.setBlocked(false);
|
||||||
|
if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) {
|
||||||
|
throw new IllegalStateException("Limit exceed; cannot create more groups");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
final NotificationChannelGroup oldGroup = r.groups.get(group.getId());
|
final NotificationChannelGroup oldGroup = r.groups.get(group.getId());
|
||||||
if (oldGroup != null) {
|
if (oldGroup != null) {
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.IS
|
|||||||
import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER;
|
import static com.android.os.AtomsProto.PackageNotificationChannelPreferences.UID_FIELD_NUMBER;
|
||||||
import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE;
|
import static com.android.server.notification.PreferencesHelper.DEFAULT_BUBBLE_PREFERENCE;
|
||||||
import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT;
|
import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT;
|
||||||
|
import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT;
|
||||||
import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID;
|
import static com.android.server.notification.PreferencesHelper.UNKNOWN_UID;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@@ -2983,6 +2984,52 @@ public class PreferencesHelperTest extends UiServiceTestCase {
|
|||||||
assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true));
|
assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTooManyGroups() {
|
||||||
|
for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) {
|
||||||
|
NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i),
|
||||||
|
String.valueOf(i));
|
||||||
|
mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
NotificationChannelGroup group = new NotificationChannelGroup(
|
||||||
|
String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT),
|
||||||
|
String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT));
|
||||||
|
mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true);
|
||||||
|
fail("Allowed to create too many notification channel groups");
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
// great
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTooManyGroups_xml() throws Exception {
|
||||||
|
String extraGroup = "EXTRA";
|
||||||
|
String extraGroup1 = "EXTRA1";
|
||||||
|
|
||||||
|
// create first... many... directly so we don't need a big xml blob in this test
|
||||||
|
for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) {
|
||||||
|
NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i),
|
||||||
|
String.valueOf(i));
|
||||||
|
mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
final String xml = "<ranking version=\"1\">\n"
|
||||||
|
+ "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n"
|
||||||
|
+ "<channelGroup id=\"" + extraGroup + "\" name=\"hi\"/>"
|
||||||
|
+ "<channelGroup id=\"" + extraGroup1 + "\" name=\"hi2\"/>"
|
||||||
|
+ "</package>"
|
||||||
|
+ "</ranking>";
|
||||||
|
XmlPullParser parser = Xml.newPullParser();
|
||||||
|
parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())),
|
||||||
|
null);
|
||||||
|
parser.nextTag();
|
||||||
|
mHelper.readXml(parser, false, UserHandle.USER_ALL);
|
||||||
|
|
||||||
|
assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O));
|
||||||
|
assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRestoreMultiUser() throws Exception {
|
public void testRestoreMultiUser() throws Exception {
|
||||||
String pkg = "restore_pkg";
|
String pkg = "restore_pkg";
|
||||||
|
|||||||
Reference in New Issue
Block a user