Browse Source

v0.9.20b: Allow use of wildcards in entity's identifier.

master
Stanislav Usenkov 9 years ago
parent
commit
c4ecdbf509
  1. 2
      pom.xml
  2. 169
      src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java
  3. 305
      src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
  4. 100
      src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java

2
pom.xml

@ -4,7 +4,7 @@
<groupId>ru.simsonic</groupId>
<artifactId>rscPermissions</artifactId>
<version>0.9.19b</version>
<version>0.9.20b</version>
<packaging>jar</packaging>
<name>rscPermissions</name>

169
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;
}
}

305
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;
}
}

100
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<String, Boolean> permissions;
protected List<String> groups;
public boolean hasPermission(String permission)
{
for(Map.Entry<String, Boolean> entry : permissions.entrySet())
if(entry.getKey().equals(permission))
return entry.getValue();
return false;
}
public boolean hasPermissionWC(String permission)
{
for(Map.Entry<String, Boolean> 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<String> getOrderedGroups()
{
return Collections.unmodifiableList(groups);
}
public String[] getDeorderedGroups()
{
final ArrayList<String> 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<String, Boolean> permissions;
protected List<String> groups;
public boolean hasPermission(String permission)
{
for(Map.Entry<String, Boolean> entry : permissions.entrySet())
if(entry.getKey().equals(permission))
return entry.getValue();
return false;
}
public boolean hasPermissionWC(String permission)
{
for(Map.Entry<String, Boolean> 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<String> getOrderedGroups()
{
return Collections.unmodifiableList(groups);
}
public String[] getDeorderedGroups()
{
final ArrayList<String> 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()]);
}
}

Loading…
Cancel
Save