Browse Source

Fix inapplicable player prefixes.

master
Stanislav Usenkov 10 years ago
parent
commit
3a3baf7d98
  1. 2
      src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java
  2. 7
      src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java
  3. 24
      src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java
  4. 7
      src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java
  5. 2
      src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
  6. 19
      src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java
  7. 1
      src/main/java/ru/simsonic/rscPermissions/Engine/Matchers.java
  8. 1
      src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionParams.java
  9. 7
      src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
  10. 2
      src/main/java/ru/simsonic/rscPermissions/IndependentMain.java

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

@ -4,7 +4,7 @@ import ru.simsonic.rscPermissions.Engine.Matchers;
public enum PlayerType public enum PlayerType
{ {
NAME(0), // 16 chars max NAME(0), // 16 chars [_a-zA-Z0-9] max
UUID(1), // 550e8400-e29b-41d4-a716-446655440000 UUID(1), // 550e8400-e29b-41d4-a716-446655440000
DASHLESS_UUID(2), // 550e8400e29b41d4a716446655440000 DASHLESS_UUID(2), // 550e8400e29b41d4a716446655440000
INTERNET_WILDCARD(3), // 192.168.*.* INTERNET_WILDCARD(3), // 192.168.*.*

7
src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java

@ -2,7 +2,7 @@ package ru.simsonic.rscPermissions.API;
import java.sql.Timestamp; import java.sql.Timestamp;
public class RowEntity implements Cloneable public class RowEntity implements Cloneable, Comparable<RowEntity>
{ {
public int id; public int id;
public String entity; public String entity;
@ -18,4 +18,9 @@ public class RowEntity implements Cloneable
{ {
return (RowEntity)super.clone(); return (RowEntity)super.clone();
} }
@Override
public int compareTo(RowEntity other)
{
return id - other.id;
}
} }

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

@ -39,26 +39,10 @@ public class RowInheritance implements Cloneable, Comparable<RowInheritance>
return (RowInheritance)super.clone(); return (RowInheritance)super.clone();
} }
@Override @Override
public int compareTo(RowInheritance t) public int compareTo(RowInheritance other)
{ {
return (priority != t.priority) return (priority != other.priority)
? priority - t.priority ? priority - other.priority
: parent.compareTo(t.parent); : parent.compareTo(other.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;
} }
} }

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

@ -20,11 +20,4 @@ public class RowPermission implements Cloneable
{ {
return (RowPermission)super.clone(); return (RowPermission)super.clone();
} }
public boolean isEntityApplicable(String identifier)
{
if(EntityType.GROUP.equals(entityType))
return entity.equalsIgnoreCase(identifier);
// TO DO
return false;
}
} }

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

@ -202,7 +202,7 @@ public class BukkitCommands
throw new CommandAnswerException(answer); throw new CommandAnswerException(answer);
case "lg": case "lg":
answer.add("Group list for user {_YL}" + args[1] + "{_LS}:"); answer.add("Group list for user {_YL}" + args[1] + "{_LS}:");
for(String group : result.groups) for(String group : result.getOrderedGroups())
answer.add("{_LG}" + group); answer.add("{_LG}" + group);
throw new CommandAnswerException(answer); throw new CommandAnswerException(answer);
case "p": case "p":

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

@ -171,6 +171,7 @@ public class InternalCache
} }
public synchronized ResolutionResult resolvePlayer(ResolutionParams params) public synchronized ResolutionResult resolvePlayer(ResolutionParams params)
{ {
final ArrayList<RowEntity> applicableEntities = new ArrayList<>();
final ArrayList<RowPermission> applicablePermissions = new ArrayList<>(); final ArrayList<RowPermission> applicablePermissions = new ArrayList<>();
final ArrayList<RowInheritance> applicableInheritance = new ArrayList<>(); final ArrayList<RowInheritance> applicableInheritance = new ArrayList<>();
if(implicit_u != null && implicit_u.permissions != null) if(implicit_u != null && implicit_u.permissions != null)
@ -183,12 +184,17 @@ public class InternalCache
for(String identifier : params.applicableIdentifiers) for(String identifier : params.applicableIdentifiers)
if(row.playerType.isEntityApplicable(row.entity, identifier)) if(row.playerType.isEntityApplicable(row.entity, identifier))
{ {
// Apply direct inheritance
if(row.inheritance != null && row.inheritance.length > 0) if(row.inheritance != null && row.inheritance.length > 0)
for(RowInheritance inheritance : row.inheritance) for(RowInheritance inheritance : row.inheritance)
if(isInheritanceApplicable(params, inheritance)) if(isInheritanceApplicable(params, inheritance))
applicableInheritance.add(inheritance); applicableInheritance.add(inheritance);
// Apply direct permissions
applicablePermissions.addAll(Arrays.asList(row.permissions)); applicablePermissions.addAll(Arrays.asList(row.permissions));
// Apply direct prefixes and suffixes
applicableEntities.add(row);
} }
Collections.sort(applicableEntities);
final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>(); final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>();
Collections.sort(applicableInheritance); Collections.sort(applicableInheritance);
// Mix into default inheritance // Mix into default inheritance
@ -200,7 +206,14 @@ public class InternalCache
params.parentEntity = row.entityParent; params.parentEntity = row.entityParent;
intermediateResults.add(resolveParent(params)); 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.prefix = GenericChatCodes.processStringStatic(result.prefix);
result.suffix = GenericChatCodes.processStringStatic(result.suffix); result.suffix = GenericChatCodes.processStringStatic(result.suffix);
processPermissions(params, applicablePermissions); processPermissions(params, applicablePermissions);
@ -232,6 +245,7 @@ public class InternalCache
params.parentEntity = currentParent; params.parentEntity = currentParent;
params.instantiator = instantiator; params.instantiator = instantiator;
final ResolutionResult result = processPrefixesAndSuffixes(params, intermediateResults); final ResolutionResult result = processPrefixesAndSuffixes(params, intermediateResults);
intermediateResults.clear();
// Permissions // Permissions
if(currentParent.permissions != null) if(currentParent.permissions != null)
processPermissions(params, Arrays.asList(currentParent.permissions)); processPermissions(params, Arrays.asList(currentParent.permissions));
@ -247,7 +261,7 @@ public class InternalCache
} }
return ""; return "";
} }
private ResolutionResult processPrefixesAndSuffixes(ResolutionParams params, ArrayList<ResolutionResult> intermediate) private ResolutionResult processPrefixesAndSuffixes(ResolutionParams params, List<ResolutionResult> intermediate)
{ {
final ResolutionResult result = new ResolutionResult(); final ResolutionResult result = new ResolutionResult();
result.prefix = params.parentEntity.prefix; result.prefix = params.parentEntity.prefix;
@ -265,7 +279,6 @@ public class InternalCache
if(inherited.suffix != null) if(inherited.suffix != null)
sbs.append(inherited.suffix); sbs.append(inherited.suffix);
} }
intermediate.clear();
result.prefix = result.prefix.replace(Settings.textInheriter, sbp.toString()); result.prefix = result.prefix.replace(Settings.textInheriter, sbp.toString());
result.suffix = result.suffix.replace(Settings.textInheriter, sbs.toString()); result.suffix = result.suffix.replace(Settings.textInheriter, sbs.toString());
result.prefix = result.prefix.replace(Settings.instantiator, params.instantiator); result.prefix = result.prefix.replace(Settings.instantiator, params.instantiator);

1
src/main/java/ru/simsonic/rscPermissions/Engine/Matchers.java

@ -1,4 +1,5 @@
package ru.simsonic.rscPermissions.Engine; package ru.simsonic.rscPermissions.Engine;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;

1
src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionParams.java

@ -1,4 +1,5 @@
package ru.simsonic.rscPermissions.Engine; package ru.simsonic.rscPermissions.Engine;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import ru.simsonic.rscPermissions.API.RowEntity; import ru.simsonic.rscPermissions.API.RowEntity;

7
src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java

@ -1,6 +1,7 @@
package ru.simsonic.rscPermissions.Engine; package ru.simsonic.rscPermissions.Engine;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.API.Settings;
@ -11,7 +12,7 @@ public class ResolutionResult
public String prefix; public String prefix;
public String suffix; public String suffix;
public Map<String, Boolean> permissions; public Map<String, Boolean> permissions;
public Set<String> groups; protected Set<String> groups;
public boolean hasPermission(String permission) public boolean hasPermission(String permission)
{ {
for(Map.Entry<String, Boolean> entry : permissions.entrySet()) for(Map.Entry<String, Boolean> entry : permissions.entrySet())
@ -31,6 +32,10 @@ public class ResolutionResult
} }
return false; return false;
} }
public Set<String> getOrderedGroups()
{
return Collections.unmodifiableSet(groups);
}
public String[] getDeorderedGroups() public String[] getDeorderedGroups()
{ {
final ArrayList<String> list = new ArrayList(groups.size()); final ArrayList<String> list = new ArrayList(groups.size());

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

@ -50,7 +50,7 @@ public class IndependentMain
Collections.sort(perms); Collections.sort(perms);
for(String key : perms) for(String key : perms)
System.out.println("Permission: " + key + " = " + result.permissions.get(key)); 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("Parent: " + group);
System.out.println("Prefix: " + result.prefix); System.out.println("Prefix: " + result.prefix);
System.out.println("Suffix: " + result.suffix); System.out.println("Suffix: " + result.suffix);

Loading…
Cancel
Save