You've already forked Arcturus-Morningstar-Extended
mirror of
https://github.com/duckietm/Arcturus-Morningstar-Extended.git
synced 2026-06-19 15:06:19 +00:00
Merge pull request #233 from simoleo89/fix/permissions-inputs
fix(permissions): fail closed on stale ranks
This commit is contained in:
@@ -11,6 +11,10 @@ public enum PermissionSetting {
|
|||||||
ROOM_OWNER;
|
ROOM_OWNER;
|
||||||
|
|
||||||
public static PermissionSetting fromString(String value) {
|
public static PermissionSetting fromString(String value) {
|
||||||
|
if (value == null) {
|
||||||
|
return DISALLOWED;
|
||||||
|
}
|
||||||
|
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case "1":
|
case "1":
|
||||||
return ALLOWED;
|
return ALLOWED;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -65,35 +66,45 @@ public class PermissionsManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void loadPermissionsLegacy(Connection connection) throws SQLException {
|
private void loadPermissionsLegacy(Connection connection) throws SQLException {
|
||||||
|
Set<Integer> loadedRankIds = new HashSet<>();
|
||||||
|
|
||||||
try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM permissions ORDER BY id ASC")) {
|
try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM permissions ORDER BY id ASC")) {
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
|
int rankId = set.getInt("id");
|
||||||
|
loadedRankIds.add(rankId);
|
||||||
|
|
||||||
Rank rank = null;
|
Rank rank = null;
|
||||||
if (!this.ranks.containsKey(set.getInt("id"))) {
|
if (!this.ranks.containsKey(rankId)) {
|
||||||
rank = new Rank(set);
|
rank = new Rank(set);
|
||||||
this.ranks.put(set.getInt("id"), rank);
|
this.ranks.put(rankId, rank);
|
||||||
} else {
|
} else {
|
||||||
rank = this.ranks.get(set.getInt("id"));
|
rank = this.ranks.get(rankId);
|
||||||
rank.load(set);
|
rank.load(set);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addBadgeMapping(rank);
|
this.addBadgeMapping(rank);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.pruneMissingRanks(loadedRankIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean loadPermissionsNormalized(Connection connection) throws SQLException {
|
private boolean loadPermissionsNormalized(Connection connection) throws SQLException {
|
||||||
boolean hasRanks = false;
|
boolean hasRanks = false;
|
||||||
List<Rank> loadedRanks = new ArrayList<>();
|
List<Rank> loadedRanks = new ArrayList<>();
|
||||||
|
Set<Integer> loadedRankIds = new HashSet<>();
|
||||||
|
|
||||||
try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM permission_ranks ORDER BY id ASC")) {
|
try (Statement statement = connection.createStatement(); ResultSet set = statement.executeQuery("SELECT * FROM permission_ranks ORDER BY id ASC")) {
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
hasRanks = true;
|
hasRanks = true;
|
||||||
|
int rankId = set.getInt("id");
|
||||||
|
loadedRankIds.add(rankId);
|
||||||
|
|
||||||
Rank rank = this.ranks.get(set.getInt("id"));
|
Rank rank = this.ranks.get(rankId);
|
||||||
|
|
||||||
if (rank == null) {
|
if (rank == null) {
|
||||||
rank = new Rank(set.getInt("id"));
|
rank = new Rank(rankId);
|
||||||
this.ranks.put(set.getInt("id"), rank);
|
this.ranks.put(rankId, rank);
|
||||||
}
|
}
|
||||||
|
|
||||||
rank.loadNormalizedMetadata(set);
|
rank.loadNormalizedMetadata(set);
|
||||||
@@ -141,9 +152,18 @@ public class PermissionsManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.pruneMissingRanks(loadedRankIds);
|
||||||
return hasDefinitions;
|
return hasDefinitions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void pruneMissingRanks(Set<Integer> loadedRankIds) {
|
||||||
|
for (int rankId : this.ranks.keys()) {
|
||||||
|
if (!loadedRankIds.contains(rankId)) {
|
||||||
|
this.ranks.remove(rankId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void ensureNormalizedRankColumns(Connection connection, List<Rank> loadedRanks) throws SQLException {
|
private void ensureNormalizedRankColumns(Connection connection, List<Rank> loadedRanks) throws SQLException {
|
||||||
Set<String> availableColumns = new HashSet<>();
|
Set<String> availableColumns = new HashSet<>();
|
||||||
|
|
||||||
@@ -254,6 +274,10 @@ public class PermissionsManager {
|
|||||||
|
|
||||||
|
|
||||||
public boolean hasPermission(Habbo habbo, String permission, boolean withRoomRights) {
|
public boolean hasPermission(Habbo habbo, String permission, boolean withRoomRights) {
|
||||||
|
if (habbo == null || habbo.getHabboInfo() == null || permission == null || permission.isBlank()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!this.hasPermission(habbo.getHabboInfo().getRank(), permission, withRoomRights)) {
|
if (!this.hasPermission(habbo.getHabboInfo().getRank(), permission, withRoomRights)) {
|
||||||
for (HabboPlugin plugin : Emulator.getPluginManager().getPlugins()) {
|
for (HabboPlugin plugin : Emulator.getPluginManager().getPlugins()) {
|
||||||
if (plugin.hasPermission(habbo, permission)) {
|
if (plugin.hasPermission(habbo, permission)) {
|
||||||
@@ -269,15 +293,16 @@ public class PermissionsManager {
|
|||||||
|
|
||||||
|
|
||||||
public boolean hasPermission(Rank rank, String permission, boolean withRoomRights) {
|
public boolean hasPermission(Rank rank, String permission, boolean withRoomRights) {
|
||||||
return rank.hasPermission(permission, withRoomRights);
|
return rank != null && permission != null && !permission.isBlank() && rank.hasPermission(permission, withRoomRights);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<String> getStaffBadges() {
|
public Set<String> getStaffBadges() {
|
||||||
return this.badges.keySet();
|
return Collections.unmodifiableSet(new HashSet<>(this.badges.keySet()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Rank> getRanksByBadgeCode(String code) {
|
public List<Rank> getRanksByBadgeCode(String code) {
|
||||||
return this.badges.get(code);
|
List<Rank> ranks = this.badges.get(code);
|
||||||
|
return ranks == null ? Collections.emptyList() : Collections.unmodifiableList(new ArrayList<>(ranks));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Rank> getAllRanks() {
|
public List<Rank> getAllRanks() {
|
||||||
|
|||||||
@@ -114,6 +114,10 @@ public class Rank {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasPermission(String key, boolean isRoomOwner) {
|
public boolean hasPermission(String key, boolean isRoomOwner) {
|
||||||
|
if (key == null || key.isBlank()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.permissions.containsKey(key)) {
|
if (this.permissions.containsKey(key)) {
|
||||||
Permission permission = this.permissions.get(key);
|
Permission permission = this.permissions.get(key);
|
||||||
|
|
||||||
|
|||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
package com.eu.habbo.habbohotel.permissions;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class PermissionSettingContractTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void unknownPermissionValuesFailClosed() {
|
||||||
|
assertEquals(PermissionSetting.DISALLOWED, PermissionSetting.fromString(null));
|
||||||
|
assertEquals(PermissionSetting.DISALLOWED, PermissionSetting.fromString(""));
|
||||||
|
assertEquals(PermissionSetting.DISALLOWED, PermissionSetting.fromString("999"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void knownPermissionValuesMapToExplicitSettings() {
|
||||||
|
assertEquals(PermissionSetting.ALLOWED, PermissionSetting.fromString("1"));
|
||||||
|
assertEquals(PermissionSetting.ROOM_OWNER, PermissionSetting.fromString("2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
package com.eu.habbo.habbohotel.permissions;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class RankPermissionContractTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void missingPermissionsFailClosed() {
|
||||||
|
Rank rank = new Rank(1);
|
||||||
|
|
||||||
|
assertFalse(rank.hasPermission(null, false));
|
||||||
|
assertFalse(rank.hasPermission("", false));
|
||||||
|
assertFalse(rank.hasPermission("acc_supporttool", false));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void roomOwnerPermissionOnlyPassesWithRoomRights() {
|
||||||
|
Rank rank = new Rank(1);
|
||||||
|
rank.setPermission("acc_placefurni", PermissionSetting.ROOM_OWNER);
|
||||||
|
|
||||||
|
assertFalse(rank.hasPermission("acc_placefurni", false));
|
||||||
|
assertTrue(rank.hasPermission("acc_placefurni", true));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void allowedPermissionPassesWithoutRoomRights() {
|
||||||
|
Rank rank = new Rank(1);
|
||||||
|
rank.setPermission("acc_supporttool", PermissionSetting.ALLOWED);
|
||||||
|
|
||||||
|
assertTrue(rank.hasPermission("acc_supporttool", false));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user