From 3a3baf7d988c91fafa2057d999e8542bdfce830a Mon Sep 17 00:00:00 2001 From: Stanislav Usenkov Date: Tue, 12 May 2015 15:22:40 +0600 Subject: [PATCH] Fix inapplicable player prefixes. --- .../rscPermissions/API/PlayerType.java | 2 +- .../rscPermissions/API/RowEntity.java | 7 +++++- .../rscPermissions/API/RowInheritance.java | 24 ++++--------------- .../rscPermissions/API/RowPermission.java | 7 ------ .../Bukkit/Commands/BukkitCommands.java | 2 +- .../rscPermissions/Engine/InternalCache.java | 19 ++++++++++++--- .../rscPermissions/Engine/Matchers.java | 1 + .../Engine/ResolutionParams.java | 1 + .../Engine/ResolutionResult.java | 7 +++++- .../rscPermissions/IndependentMain.java | 2 +- 10 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java b/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java index 316d97a..1f453eb 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java @@ -4,7 +4,7 @@ import ru.simsonic.rscPermissions.Engine.Matchers; public enum PlayerType { - NAME(0), // 16 chars max + 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.*.* diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java b/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java index 441f3f2..f0b5197 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java @@ -2,7 +2,7 @@ package ru.simsonic.rscPermissions.API; import java.sql.Timestamp; -public class RowEntity implements Cloneable +public class RowEntity implements Cloneable, Comparable { public int id; public String entity; @@ -18,4 +18,9 @@ public class RowEntity implements Cloneable { return (RowEntity)super.clone(); } + @Override + public int compareTo(RowEntity other) + { + return id - other.id; + } } diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java b/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java index 8f6b7d3..279b91b 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java @@ -39,26 +39,10 @@ public class RowInheritance implements Cloneable, Comparable return (RowInheritance)super.clone(); } @Override - public int compareTo(RowInheritance t) + public int compareTo(RowInheritance other) { - return (priority != t.priority) - ? priority - t.priority - : parent.compareTo(t.parent); - } - public boolean isEntityApplicable(String identifier) - { - if(EntityType.GROUP.equals(childType)) - return entity.equalsIgnoreCase(identifier); - switch(playerType) - { - case NAME: - return entity.equals(identifier); - case UUID: - identifier = identifier.replace("-", ""); - case DASHLESS_UUID: - return entity.equals(identifier); - } - // TO DO - return false; + return (priority != other.priority) + ? priority - other.priority + : parent.compareTo(other.parent); } } diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java b/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java index 8cc14dd..ec2f118 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java @@ -20,11 +20,4 @@ public class RowPermission implements Cloneable { return (RowPermission)super.clone(); } - public boolean isEntityApplicable(String identifier) - { - if(EntityType.GROUP.equals(entityType)) - return entity.equalsIgnoreCase(identifier); - // TO DO - return false; - } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java index 8f76849..a4b77d9 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java @@ -202,7 +202,7 @@ public class BukkitCommands throw new CommandAnswerException(answer); case "lg": answer.add("Group list for user {_YL}" + args[1] + "{_LS}:"); - for(String group : result.groups) + for(String group : result.getOrderedGroups()) answer.add("{_LG}" + group); throw new CommandAnswerException(answer); case "p": diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java index 124f188..fd5d38c 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java @@ -171,6 +171,7 @@ public class InternalCache } public synchronized ResolutionResult resolvePlayer(ResolutionParams params) { + final ArrayList applicableEntities = new ArrayList<>(); final ArrayList applicablePermissions = new ArrayList<>(); final ArrayList applicableInheritance = new ArrayList<>(); if(implicit_u != null && implicit_u.permissions != null) @@ -183,12 +184,17 @@ public class InternalCache for(String identifier : params.applicableIdentifiers) if(row.playerType.isEntityApplicable(row.entity, identifier)) { + // Apply direct inheritance if(row.inheritance != null && row.inheritance.length > 0) for(RowInheritance inheritance : row.inheritance) if(isInheritanceApplicable(params, inheritance)) applicableInheritance.add(inheritance); + // Apply direct permissions applicablePermissions.addAll(Arrays.asList(row.permissions)); + // Apply direct prefixes and suffixes + applicableEntities.add(row); } + Collections.sort(applicableEntities); final ArrayList intermediateResults = new ArrayList<>(); Collections.sort(applicableInheritance); // Mix into default inheritance @@ -200,7 +206,14 @@ public class InternalCache params.parentEntity = row.entityParent; intermediateResults.add(resolveParent(params)); } - final ResolutionResult result = processPrefixesAndSuffixes(params, intermediateResults); + // Process all applicable prefixes using only entity id order + ResolutionResult result = processPrefixesAndSuffixes(params, intermediateResults); + for(RowEntity row : applicableEntities) + { + params.instantiator = ""; + params.parentEntity = row; + result = processPrefixesAndSuffixes(params, Arrays.asList(new ResolutionResult[] { result })); + } result.prefix = GenericChatCodes.processStringStatic(result.prefix); result.suffix = GenericChatCodes.processStringStatic(result.suffix); processPermissions(params, applicablePermissions); @@ -232,6 +245,7 @@ public class InternalCache params.parentEntity = currentParent; params.instantiator = instantiator; final ResolutionResult result = processPrefixesAndSuffixes(params, intermediateResults); + intermediateResults.clear(); // Permissions if(currentParent.permissions != null) processPermissions(params, Arrays.asList(currentParent.permissions)); @@ -247,7 +261,7 @@ public class InternalCache } return ""; } - private ResolutionResult processPrefixesAndSuffixes(ResolutionParams params, ArrayList intermediate) + private ResolutionResult processPrefixesAndSuffixes(ResolutionParams params, List intermediate) { final ResolutionResult result = new ResolutionResult(); result.prefix = params.parentEntity.prefix; @@ -265,7 +279,6 @@ public class InternalCache 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); diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Matchers.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Matchers.java index d5733f6..b010e5c 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Matchers.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Matchers.java @@ -1,4 +1,5 @@ package ru.simsonic.rscPermissions.Engine; + import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionParams.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionParams.java index e629e0b..0e16974 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionParams.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionParams.java @@ -1,4 +1,5 @@ package ru.simsonic.rscPermissions.Engine; + import java.util.Map; import java.util.Set; import ru.simsonic.rscPermissions.API.RowEntity; diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java index f3af936..794a970 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java @@ -1,6 +1,7 @@ package ru.simsonic.rscPermissions.Engine; import java.util.ArrayList; +import java.util.Collections; import java.util.Map; import java.util.Set; import ru.simsonic.rscPermissions.API.Settings; @@ -11,7 +12,7 @@ public class ResolutionResult public String prefix; public String suffix; public Map permissions; - public Set groups; + protected Set groups; public boolean hasPermission(String permission) { for(Map.Entry entry : permissions.entrySet()) @@ -31,6 +32,10 @@ public class ResolutionResult } return false; } + public Set getOrderedGroups() + { + return Collections.unmodifiableSet(groups); + } public String[] getDeorderedGroups() { final ArrayList list = new ArrayList(groups.size()); diff --git a/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java b/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java index 98a51c1..db86d09 100644 --- a/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/IndependentMain.java @@ -50,7 +50,7 @@ public class IndependentMain Collections.sort(perms); for(String key : perms) System.out.println("Permission: " + key + " = " + result.permissions.get(key)); - for(String group : result.groups) + for(String group : result.getOrderedGroups()) System.out.println("Parent: " + group); System.out.println("Prefix: " + result.prefix); System.out.println("Suffix: " + result.suffix);