Cache Permission Checks until reboot / relog

Signed-off-by: Jadon Fowler <j@jadon.io>
This commit is contained in:
Jadon Fowler 2019-04-14 21:15:53 -04:00
parent a302a74189
commit 251cc1dee9
No known key found for this signature in database
GPG Key ID: C7FF05F3C377725C
24 changed files with 173 additions and 52 deletions

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.blockbreak;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
@ -191,7 +192,7 @@ public class BlockBreakListener extends CheckListener {
// Destroying liquid blocks.
if (!cancelled && BlockProperties.isLiquid(block.getType())
&& !player.hasPermission(Permissions.BLOCKBREAK_BREAK_LIQUID)
&& !PermissionCache.hasPermission(player, Permissions.BLOCKBREAK_BREAK_LIQUID)
&& !NCPExemptionManager.isExempted(player, CheckType.BLOCKBREAK_BREAK, true)){
cancelled = true;
}

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.blockbreak;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
@ -117,7 +118,7 @@ public class FastBreak extends Check {
data.fastBreakVL *= 0.9D;
}
if ((data.debug) && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)) {
if ((data.debug) && PermissionCache.hasPermission(player, Permissions.ADMINISTRATION_DEBUG)) {
// General stats:
if (data.stats != null) {
data.stats.addStats(data.stats.getId(blockType+ "/u", true), elapsedTime);

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.blockbreak;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
@ -77,7 +78,7 @@ public class WrongBlock extends Check {
}
if (wrongBlock) {
if ((data.debug) && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)) {
if ((data.debug) && PermissionCache.hasPermission(player, Permissions.ADMINISTRATION_DEBUG)) {
player.sendMessage("WrongBlock failure with dist: " + dist);
}
data.wrongBlockVL.add(now, (float) (dist + 1) / 2f);

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.blockplace;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
@ -57,7 +58,7 @@ public class Against extends Check {
if (isInteractBlock && !BlockProperties.isAir(matAgainst) && ! BlockProperties.isLiquid(matAgainst)) {
// Block was placed against something (e.g. cactus), allow it.
}
else if (!player.hasPermission(Permissions.BLOCKPLACE_AGAINST_AIR)) {
else if (!PermissionCache.hasPermission(player, Permissions.BLOCKPLACE_AGAINST_AIR)) {
violation = true;
}
}
@ -65,7 +66,7 @@ public class Against extends Check {
// TODO: F_PLACE_AGAINST_WATER|LIQUID...
if ((placedMat != Material.WATER_LILY
|| !BlockProperties.isLiquid(block.getRelative(BlockFace.DOWN).getType()))
&& !player.hasPermission(Permissions.BLOCKPLACE_AGAINST_LIQUIDS)) {
&& !PermissionCache.hasPermission(player, Permissions.BLOCKPLACE_AGAINST_LIQUIDS)) {
violation = true;
}
}

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.blockplace;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
@ -371,7 +372,7 @@ public class BlockPlaceListener extends CheckListener {
}
// TODO: Add a check type for exemption?
if (!player.hasPermission(Permissions.BLOCKPLACE_BOATSANYWHERE)) {
if (!PermissionCache.hasPermission(player, Permissions.BLOCKPLACE_BOATSANYWHERE)) {
final Result previousUseBlock = event.useInteractedBlock();
event.setCancelled(true);
event.setUseItemInHand(Result.DENY);

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.fight;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.Check;
@ -60,7 +61,7 @@ public class FastHeal extends Check {
}
}
if (data.debug && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)){
if (data.debug && PermissionCache.hasPermission(player, Permissions.ADMINISTRATION_DEBUG)){
player.sendMessage("Regain health(SATIATED): " + (time - data.fastHealRefTime) + " ms "+ "(buffer=" + data.fastHealBuffer + ")" +" , cancel=" + cancel);
}

View File

@ -16,6 +16,7 @@ package fr.neatmonster.nocheatplus.checks.fight;
import java.util.Iterator;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Location;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
@ -192,7 +193,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
// damagedPlayer.getLocation(useLoc2);
// }
// Log.
if (data.debug && damagedPlayer.hasPermission(Permissions.ADMINISTRATION_DEBUG)) {
if (data.debug && PermissionCache.hasPermission(damagedPlayer, Permissions.ADMINISTRATION_DEBUG)) {
damagedPlayer.sendMessage("Attacked by " + player.getName() + ": inv=" + mcAccess.getHandle().getInvulnerableTicks(damagedPlayer) + " ndt=" + damagedPlayer.getNoDamageTicks());
}
// Check for self hit exploits (mind that projectiles are excluded from this.)
@ -292,7 +293,7 @@ public class FightListener extends CheckListener implements JoinLeaveListener{
cancelled = true;
}
if (!cancelled && player.isBlocking() && !player.hasPermission(Permissions.MOVING_SURVIVALFLY_BLOCKING)) {
if (!cancelled && player.isBlocking() && !PermissionCache.hasPermission(player, Permissions.MOVING_SURVIVALFLY_BLOCKING)) {
// TODO: Permission ?
cancelled = true;
}

View File

@ -15,6 +15,7 @@
package fr.neatmonster.nocheatplus.checks.fight;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.entity.EnderDragon;
@ -145,7 +146,7 @@ public class Reach extends Check {
data.reachMod = Math.min(1.0, data.reachMod + DYNAMIC_STEP);
}
if (data.debug && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)){
if (data.debug && PermissionCache.hasPermission(player, Permissions.ADMINISTRATION_DEBUG)){
player.sendMessage("NC+: Attack/reach " + damaged.getType()+ " height="+ StringUtil.fdec3.format(height) + " dist=" + StringUtil.fdec3.format(lenpRel) +" @" + StringUtil.fdec3.format(reachMod));
}
@ -283,7 +284,7 @@ public class Reach extends Check {
data.reachMod = Math.min(1.0, data.reachMod + DYNAMIC_STEP);
}
if (data.debug && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)){
if (data.debug && PermissionCache.hasPermission(player, Permissions.ADMINISTRATION_DEBUG)){
// TODO: Height: remember successful ITraceEntry
player.sendMessage("NC+: Attack/reach " + damaged.getType()+ (traceEntry == null ? "" : (" height=" + traceEntry.getBoxMarginVertical())) + " dist=" + StringUtil.fdec3.format(lenpRel) +" @" + StringUtil.fdec3.format(data.reachMod));
}

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.inventory;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryView;
@ -145,7 +146,7 @@ public class FastClick extends Check {
cancel = executeActions(vd).willCancel();
}
if (data.debug && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)){
if (data.debug && PermissionCache.hasPermission(player, Permissions.ADMINISTRATION_DEBUG)){
player.sendMessage("FastClick: " + data.fastClickFreq.bucketScore(0) + " | " + data.fastClickFreq.score(1f) + " | cursor=" + cursor + " | clicked=" + clicked);
}

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.inventory;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
@ -92,7 +93,7 @@ public class InstantBow extends Check {
}
}
if (data.debug && player.hasPermission(Permissions.ADMINISTRATION_DEBUG)) {
if (data.debug && PermissionCache.hasPermission(player, Permissions.ADMINISTRATION_DEBUG)) {
player.sendMessage(ChatColor.YELLOW + "NCP: " + ChatColor.GRAY + "Bow shot - force: " + force +", " + (cc.instantBowStrict || pullDuration < 2 * expectedPullDuration ? ("pull time: " + pullDuration) : "") + "(" + expectedPullDuration +")");
}

View File

@ -23,6 +23,7 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
@ -368,9 +369,6 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
*/
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onPlayerMove(final PlayerMoveEvent event) {
// don't process moves in the same block
if (TrigUtil.isSameBlock(event.getFrom(), event.getTo().getX(), event.getTo().getY(), event.getTo().getZ())) return;
counters.add(idMoveEvent, 1);
final Player player = event.getPlayer();
@ -666,7 +664,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
}
else if (cc.creativeFlyCheck
&& !NCPExemptionManager.isExempted(player, CheckType.MOVING_CREATIVEFLY, true)
&& !player.hasPermission(Permissions.MOVING_CREATIVEFLY)) {
&& !PermissionCache.hasPermission(player, Permissions.MOVING_CREATIVEFLY)) {
checkCf = true;
checkSf = false;
prepareCreativeFlyCheck(player, from, to, moveInfo, thisMove, multiMoveCount, tick, data, cc);
@ -774,7 +772,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
boolean mightSkipNoFall = false; // If to skip nofall check (mainly on violation of other checks).
if (newTo == null && cc.passableCheck && player.getGameMode() != BridgeMisc.GAME_MODE_SPECTATOR
&& !NCPExemptionManager.isExempted(player, CheckType.MOVING_PASSABLE, true)
&& !player.hasPermission(Permissions.MOVING_PASSABLE)) {
&& !PermissionCache.hasPermission(player, Permissions.MOVING_PASSABLE)) {
// Passable is checked first to get the original set back locations from the other checks, if needed.
newTo = passable.check(player, pFrom, pTo, data, cc, tick, useBlockChangeTracker);
if (newTo != null) {
@ -860,7 +858,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo
// Morepackets.
if (cc.morePacketsCheck && (newTo == null || data.isMorePacketsSetBackOldest())
&& !NCPExemptionManager.isExempted(player, CheckType.MOVING_MOREPACKETS, true)
&& !player.hasPermission(Permissions.MOVING_MOREPACKETS)) {
&& !PermissionCache.hasPermission(player, Permissions.MOVING_MOREPACKETS)) {
/* (Always check morepackets, if there is a chance that setting/overriding newTo is appropriate,
to avoid packet speeding using micro-violations.) */
final Location mpNewTo = morePackets.check(player, pFrom, pTo, newTo == null, data, cc);

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.checks.moving.player;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
@ -346,7 +347,7 @@ public class NoFall extends Check {
*/
public boolean isEnabled(final Player player , final MovingConfig cc) {
return cc.noFallCheck && !NCPExemptionManager.isExempted(player, CheckType.MOVING_NOFALL, true)
&& !player.hasPermission(Permissions.MOVING_NOFALL);
&& !PermissionCache.hasPermission(player, Permissions.MOVING_NOFALL);
}
}

View File

@ -19,6 +19,7 @@ import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
@ -392,7 +393,7 @@ public class SurvivalFly extends Check {
if (sprinting && data.lostSprintCount == 0 && !cc.assumeSprint && hDistance > thisMove.walkSpeed && !data.hasActiveHorVel()) {
// (Ignore some cases, in order to prevent false positives.)
// TODO: speed effects ?
if (TrigUtil.isMovingBackwards(xDistance, zDistance, from.getYaw()) && !player.hasPermission(Permissions.MOVING_SURVIVALFLY_SPRINTING)) {
if (TrigUtil.isMovingBackwards(xDistance, zDistance, from.getYaw()) && !PermissionCache.hasPermission(player, Permissions.MOVING_SURVIVALFLY_SPRINTING)) {
// (Might have to account for speeding permissions.)
// TODO: hDistance is too harsh?
hDistanceAboveLimit = Math.max(hDistanceAboveLimit, hDistance);
@ -855,13 +856,13 @@ public class SurvivalFly extends Check {
// (Friction is used as is.)
}
// TODO: !sfDirty is very coarse, should use friction instead.
else if (!sfDirty && thisMove.from.onGround && player.isSneaking() && reallySneaking.contains(player.getName()) && (!checkPermissions || !player.hasPermission(Permissions.MOVING_SURVIVALFLY_SNEAKING))) {
else if (!sfDirty && thisMove.from.onGround && player.isSneaking() && reallySneaking.contains(player.getName()) && (!checkPermissions || !PermissionCache.hasPermission(player, Permissions.MOVING_SURVIVALFLY_SNEAKING))) {
hAllowedDistance = Magic.modSneak * thisMove.walkSpeed * cc.survivalFlySneakingSpeed / 100D;
friction = 0.0; // Ensure friction can't be used to speed.
// TODO: Attribute modifiers can count in here, e.g. +0.5 (+ 50% doesn't seem to pose a problem, neither speed effect 2).
}
// TODO: !sfDirty is very coarse, should use friction instead.
else if (!sfDirty && thisMove.from.onGround && player.isBlocking() && (!checkPermissions || !player.hasPermission(Permissions.MOVING_SURVIVALFLY_BLOCKING))) {
else if (!sfDirty && thisMove.from.onGround && player.isBlocking() && (!checkPermissions || !PermissionCache.hasPermission(player, Permissions.MOVING_SURVIVALFLY_BLOCKING))) {
hAllowedDistance = Magic.modBlock * thisMove.walkSpeed * cc.survivalFlyBlockingSpeed / 100D;
friction = 0.0; // Ensure friction can't be used to speed.
}
@ -924,7 +925,7 @@ public class SurvivalFly extends Check {
}
// Speeding bypass permission (can be combined with other bypasses).
if (checkPermissions && player.hasPermission(Permissions.MOVING_SURVIVALFLY_SPEEDING)) {
if (checkPermissions && PermissionCache.hasPermission(player, Permissions.MOVING_SURVIVALFLY_SPEEDING)) {
hAllowedDistance *= cc.survivalFlySpeedingSpeed / 100D;
}
@ -1274,7 +1275,7 @@ public class SurvivalFly extends Check {
}
else {
// Potential violation.
if (!player.hasPermission(Permissions.MOVING_SURVIVALFLY_STEP) && data.getOrUseVerticalVelocity(yDistance) == null) {
if (!PermissionCache.hasPermission(player, Permissions.MOVING_SURVIVALFLY_STEP) && data.getOrUseVerticalVelocity(yDistance) == null) {
vDistanceAboveLimit = yDistance - cc.sfStepHeight;
tags.add("step");
}

View File

@ -16,6 +16,7 @@ package fr.neatmonster.nocheatplus.checks.moving.util;
import java.util.UUID;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Chunk;
import org.bukkit.GameMode;
import org.bukkit.Location;
@ -96,7 +97,7 @@ public class MovingUtil {
Double.isInfinite(Bridge1_9.getLevitationAmplifier(player))
|| fromLocation.isInLiquid()
)
&& !player.hasPermission(Permissions.MOVING_SURVIVALFLY);
&& !PermissionCache.hasPermission(player, Permissions.MOVING_SURVIVALFLY);
}
/**

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.clients.motd;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.permissions.Permissions;
@ -32,17 +33,17 @@ public class MCAutoMapMOTD extends ClientMOTD {
// TODO: Is there a compact version (just one prefix)?
// Disable Minecraft AutoMap's ores.
if (!player.hasPermission(Permissions.MINECRAFTAUTOMAP_ORES)){
if (!PermissionCache.hasPermission(player, Permissions.MINECRAFTAUTOMAP_ORES)){
mcAutoMap += "§0§0§1§f§e";
}
// Disable Minecraft AutoMap's cave mode.
if (!player.hasPermission(Permissions.MINECRAFTAUTOMAP_CAVE)){
if (!PermissionCache.hasPermission(player, Permissions.MINECRAFTAUTOMAP_CAVE)){
mcAutoMap += "§0§0§2§f§e";
}
// Disable Minecraft AutoMap's radar.
if (!player.hasPermission(Permissions.MINECRAFTAUTOMAP_RADAR)){
if (!PermissionCache.hasPermission(player, Permissions.MINECRAFTAUTOMAP_RADAR)){
mcAutoMap += "§0§0§3§4§5§6§7§8§f§e";
}

View File

@ -14,6 +14,7 @@
*/
package fr.neatmonster.nocheatplus.clients.motd;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.permissions.Permissions;
@ -43,43 +44,43 @@ public class ReiMOTD extends ClientMOTD {
String rei = "";
// Allow Rei's Minimap's cave mode.
if (allowAll || player.hasPermission(Permissions.REI_CAVE)){
if (allowAll || PermissionCache.hasPermission(player, Permissions.REI_CAVE)){
rei += "§1";
}
// Allow Rei's Minimap's radar.
if (allowAll || player.hasPermission(Permissions.REI_RADAR)){
if (allowAll || PermissionCache.hasPermission(player, Permissions.REI_RADAR)){
// TODO: Does this allow all radar features?
rei += "§2§3§4§5§6§7";
}
else{
// Allow Rei's Minimap's player radar
if (allowAll || player.hasPermission(Permissions.REI_RADAR_PLAYER)){
if (allowAll || PermissionCache.hasPermission(player, Permissions.REI_RADAR_PLAYER)){
rei += "§2";
}
// Allow Rei's Minimap's animal radar
if (allowAll || player.hasPermission(Permissions.REI_RADAR_ANIMAL)){
if (allowAll || PermissionCache.hasPermission(player, Permissions.REI_RADAR_ANIMAL)){
rei += "§3";
}
// Allow Rei's Minimap's mob radar
if (allowAll || player.hasPermission(Permissions.REI_RADAR_MOB)){
if (allowAll || PermissionCache.hasPermission(player, Permissions.REI_RADAR_MOB)){
rei += "§4";
}
// Allow Rei's Minimap's slime radar
if (allowAll || player.hasPermission(Permissions.REI_RADAR_SLIME)){
if (allowAll || PermissionCache.hasPermission(player, Permissions.REI_RADAR_SLIME)){
rei += "§5";
}
// Allow Rei's Minimap's squid radar
if (allowAll || player.hasPermission(Permissions.REI_RADAR_SQUID)){
if (allowAll || PermissionCache.hasPermission(player, Permissions.REI_RADAR_SQUID)){
rei += "§6";
}
// Allow Rei's Minimap's other radar
if (allowAll || player.hasPermission(Permissions.REI_RADAR_OTHER)){
if (allowAll || PermissionCache.hasPermission(player, Permissions.REI_RADAR_OTHER)){
rei += "§7";
}
}

View File

@ -19,6 +19,7 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import fr.neatmonster.nocheatplus.command.admin.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.event.Event;
@ -32,13 +33,6 @@ import fr.neatmonster.nocheatplus.command.actions.DenyLoginCommand;
import fr.neatmonster.nocheatplus.command.actions.KickCommand;
import fr.neatmonster.nocheatplus.command.actions.TellCommand;
import fr.neatmonster.nocheatplus.command.actions.delay.DelayCommand;
import fr.neatmonster.nocheatplus.command.admin.CommandsCommand;
import fr.neatmonster.nocheatplus.command.admin.InfoCommand;
import fr.neatmonster.nocheatplus.command.admin.InspectCommand;
import fr.neatmonster.nocheatplus.command.admin.LagCommand;
import fr.neatmonster.nocheatplus.command.admin.ReloadCommand;
import fr.neatmonster.nocheatplus.command.admin.RemovePlayerCommand;
import fr.neatmonster.nocheatplus.command.admin.VersionCommand;
import fr.neatmonster.nocheatplus.command.admin.debug.DebugCommand;
import fr.neatmonster.nocheatplus.command.admin.exemption.ExemptCommand;
import fr.neatmonster.nocheatplus.command.admin.exemption.ExemptionsCommand;
@ -120,6 +114,7 @@ public class NoCheatPlusCommand extends BaseCommand{
new LogCommand(plugin),
new ResetCommand(plugin),
new DebugCommand(plugin),
new PermissionCacheCommand(plugin),
// Testing:
new StopWatchCommand(access),
}){

View File

@ -0,0 +1,30 @@
package fr.neatmonster.nocheatplus.command.admin;
import fr.neatmonster.nocheatplus.command.BaseCommand;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import fr.neatmonster.nocheatplus.permissions.Permissions;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
public class PermissionCacheCommand extends BaseCommand {
public PermissionCacheCommand(JavaPlugin plugin) {
super(plugin, "permission-cache", Permissions.COMMAND + ".permission-cache");
}
@Override
public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) {
try {
boolean value = Boolean.parseBoolean(args[1]);
if (value) {
PermissionCache.init();
} else {
PermissionCache.close();
}
} catch (Exception e) {
sender.sendMessage("There was an error: " + e.getMessage());
}
return true;
}
}

View File

@ -25,6 +25,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.MemoryConfiguration;
import org.bukkit.plugin.Plugin;
@ -264,7 +265,6 @@ public class ConfigManager {
// globalConfig.setActionFactory();
newWorldsMap.put(null, globalConfig);
final MemoryConfiguration worldDefaults = PathUtils.getWorldsDefaultConfig(globalConfig);
// Try to obtain and parse the world-specific configuration files.
@ -306,6 +306,7 @@ public class ConfigManager {
// worldConfig.setActionFactory();
}
ConfigManager.worldsMap = newWorldsMap;
PermissionCache.init();
isInitialized = true;
}

View File

@ -0,0 +1,78 @@
package fr.neatmonster.nocheatplus.permissions;
import com.google.common.base.Objects;
import fr.neatmonster.nocheatplus.config.ConfigManager;
import org.bukkit.entity.Player;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* Cache for permission checks
*
* @author phase
* @since 4/14/19
*/
public class PermissionCache {
private static boolean INITIALIZED = false;
private static Set<String> PERMISSION_GROUPS;
private static Map<PermissionInfo, Boolean> PERMISSION_CACHE;
public static void init() {
INITIALIZED = true;
PERMISSION_CACHE = new ConcurrentHashMap<PermissionInfo, Boolean>();
List<String> permissionPolicies = ConfigManager.getConfigFile().getStringList("permission-policy");
PERMISSION_GROUPS = new HashSet<>();
PERMISSION_GROUPS.addAll(permissionPolicies);
}
public static void close() {
INITIALIZED = false;
PERMISSION_CACHE.clear();
}
public static boolean hasPermission(Player player, String permission) {
for (String permissionGroup : PERMISSION_GROUPS) {
if (permission.startsWith(permissionGroup)) {
PermissionInfo info = new PermissionInfo(player.getUniqueId(), permission);
return PERMISSION_CACHE.computeIfAbsent(info, (i) -> player.hasPermission(permission));
}
}
return player.hasPermission(permission);
}
public static void clearPlayer(Player player) {
Set<PermissionInfo> permissionInfosToClear = new HashSet<>();
for (Map.Entry<PermissionInfo, Boolean> entry : PERMISSION_CACHE.entrySet()) {
PermissionInfo info = entry.getKey();
if (info.uuid.equals(player.getUniqueId())) {
permissionInfosToClear.add(info);
}
}
permissionInfosToClear.forEach(PERMISSION_CACHE::remove);
}
public static class PermissionInfo {
UUID uuid;
String permission;
public PermissionInfo(UUID uuid, String permisison) {
this.uuid = uuid;
this.permission = permisison;
}
@Override
public int hashCode() {
return Objects.hashCode(uuid, permission);
}
@Override
public boolean equals(Object o) {
return o instanceof PermissionInfo
&& ((PermissionInfo) o).permission.equals(permission)
&& ((PermissionInfo) o).uuid.equals(uuid);
}
}
}

View File

@ -18,6 +18,7 @@ import java.util.Arrays;
import java.util.Random;
import java.util.logging.Level;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -176,7 +177,7 @@ public class CheckUtils {
// TODO: Checking for the thread might be a temporary measure.
final String permission = checkType.getPermission();
if (isPrimaryThread) {
if (permission != null && player.hasPermission(permission)) {
if (permission != null && PermissionCache.hasPermission(player, permission)) {
return true;
}
}

View File

@ -26,6 +26,7 @@ import java.util.Set;
import java.util.UUID;
import java.util.concurrent.locks.ReentrantLock;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
@ -224,7 +225,7 @@ public class TickTask implements Runnable {
final ICheckData data = entry.checkType.getDataFactory().getData(player);
for (int j = 0; j < perms.length; j ++) {
final String permission = perms[j];
data.setCachedPermission(permission, player.hasPermission(permission));
data.setCachedPermission(permission, PermissionCache.hasPermission(player, permission));
}
}
}

View File

@ -30,6 +30,7 @@ import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import fr.neatmonster.nocheatplus.permissions.PermissionCache;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@ -412,7 +413,7 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI {
for (final String name : names) {
if (!done.contains(name)) {
final Player player = DataManager.getPlayerExact(name);
if (player != null && player.hasPermission(Permissions.NOTIFY)) {
if (player != null && PermissionCache.hasPermission(player, Permissions.NOTIFY)) {
if (hasTurnedOffNotifications(player)) {
continue;
}
@ -1310,7 +1311,7 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI {
final Player player = event.getPlayer();
// Check if login is denied:
checkDenyLoginsNames();
if (player.hasPermission(Permissions.BYPASS_DENY_LOGIN)) {
if (PermissionCache.hasPermission(player, Permissions.BYPASS_DENY_LOGIN)) {
return;
}
if (isLoginDenied(player.getName())) {
@ -1405,6 +1406,7 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI {
logManager.severe(Streams.INIT, t);
}
}
PermissionCache.clearPlayer(player);
if (clearExemptionsOnLeave) {
NCPExemptionManager.unexempt(player);
}
@ -1417,7 +1419,7 @@ public class NoCheatPlus extends JavaPlugin implements NoCheatPlusAPI {
for (final String permission : pr.getDefaultPermissions()) {
Boolean state = checked.get(permission);
if (state == null) {
state = player.hasPermission(permission);
state = PermissionCache.hasPermission(player, permission);
checked.put(permission, state);
}
pr.setPermission(name, permission, state);

View File

@ -73,8 +73,8 @@ TODO: Better place for descriptions like this?</description>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>