Offer the server groups we have the power for, not only those needing none

canToggleGroup compared a group's needed member add/remove power with our own
i_group_needed_member_*_power, which the server never reports for us: our
power is i_group_member_add_power and i_group_member_remove_power. An admin
was only ever offered groups that need no power at all.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-30 22:21:43 +00:00
parent b1ad403fdf
commit b678805c37
2 changed files with 7 additions and 7 deletions

View File

@@ -147,7 +147,7 @@ public final class ServerModel {
/** /**
* The local client's resolved value for a named permission (e.g. * The local client's resolved value for a named permission (e.g.
* {@code "i_group_needed_member_add_power"}), or {@code 0} if it isn't known * {@code "i_group_member_add_power"}), or {@code 0} if it isn't known
* yet (the {@code permissionlist} request is still in flight, or the server * yet (the {@code permissionlist} request is still in flight, or the server
* never reported a non-default value for it). * never reported a non-default value for it).
*/ */
@@ -175,9 +175,9 @@ public final class ServerModel {
* unlimited power can only be touched by a local client that has it. * unlimited power can only be touched by a local client that has it.
*/ */
public synchronized boolean canToggleGroup(Group group, boolean assigned) { public synchronized boolean canToggleGroup(Group group, boolean assigned) {
return hasPower(group.neededMemberAddPower, selfPermissionValue("i_group_needed_member_add_power")) return hasPower(group.neededMemberAddPower, selfPermissionValue("i_group_member_add_power"))
&& (!assigned || hasPower(group.neededMemberRemovePower, && (!assigned || hasPower(group.neededMemberRemovePower,
selfPermissionValue("i_group_needed_member_remove_power"))); selfPermissionValue("i_group_member_remove_power")));
} }
private static boolean hasPower(int needed, int own) { private static boolean hasPower(int needed, int own) {

View File

@@ -26,8 +26,8 @@ class ServerModelRulesTest {
@Test @Test
void groupNeedsEnoughAddPowerAndRemovePowerToTakeAway() { void groupNeedsEnoughAddPowerAndRemovePowerToTakeAway() {
grant("i_group_needed_member_add_power", 50); grant("i_group_member_add_power", 50);
grant("i_group_needed_member_remove_power", 20); grant("i_group_member_remove_power", 20);
assertTrue(model.canToggleGroup(group(50, 0), false)); assertTrue(model.canToggleGroup(group(50, 0), false));
assertFalse(model.canToggleGroup(group(51, 0), false)); assertFalse(model.canToggleGroup(group(51, 0), false));
@@ -37,8 +37,8 @@ class ServerModelRulesTest {
@Test @Test
void unlimitedPowerIsMinusOneOnEitherSide() { void unlimitedPowerIsMinusOneOnEitherSide() {
grant("i_group_needed_member_add_power", 75); grant("i_group_member_add_power", 75);
grant("i_group_needed_member_remove_power", -1); grant("i_group_member_remove_power", -1);
assertFalse(model.canToggleGroup(group(-1, 0), false), "a group needing unlimited power"); assertFalse(model.canToggleGroup(group(-1, 0), false), "a group needing unlimited power");
assertTrue(model.canToggleGroup(group(75, 1000), true), "unlimited remove power"); assertTrue(model.canToggleGroup(group(75, 1000), true), "unlimited remove power");