From c4ecdbf50943ec3956d6289ec9f78350630cb88a Mon Sep 17 00:00:00 2001 From: Stanislav Usenkov Date: Fri, 19 Feb 2016 14:37:59 +0600 Subject: [PATCH] v0.9.20b: Allow use of wildcards in entity's identifier. --- pom.xml | 2 +- .../rscPermissions/API/PlayerType.java | 169 +++++----- .../rscPermissions/BukkitPluginMain.java | 305 +++++++++--------- .../Engine/ResolutionResult.java | 100 +++--- 4 files changed, 289 insertions(+), 287 deletions(-) diff --git a/pom.xml b/pom.xml index deee3be..7b2fd40 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ru.simsonic rscPermissions - 0.9.19b + 0.9.20b jar rscPermissions diff --git a/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java b/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java index 1f453eb..f729587 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java @@ -1,83 +1,86 @@ -package ru.simsonic.rscPermissions.API; - -import ru.simsonic.rscPermissions.Engine.Matchers; - -public enum PlayerType -{ - NAME(0), // 16 chars [_a-zA-Z0-9] max - UUID(1), // 550e8400-e29b-41d4-a716-446655440000 - DASHLESS_UUID(2), // 550e8400e29b41d4a716446655440000 - INTERNET_WILDCARD(3), // 192.168.*.* - INTERNET_SUBNETMASK(4), // 192.168.0.0/16 - INAPPLICABLE(-1); - private final int value; - private PlayerType(int value) - { - this.value = value; - } - public static PlayerType byValue(int value) - { - for(PlayerType constant : PlayerType.values()) - if(constant.value == value) - return constant; - return INAPPLICABLE; - } - public static PlayerType scanPlayerEntity(String entity) - { - if(entity == null || "".equals(entity)) - return NAME; - if(Matchers.isCorrectNickname(entity)) - return NAME; - if(Matchers.isCorrectUUID(entity)) - return UUID; - if(Matchers.isCorrectDashlessUUID(entity)) - return DASHLESS_UUID; - if(Matchers.isCorrectWildcard(entity)) - return INTERNET_WILDCARD; - if(Matchers.isCorrectSubnetMask(entity)) - return INTERNET_SUBNETMASK; - return INAPPLICABLE; - } - public static String normalize(String entity) - { - if(entity == null || "".equals(entity)) - return ""; - if(Matchers.isCorrectDashlessUUID(entity)) - return Matchers.uuidAddDashes(entity); - return entity; - } - public boolean isEntityApplicable(String entity, String identifier) - { - if(entity == null || "".equals(entity) || identifier == null || "".equals(identifier)) - return false; - try - { - switch(this) - { - case NAME: - return identifier.equals(entity); - case DASHLESS_UUID: - if(Matchers.isCorrectUUID(identifier)) - identifier = Matchers.uuidRemoveDashes(identifier); - if(Matchers.isCorrectDashlessUUID(identifier)) - return entity.equalsIgnoreCase(identifier); - break; - case UUID: - if(Matchers.isCorrectDashlessUUID(identifier)) - identifier = Matchers.uuidAddDashes(identifier); - if(Matchers.isCorrectUUID(identifier)) - return entity.equalsIgnoreCase(identifier); - break; - case INTERNET_WILDCARD: - case INTERNET_SUBNETMASK: - // TO DO HERE - return false; - case INAPPLICABLE: - default: - break; - } - } catch(IllegalArgumentException ex) { - } - return false; - } -} +package ru.simsonic.rscPermissions.API; + +import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; +import ru.simsonic.rscPermissions.Engine.Matchers; + +public enum PlayerType +{ + NAME(0), // 16 chars [_a-zA-Z0-9] max + UUID(1), // 550e8400-e29b-41d4-a716-446655440000 + DASHLESS_UUID(2), // 550e8400e29b41d4a716446655440000 + INTERNET_WILDCARD(3), // 192.168.*.* + INTERNET_SUBNETMASK(4), // 192.168.0.0/16 + INAPPLICABLE(-1); + private final int value; + private PlayerType(int value) + { + this.value = value; + } + public static PlayerType byValue(int value) + { + for(PlayerType constant : PlayerType.values()) + if(constant.value == value) + return constant; + return INAPPLICABLE; + } + public static PlayerType scanPlayerEntity(String entity) + { + if(entity == null || "".equals(entity)) + return NAME; + if(Matchers.isCorrectNickname(entity)) + return NAME; + if(Matchers.isCorrectUUID(entity)) + return UUID; + if(Matchers.isCorrectDashlessUUID(entity)) + return DASHLESS_UUID; + if(Matchers.isCorrectWildcard(entity)) + return INTERNET_WILDCARD; + if(Matchers.isCorrectSubnetMask(entity)) + return INTERNET_SUBNETMASK; + return INAPPLICABLE; + } + public static String normalize(String entity) + { + if(entity == null || "".equals(entity)) + return ""; + if(Matchers.isCorrectDashlessUUID(entity)) + return Matchers.uuidAddDashes(entity); + return entity; + } + public boolean isEntityApplicable(String entity, String identifier) + { + if(entity == null || "".equals(entity) || identifier == null || "".equals(identifier)) + return false; + try + { + switch(this) + { + case NAME: + return entity.contains("*") + ? GenericChatCodes.wildcardMatch(identifier, entity) + : identifier.equals(entity); + case DASHLESS_UUID: + if(Matchers.isCorrectUUID(identifier)) + identifier = Matchers.uuidRemoveDashes(identifier); + if(Matchers.isCorrectDashlessUUID(identifier)) + return entity.equalsIgnoreCase(identifier); + break; + case UUID: + if(Matchers.isCorrectDashlessUUID(identifier)) + identifier = Matchers.uuidAddDashes(identifier); + if(Matchers.isCorrectUUID(identifier)) + return entity.equalsIgnoreCase(identifier); + break; + case INTERNET_WILDCARD: + case INTERNET_SUBNETMASK: + // TO DO HERE + return false; + case INAPPLICABLE: + default: + break; + } + } catch(IllegalArgumentException ex) { + } + return false; + } +} diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java index d26781b..50614f9 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java @@ -1,153 +1,152 @@ -package ru.simsonic.rscPermissions; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitScheduler; -import org.mcstats.MetricsLite; -import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; -import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; -import ru.simsonic.rscPermissions.API.Settings; -import ru.simsonic.rscPermissions.Bukkit.BukkitEventListener; -import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager; -import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; -import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders; -import ru.simsonic.rscPermissions.Bukkit.Commands.BukkitCommands; -import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver; -import ru.simsonic.rscPermissions.Engine.Backends.BackendDatabase; -import ru.simsonic.rscPermissions.Engine.Backends.BackendJson; -import ru.simsonic.rscPermissions.Engine.Backends.DatabaseContents; -import ru.simsonic.rscPermissions.Engine.InternalCache; -import ru.simsonic.rscPermissions.Engine.Phrases; - -public final class BukkitPluginMain extends JavaPlugin -{ - public static final Logger consoleLog = Bukkit.getLogger(); - public final Settings settings = new BukkitPluginConfiguration(this); - public final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(this); - public final BukkitEventListener bukkitListener = new BukkitEventListener(this); - public final BackendJson localStorage = new BackendJson(getDataFolder()); - public final BackendDatabase connection = new BackendDatabase(consoleLog); - public final InternalCache internalCache = new InternalCache(); - public final BukkitPermissionManager permissionManager = new BukkitPermissionManager(this); - public final BukkitRegionProviders regionListProvider = new BukkitRegionProviders(this); - private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this); - public final BukkitCommands commandHelper = new BukkitCommands(this); - private MetricsLite metrics; - @Override - public void onLoad() - { - Phrases.extractTranslations(getDataFolder()); - settings.onLoad(); - consoleLog.log(Level.INFO, "[rscp] serverId value is set to \"{0}\". You can change it in server.properties.", getServer().getServerId()); - consoleLog.log(Level.INFO, "[rscp] rscPermissions has been loaded."); - } - @Override - public void onEnable() - { - // Read settings and setup components - settings.readSettings(); - bukkitListener.onEnable(); - internalCache.setDefaultGroup( - settings.getDefaultGroup(), - settings.isDefaultForever(), - settings.isUsingAncestorPrefixes()); - Phrases.applyTranslation(settings.getTranslationProvider()); - // Restore temporary cached data from json files - final DatabaseContents contents = localStorage.retrieveContents(); - contents.filterServerId(getServer().getServerId()).filterLifetime(); - internalCache.fill(contents); - getServer().getConsoleSender().sendMessage(GenericChatCodes.processStringStatic( - (Settings.chatPrefix + Phrases.FETCHED_LOCAL_CACHE.toString()) - .replace("{:E}", String.valueOf(contents.entities.length)) - .replace("{:P}", String.valueOf(contents.permissions.length)) - .replace("{:I}", String.valueOf(contents.inheritance.length)))); - // Integrate Metrics - if(settings.isUseMetrics()) - try - { - metrics = new MetricsLite(this); - metrics.start(); - consoleLog.info(Phrases.PLUGIN_METRICS.toString()); - } catch(IOException ex) { - consoleLog.log(Level.WARNING, "[rscp][Metrics] Exception: {0}", ex); - } - // Register event's dispatcher - getServer().getPluginManager().registerEvents(bukkitListener, this); - regionUpdateObserver.registerListeners(); - // Integrate Vault and WEPIF - bridgeForBukkit.setupVault(); - getServer().getScheduler().runTask(this, new Runnable() - { - @Override - public void run() - { - bridgeForBukkit.setupWEPIF(); - } - }); - // WorldGuard, Residence and other possible region list providers - regionListProvider.integrate(); - // Start all needed parallel threads as daemons - permissionManager.startDeamon(); - regionUpdateObserver.startDeamon(); - // Connect to database and initiate data fetching - connection.initialize(settings.getConnectionParams()); - if(settings.getAutoReloadDelayTicks() > 0) - commandHelper.threadFetchDatabaseContents.startDeamon(); - // Done - consoleLog.info(Phrases.PLUGIN_ENABLED.toString()); - } - @Override - public void onDisable() - { - getServer().getServicesManager().unregisterAll(this); - regionUpdateObserver.stop(); - permissionManager.stop(); - internalCache.clear(); - connection.disconnect(); - regionListProvider.deintegrate(); - metrics = null; - consoleLog.info(Phrases.PLUGIN_DISABLED.toString()); - } - private int nAutoUpdaterTaskId = -1; - public void scheduleAutoUpdate() - { - final BukkitScheduler scheduler = getServer().getScheduler(); - if(nAutoUpdaterTaskId != -1) - scheduler.cancelTask(nAutoUpdaterTaskId); - final int delay = settings.getAutoReloadDelayTicks(); - nAutoUpdaterTaskId = delay > 0 - ? scheduler.scheduleSyncDelayedTask(this, new Runnable() - { - @Override - public void run() - { - commandHelper.threadFetchDatabaseContents.startDeamon(); - } - }, delay) - : -1; - } - @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) - { - if(sender != null) - try - { - switch(cmd.getName().toLowerCase()) - { - case "rscp": - commandHelper.onCommandHub(sender, args); - break; - } - } catch(CommandAnswerException ex) { - for(String answer : ex.getMessageArray()) - sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + answer)); - } - return true; - } -} +package ru.simsonic.rscPermissions; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitScheduler; +import org.mcstats.MetricsLite; +import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; +import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; +import ru.simsonic.rscPermissions.API.Settings; +import ru.simsonic.rscPermissions.Bukkit.BukkitEventListener; +import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager; +import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; +import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders; +import ru.simsonic.rscPermissions.Bukkit.Commands.BukkitCommands; +import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver; +import ru.simsonic.rscPermissions.Engine.Backends.BackendDatabase; +import ru.simsonic.rscPermissions.Engine.Backends.BackendJson; +import ru.simsonic.rscPermissions.Engine.Backends.DatabaseContents; +import ru.simsonic.rscPermissions.Engine.InternalCache; +import ru.simsonic.rscPermissions.Engine.Phrases; + +public final class BukkitPluginMain extends JavaPlugin +{ + public static final Logger consoleLog = Bukkit.getLogger(); + public final Settings settings = new BukkitPluginConfiguration(this); + public final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(this); + public final BukkitEventListener bukkitListener = new BukkitEventListener(this); + public final BackendJson localStorage = new BackendJson(getDataFolder()); + public final BackendDatabase connection = new BackendDatabase(consoleLog); + public final InternalCache internalCache = new InternalCache(); + public final BukkitPermissionManager permissionManager = new BukkitPermissionManager(this); + public final BukkitRegionProviders regionListProvider = new BukkitRegionProviders(this); + private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this); + public final BukkitCommands commandHelper = new BukkitCommands(this); + private MetricsLite metrics; + @Override + public void onLoad() + { + Phrases.extractTranslations(getDataFolder()); + settings.onLoad(); + consoleLog.log(Level.INFO, "[rscp] serverId value is set to \"{0}\". You can change it in server.properties.", getServer().getServerId()); + consoleLog.log(Level.INFO, "[rscp] rscPermissions has been loaded."); + } + @Override + public void onEnable() + { + // Read settings and setup components + settings.readSettings(); + bukkitListener.onEnable(); + internalCache.setDefaultGroup( + settings.getDefaultGroup(), + settings.isDefaultForever(), + settings.isUsingAncestorPrefixes()); + Phrases.applyTranslation(settings.getTranslationProvider()); + // Restore temporary cached data from json files + final DatabaseContents contents = localStorage.retrieveContents(); + contents.filterServerId(getServer().getServerId()).filterLifetime(); + internalCache.fill(contents); + getServer().getConsoleSender().sendMessage(GenericChatCodes.processStringStatic( + (Settings.chatPrefix + Phrases.FETCHED_LOCAL_CACHE.toString()) + .replace("{:E}", String.valueOf(contents.entities.length)) + .replace("{:P}", String.valueOf(contents.permissions.length)) + .replace("{:I}", String.valueOf(contents.inheritance.length)))); + // Integrate Metrics + if(settings.isUseMetrics()) + try + { + metrics = new MetricsLite(this); + metrics.start(); + consoleLog.info(Phrases.PLUGIN_METRICS.toString()); + } catch(IOException ex) { + consoleLog.log(Level.WARNING, "[rscp][Metrics] Exception: {0}", ex); + } + // Register event's dispatcher + getServer().getPluginManager().registerEvents(bukkitListener, this); + regionUpdateObserver.registerListeners(); + // Integrate Vault and WEPIF + bridgeForBukkit.setupVault(); + getServer().getScheduler().runTask(this, new Runnable() + { + @Override + public void run() + { + bridgeForBukkit.setupWEPIF(); + } + }); + // WorldGuard, Residence and other possible region list providers + regionListProvider.integrate(); + // Start all needed parallel threads as daemons + permissionManager.startDeamon(); + regionUpdateObserver.startDeamon(); + // Connect to database and initiate data fetching + connection.initialize(settings.getConnectionParams()); + if(settings.getAutoReloadDelayTicks() > 0) + commandHelper.threadFetchDatabaseContents.startDeamon(); + // Done + consoleLog.info(Phrases.PLUGIN_ENABLED.toString()); + } + @Override + public void onDisable() + { + getServer().getServicesManager().unregisterAll(this); + regionUpdateObserver.stop(); + permissionManager.stop(); + internalCache.clear(); + connection.disconnect(); + regionListProvider.deintegrate(); + metrics = null; + consoleLog.info(Phrases.PLUGIN_DISABLED.toString()); + } + private int nAutoUpdaterTaskId = -1; + public void scheduleAutoUpdate() + { + final BukkitScheduler scheduler = getServer().getScheduler(); + if(nAutoUpdaterTaskId != -1) + scheduler.cancelTask(nAutoUpdaterTaskId); + final int delay = settings.getAutoReloadDelayTicks(); + nAutoUpdaterTaskId = delay > 0 + ? scheduler.scheduleSyncDelayedTask(this, new Runnable() + { + @Override + public void run() + { + commandHelper.threadFetchDatabaseContents.startDeamon(); + } + }, delay) + : -1; + } + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) + { + if(sender != null) + try + { + switch(cmd.getName().toLowerCase()) + { + case "rscp": + commandHelper.onCommandHub(sender, args); + break; + } + } catch(CommandAnswerException ex) { + for(String answer : ex.getMessageArray()) + sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + answer)); + } + return true; + } +} diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java index c47206f..5b4c712 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java @@ -1,50 +1,50 @@ -package ru.simsonic.rscPermissions.Engine; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; -import ru.simsonic.rscPermissions.API.Settings; - -public class ResolutionResult -{ - public String prefix = ""; - public String suffix = ""; - public Map permissions; - protected List groups; - public boolean hasPermission(String permission) - { - for(Map.Entry entry : permissions.entrySet()) - if(entry.getKey().equals(permission)) - return entry.getValue(); - return false; - } - public boolean hasPermissionWC(String permission) - { - for(Map.Entry entry : permissions.entrySet()) - { - final String key = entry.getKey(); - if(key.equals(permission)) - return entry.getValue(); - if(key.contains("*") && GenericChatCodes.wildcardMatch(permission, key)) - return entry.getValue(); - } - return false; - } - public List getOrderedGroups() - { - return Collections.unmodifiableList(groups); - } - public String[] getDeorderedGroups() - { - final ArrayList list = new ArrayList(groups.size()); - final String separator = new String(new char[] { Settings.groupLevelTab }); - for(String group : groups) - { - String[] splitted = group.split(separator); - list.add(splitted[splitted.length - 1]); - } - return list.toArray(new String[list.size()]); - } -} +package ru.simsonic.rscPermissions.Engine; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; +import ru.simsonic.rscPermissions.API.Settings; + +public class ResolutionResult +{ + public String prefix = ""; + public String suffix = ""; + public Map permissions; + protected List groups; + public boolean hasPermission(String permission) + { + for(Map.Entry entry : permissions.entrySet()) + if(entry.getKey().equals(permission)) + return entry.getValue(); + return false; + } + public boolean hasPermissionWC(String permission) + { + for(Map.Entry entry : permissions.entrySet()) + { + final String key = entry.getKey(); + if(key.equals(permission)) + return entry.getValue(); + if(key.contains("*") && GenericChatCodes.wildcardMatch(permission, key)) + return entry.getValue(); + } + return false; + } + public List getOrderedGroups() + { + return Collections.unmodifiableList(groups); + } + public String[] getDeorderedGroups() + { + final ArrayList list = new ArrayList(groups.size()); + final String separator = new String(new char[] { Settings.groupLevelTab }); + for(String group : groups) + { + String[] splitted = group.split(separator); + list.add(splitted[splitted.length - 1]); + } + return list.toArray(new String[list.size()]); + } +}