Browse Source

Version 0.9.6a:

* Implicit user/group permissions.
* Fixes in prefix/suffix calculation.
* On/off debug info for players.
* EntityType and PlayerType enum's entries are UPPERCASE.
* Linking to the newest rscUtilityLibrary.
master
Stanislav Usenkov 10 years ago
parent
commit
a2c442fe86
  1. 4
      pom.xml
  2. 8
      src/main/java/ru/simsonic/rscPermissions/API/EntityType.java
  3. 34
      src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java
  4. 8
      src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java
  5. 2
      src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java
  6. 22
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
  7. 46
      src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
  8. 2
      src/main/java/ru/simsonic/rscPermissions/Bukkit/PermissionsEx_YAML.java
  9. 2
      src/main/java/ru/simsonic/rscPermissions/Bukkit/RegionUpdateObserver.java
  10. 15
      src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
  11. 49
      src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java
  12. 13
      src/main/java/ru/simsonic/rscPermissions/Engine/Phrases.java
  13. 6
      src/main/java/ru/simsonic/rscPermissions/IndependentMain.java
  14. 3
      src/main/resources/languages/english.yml
  15. 3
      src/main/resources/languages/russian.yml

4
pom.xml

@ -4,7 +4,7 @@
<groupId>ru.simsonic</groupId>
<artifactId>rscPermissions</artifactId>
<version>0.9.4a</version>
<version>0.9.6a</version>
<packaging>jar</packaging>
<name>rscPermissions</name>
@ -66,7 +66,7 @@
<dependency>
<groupId>ru.simsonic</groupId>
<artifactId>rscUtilityLibrary</artifactId>
<version>2.0.2</version>
<version>2.0.3</version>
<scope>compile</scope>
<type>jar</type>
</dependency>

8
src/main/java/ru/simsonic/rscPermissions/API/EntityType.java

@ -2,9 +2,9 @@ package ru.simsonic.rscPermissions.API;
public enum EntityType
{
group(0),
player(1),
unknown(-1);
GROUP(0),
PLAYER(1),
UNKNOWN(-1);
private final int value;
private EntityType(int value)
{
@ -15,6 +15,6 @@ public enum EntityType
for(EntityType constant : EntityType.values())
if(constant.value == value)
return constant;
return unknown;
return UNKNOWN;
}
}

34
src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java

@ -4,12 +4,12 @@ import java.util.regex.Pattern;
public enum PlayerType
{
name(0), // 16 chars max
hyphenatedUUID(1), // 550e8400-e29b-41d4-a716-446655440000
dehyphenatedUUID(2), // 550e8400e29b41d4a716446655440000
internetWildcard(3), // 192.168.*.*
internetSubnetMask(4), // 192.168.1.0/16
inapplicable(-1);
NAME(0), // 16 chars max
HYPHENATED_UUID(1), // 550e8400-e29b-41d4-a716-446655440000
DEHYPHENATED_UUID(2), // 550e8400e29b41d4a716446655440000
INTERNET_WILDCARD(3), // 192.168.*.*
INTERNET_SUBNETMASK(4), // 192.168.1.0/16
INAPPLICABLE(-1);
private final int value;
private PlayerType(int value)
{
@ -20,7 +20,7 @@ public enum PlayerType
for(PlayerType constant : PlayerType.values())
if(constant.value == value)
return constant;
return inapplicable;
return INAPPLICABLE;
}
private static final Pattern nicknameRegExp = Pattern.compile("^[a-zA-Z0-9_-]{3,16}$");
private static final Pattern hyphenatedRegExp = Pattern.compile("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$");
@ -39,13 +39,13 @@ public enum PlayerType
public static PlayerType scanPlayerEntity(String entity)
{
if(entity == null || "".equals(entity))
return name;
return NAME;
if(nicknameRegExp.matcher(entity).matches())
return name;
return NAME;
if(hyphenatedRegExp.matcher(entity.toLowerCase()).matches())
return hyphenatedUUID;
return HYPHENATED_UUID;
if(dehyphenatedRegExp.matcher(entity.toLowerCase()).matches())
return dehyphenatedUUID;
return DEHYPHENATED_UUID;
/*
final Matcher mIP1 = ipWildcardRegExp.matcher(entity);
if(mIP1.matches())
@ -56,7 +56,7 @@ public enum PlayerType
final String a4 = mIP1.group(4);
// TO DO
long address = 0, mask = 0;
return internetWildcard;
return INTERNET_WILDCARD;
}
final Matcher mIP2 = ipSubnetMaskRegExp.matcher(entity);
if(mIP2.matches())
@ -68,10 +68,10 @@ public enum PlayerType
final String sn = mIP1.group(5);
// TO DO
long address = 0, mask = 0;
return internetSubnetMask;
return INTERNET_SUBNETMASK;
}
*/
return inapplicable;
return INAPPLICABLE;
}
/*
public static void getAddressDetails(String entity, RowPermission row)
@ -109,11 +109,11 @@ public enum PlayerType
return false;
switch(this)
{
case name:
case NAME:
return identifier.equals(entity);
case hyphenatedUUID:
case HYPHENATED_UUID:
identifier = identifier.replace("-", "");
case dehyphenatedUUID:
case DEHYPHENATED_UUID:
return entity.equalsIgnoreCase(identifier);
}
return false;

8
src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java

@ -46,15 +46,15 @@ public class RowInheritance implements Cloneable, Comparable<RowInheritance>
}
public boolean isEntityApplicable(String identifier)
{
if(EntityType.group.equals(childType))
if(EntityType.GROUP.equals(childType))
return entity.equalsIgnoreCase(identifier);
switch(playerType)
{
case name:
case NAME:
return entity.equals(identifier);
case hyphenatedUUID:
case HYPHENATED_UUID:
identifier = identifier.replace("-", "");
case dehyphenatedUUID:
case DEHYPHENATED_UUID:
return entity.equals(identifier);
}
// TO DO

2
src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java

@ -21,7 +21,7 @@ public class RowPermission implements Cloneable
}
public boolean isEntityApplicable(String identifier)
{
if(EntityType.group.equals(entityType))
if(EntityType.GROUP.equals(entityType))
return entity.equalsIgnoreCase(identifier);
// TO DO
return false;

22
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java

@ -3,6 +3,7 @@ import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@ -21,13 +22,14 @@ public class BukkitPermissionManager extends RestartableThread
{
this.rscp = plugin;
}
private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>();
private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>();
private final Map<Player, PermissionAttachment> attachments = new HashMap<>();
private final Map<Player, Map<String, Boolean>> persistentPermissions = new HashMap<>();
private final Map<Player, Map<String, Boolean>> transientPermissions = new HashMap<>();
private final Map<Player, Set<String>> groups = new ConcurrentHashMap<>();
private final Map<Player, String> prefixes = new ConcurrentHashMap<>();
private final Map<Player, String> suffixes = new ConcurrentHashMap<>();
private final Map<Player, Set<String>> groups = new ConcurrentHashMap<>();
private final Map<Player, String> prefixes = new ConcurrentHashMap<>();
private final Map<Player, String> suffixes = new ConcurrentHashMap<>();
private final Set<Player> debug = new HashSet<>();
public void recalculateOnlinePlayers()
{
updateQueue.addAll(rscp.getServer().getOnlinePlayers());
@ -71,6 +73,7 @@ public class BukkitPermissionManager extends RestartableThread
suffixes.remove(player);
persistentPermissions.remove(player);
transientPermissions.remove(player);
debug.remove(player);
}
@Override
public void run()
@ -151,4 +154,15 @@ public class BukkitPermissionManager extends RestartableThread
result.add(socketAddress.getAddress().getHostAddress());
return result.toArray(new String[result.size()]);
}
public boolean isDebugging(Player target)
{
return debug.contains(target);
}
public void setDebugging(Player target, boolean value)
{
if(value)
debug.add(target);
else
debug.remove(target);
}
}

46
src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java

@ -4,14 +4,15 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.logging.Level;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.API.Settings;
import ru.simsonic.rscPermissions.Backends.DatabaseContents;
import ru.simsonic.rscPermissions.Bukkit.PermissionsEx_YAML;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException;
import ru.simsonic.rscPermissions.Engine.Phrases;
import ru.simsonic.rscUtilityLibrary.Bukkit.Commands.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.RestartableThread;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
@ -127,22 +128,13 @@ public class BukkitCommands
threadInsertExampleRows.startDeamon();
return threadInsertExampleRows;
}
public void onCommand(CommandSender sender, Command cmd, String label, String[] args) throws CommandAnswerException
{
switch(cmd.getName().toLowerCase())
{
case "rscp":
onCommandHub(sender, args);
break;
}
}
private void onCommandHub(CommandSender sender, String[] args) throws CommandAnswerException
public void onCommandHub(CommandSender sender, String[] args) throws CommandAnswerException
{
final ArrayList<String> help = new ArrayList<>();
if(sender.hasPermission("rscp.admin"))
help.add("/rscp (user|group) {_LS}-- PermissionsEx-like admin commands");
if(sender.hasPermission("rscp.admin.lock"))
help.add("/rscp (lock|unlock) {_LS}-- maintenance mode control");
help.add("/rscp (lock [mode]|unlock) {_LS}-- maintenance mode control");
if(sender.hasPermission("rscp.admin"))
{
help.add("/rscp (examplerows|import) {_LS}-- possible useful things");
@ -252,8 +244,34 @@ public class BukkitCommands
return;
case "debug":
/* rscp debug [yes|on|no|off|toggle] */
if(sender instanceof ConsoleCommandSender)
throw new CommandAnswerException("{_LR}This command cannot be run from console.");
if(sender.hasPermission("rscp.admin"))
throw new CommandAnswerException("Not implemented yet.");
{
final Player player = (Player)sender;
boolean isDebugging = rscp.permissionManager.isDebugging(player);
if(args.length >= 2)
switch(args[1].toLowerCase())
{
case "yes":
case "on":
isDebugging = true;
break;
case "no":
case "off":
isDebugging = false;
break;
case "toggle":
isDebugging = !isDebugging;
break;
default:
throw new CommandAnswerException(help);
}
else
isDebugging = !isDebugging;
rscp.permissionManager.setDebugging(player, isDebugging);
throw new CommandAnswerException(isDebugging ? Phrases.DEBUG_ON.toString() : Phrases.DEBUG_OFF.toString());
}
return;
case "help":
default:

2
src/main/java/ru/simsonic/rscPermissions/Bukkit/PermissionsEx_YAML.java

@ -3,7 +3,7 @@ import java.io.File;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.Bukkit.Commands.CommandAnswerException;
public final class PermissionsEx_YAML
{

2
src/main/java/ru/simsonic/rscPermissions/Bukkit/RegionUpdateObserver.java

@ -1,7 +1,7 @@
package ru.simsonic.rscPermissions.Bukkit;
import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscUtilityLibrary.BukkitListeners.MovingPlayersCatcher;
import ru.simsonic.rscUtilityLibrary.Bukkit.Listeners.MovingPlayersCatcher;
import ru.simsonic.rscUtilityLibrary.RestartableThread;
public class RegionUpdateObserver extends RestartableThread

15
src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java

@ -20,7 +20,7 @@ import ru.simsonic.rscPermissions.Bukkit.Commands.BukkitCommands;
import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver;
import ru.simsonic.rscPermissions.Engine.InternalCache;
import ru.simsonic.rscPermissions.Engine.Phrases;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.Bukkit.Commands.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
public final class BukkitPluginMain extends JavaPlugin
@ -41,7 +41,7 @@ public final class BukkitPluginMain extends JavaPlugin
public void onLoad()
{
settings.onLoad();
consoleLog.log(Level.INFO, "[rscp] This server's ID is '{0}'. You can change it in server.properties.", getServer().getServerId());
consoleLog.log(Level.INFO, "[rscp] This server`s ID is \"{0}\". You can change it in server.properties.", getServer().getServerId());
consoleLog.log(Level.INFO, "[rscp] rscPermissions has been loaded.");
}
@Override
@ -66,7 +66,6 @@ public final class BukkitPluginMain extends JavaPlugin
});
// Integrate Metrics
if(settings.isUseMetrics())
{
try
{
metrics = new MetricsLite(this);
@ -75,7 +74,6 @@ public final class BukkitPluginMain extends JavaPlugin
} catch(IOException ex) {
consoleLog.log(Level.INFO, "[rscp][Metrics] Exception: {0}", ex);
}
}
// Register event's dispatcher
getServer().getPluginManager().registerEvents(bukkitListener, this);
regionUpdateObserver.registerListeners();
@ -125,12 +123,15 @@ public final class BukkitPluginMain extends JavaPlugin
{
try
{
commandHelper.onCommand(sender, cmd, label, args);
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));
} catch(NullPointerException ex) {
// These will never occur! I hope...
}
return true;
}

49
src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java

@ -21,6 +21,8 @@ public class InternalCache
private final HashMap<String, RowEntity> entities_u = new HashMap<>();
private final RowInheritance defaultInheritance = new RowInheritance();
private boolean alwaysInheritDefaultGroup = false;
private RowEntity implicit_g;
private RowEntity implicit_u;
public void setDefaultGroup(String defaultGroup, boolean alwaysInheritDefaultGroup)
{
defaultInheritance.parent = defaultGroup;
@ -33,13 +35,15 @@ public class InternalCache
importEntities(contents);
importPermissions(contents.permissions);
importInheritance(contents.inheritance);
implicit_g = entities_g.get("");
implicit_u = entities_u.get("");
}
private void importEntities(DatabaseContents contents)
{
final HashSet<String> names_u = new HashSet<>();
final HashSet<String> names_g = new HashSet<>();
for(RowEntity row : contents.entities)
if(row.entityType == EntityType.group)
if(row.entityType == EntityType.GROUP)
{
names_g.add(row.entity);
entities_g.put(row.entity.toLowerCase(), row);
@ -48,14 +52,14 @@ public class InternalCache
entities_u.put(row.entity, row);
}
for(RowPermission row : contents.permissions)
if(row.entityType == EntityType.group)
if(row.entityType == EntityType.GROUP)
names_g.add(row.entity);
else
names_u.add(row.entity);
for(RowInheritance row : contents.inheritance)
{
names_g.add(row.parent);
if(row.childType == EntityType.group)
if(row.childType == EntityType.GROUP)
names_g.add(row.entity);
else
names_u.add(row.entity);
@ -68,7 +72,7 @@ public class InternalCache
{
final RowEntity dummy = new RowEntity();
dummy.entity = name;
dummy.entityType = EntityType.group;
dummy.entityType = EntityType.GROUP;
entities_g.put(groupInternalName, dummy);
}
}
@ -77,7 +81,7 @@ public class InternalCache
{
final RowEntity dummy = new RowEntity();
dummy.entity = name;
dummy.entityType = EntityType.player;
dummy.entityType = EntityType.PLAYER;
entities_u.put(name, dummy);
}
for(RowEntity row : entities_u.values())
@ -88,7 +92,7 @@ public class InternalCache
final ArrayList<RowPermission> permissions_p2g = new ArrayList<>();
final ArrayList<RowPermission> permissions_p2u = new ArrayList<>();
for(RowPermission row : rows)
if(row.entityType == EntityType.group)
if(row.entityType == EntityType.GROUP)
{
row.entityObject = entities_g.get(row.entity.toLowerCase());
permissions_p2g.add(row);
@ -118,7 +122,7 @@ public class InternalCache
final ArrayList<RowInheritance> inheritance_g2g = new ArrayList<>();
final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>();
for(RowInheritance row : rows)
if(row.childType == EntityType.group)
if(row.childType == EntityType.GROUP)
{
row.entityChild = entities_g.get(row.entity.toLowerCase());
row.entityParent = entities_g.get(row.parent.toLowerCase());
@ -148,7 +152,7 @@ public class InternalCache
Collections.sort(inheritances);
entry.getValue().inheritance = inheritances.toArray(new RowInheritance[inheritances.size()]);
}
defaultInheritance.childType = EntityType.player;
defaultInheritance.childType = EntityType.PLAYER;
defaultInheritance.entityParent = entities_g.get(defaultInheritance.parent.toLowerCase());
}
public synchronized ResolutionResult resolvePlayer(String player)
@ -166,6 +170,8 @@ public class InternalCache
{
final ArrayList<RowPermission> applicablePermissions = new ArrayList<>();
final ArrayList<RowInheritance> applicableInheritance = new ArrayList<>();
if(implicit_u != null && implicit_u.permissions != null)
processPermissions(params, Arrays.asList(implicit_u.permissions));
params.groupList = new LinkedHashSet<>();
params.finalPerms = new HashMap<>();
params.instantiator = "";
@ -199,6 +205,8 @@ public class InternalCache
}
private ResolutionResult resolveParent(ResolutionParams params)
{
if(implicit_g != null && implicit_g.permissions != null)
processPermissions(params, Arrays.asList(implicit_g.permissions));
final RowEntity currentParent = params.parentEntity;
final String instantiator = params.instantiator;
final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>();
@ -235,21 +243,18 @@ public class InternalCache
result.prefix = "%";
if(result.suffix == null || "".equals(result.suffix))
result.suffix = "%";
if(intermediate.size() > 0)
final StringBuilder sbp = new StringBuilder();
final StringBuilder sbs = new StringBuilder();
for(ResolutionResult inherited : intermediate)
{
final StringBuilder sbp = new StringBuilder();
final StringBuilder sbs = new StringBuilder();
for(ResolutionResult inherited : intermediate)
{
if(inherited.prefix != null)
sbp.append(inherited.prefix);
if(inherited.suffix != null)
sbs.append(inherited.suffix);
}
intermediate.clear();
result.prefix = result.prefix.replace(Settings.textInheriter, sbp.toString());
result.suffix = result.suffix.replace(Settings.textInheriter, sbs.toString());
if(inherited.prefix != null)
sbp.append(inherited.prefix);
if(inherited.suffix != null)
sbs.append(inherited.suffix);
}
intermediate.clear();
result.prefix = result.prefix.replace(Settings.textInheriter, sbp.toString());
result.suffix = result.suffix.replace(Settings.textInheriter, sbs.toString());
result.prefix = result.prefix.replace(Settings.instantiator, params.instantiator);
result.suffix = result.suffix.replace(Settings.instantiator, params.instantiator);
return result;
@ -282,5 +287,7 @@ public class InternalCache
{
entities_g.clear();
entities_u.clear();
implicit_g = null;
implicit_u = null;
}
}

13
src/main/java/ru/simsonic/rscPermissions/Engine/Phrases.java

@ -20,6 +20,8 @@ public enum Phrases
INTEGRATION_WG_N ("integration.worldguard-no"),
INTEGRATION_R_Y ("integration.residence-yes"),
INTEGRATION_R_N ("integration.residence-no"),
DEBUG_ON ("debug.enabled"),
DEBUG_OFF ("debug.disabled"),
MYSQL_FETCHED ("mysql.fetched"),
;
private final String node;
@ -48,12 +50,11 @@ public enum Phrases
try
{
final File langFile = new File(workingDir, langName + ".yml");
if(!langFile.isFile())
{
final FileChannel fileChannel = new FileOutputStream(langFile).getChannel();
final InputStream langStream = BukkitPluginMain.class.getResourceAsStream("/languages/" + langName + ".yml");
fileChannel.transferFrom(Channels.newChannel(langStream), 0, Long.MAX_VALUE);
}
if(langFile.isFile())
langFile.delete();
final FileChannel fileChannel = new FileOutputStream(langFile).getChannel();
final InputStream langStream = BukkitPluginMain.class.getResourceAsStream("/languages/" + langName + ".yml");
fileChannel.transferFrom(Channels.newChannel(langStream), 0, Long.MAX_VALUE);
} catch(IOException ex) {
}
}

6
src/main/java/ru/simsonic/rscPermissions/IndependentMain.java

@ -36,15 +36,15 @@ public class IndependentMain
System.out.println("Loading permissions from json files.");
final DatabaseContents contents = localJsn.retrieveContents();
System.out.println("Filter and calculating permission tree.");
contents.filterServerId("localtest").filterLifetime();
contents.filterServerId("Primary").filterLifetime();
if(contents.isEmpty())
{
System.out.println("Permission database is empty, stopping.");
return;
}
intCache.setDefaultGroup("Moderators", true);
intCache.setDefaultGroup("Default", true);
intCache.fill(contents);
final ResolutionResult result = intCache.resolvePlayer("rscpTester");
final ResolutionResult result = intCache.resolvePlayer("Reality_SC");
// Sorted output
ArrayList<String> perms = new ArrayList<>(result.permissions.keySet());
Collections.sort(perms);

3
src/main/resources/languages/english.yml

@ -10,5 +10,8 @@ integration:
worldguard-no: "{_YL}WorldGuard was not found."
residence-yes: "{_LG}Residence was found and integrated."
residence-no: "{_YL}Residence was not found."
debug:
enable: "{_LS}You will see a lot of debugging information now."
disable: "{_LS}Debugging information is now hidden for you."
mysql:
fetched: "[rscp] "

3
src/main/resources/languages/russian.yml

@ -10,5 +10,8 @@ integration:
worldguard-no: "{_YL}WorldGuard не обнаружен."
residence-yes: "{_LG}Residence обнаружён и подключён."
residence-no: "{_YL}Residence не обнаружен."
debug:
enable: "{_LS}Теперь Вы будете видеть отладочную информацию."
disable: "{_LS}Отладочная информация теперь скрыта от Вас."
mysql:
fetched: "[rscp] "

Loading…
Cancel
Save