Fix world permission checks.

* Ignore item frames during entity-chunk-spawn checks.
This commit is contained in:
bloodshot 2019-12-02 21:51:26 -05:00
parent 4433d9c2f3
commit 3a8de49049
9 changed files with 96 additions and 104 deletions

View File

@ -126,6 +126,7 @@ public class GDClaim implements Claim {
// Permission Context // Permission Context
private final Context context; private final Context context;
private final Context overrideClaimContext; private final Context overrideClaimContext;
private final Context worldContext;
private UUID id = null; private UUID id = null;
private UUID ownerUniqueId; private UUID ownerUniqueId;
@ -167,6 +168,7 @@ public GDClaim(World world, Vector3i point1, Vector3i point2, ClaimType type, UU
this.type = type; this.type = type;
this.id = UUID.randomUUID(); this.id = UUID.randomUUID();
this.context = new Context("gd_claim", this.id.toString()); this.context = new Context("gd_claim", this.id.toString());
this.worldContext = new Context("world", world.getName().toLowerCase());
this.overrideClaimContext = new Context("gd_claim_override", this.id.toString()); this.overrideClaimContext = new Context("gd_claim_override", this.id.toString());
this.cuboid = cuboid; this.cuboid = cuboid;
this.parent = parent; this.parent = parent;
@ -198,6 +200,7 @@ public GDClaim(World world, Vector3i lesserBoundaryCorner, Vector3i greaterBound
this.type = type; this.type = type;
this.cuboid = cuboid; this.cuboid = cuboid;
this.context = new Context("gd_claim", this.id.toString()); this.context = new Context("gd_claim", this.id.toString());
this.worldContext = new Context("world", world.getName().toLowerCase());
this.hashCode = this.id.hashCode(); this.hashCode = this.id.hashCode();
this.worldClaimManager = GriefDefenderPlugin.getInstance().dataStore.getClaimWorldManager(this.world.getUID()); this.worldClaimManager = GriefDefenderPlugin.getInstance().dataStore.getClaimWorldManager(this.world.getUID());
if (this.type == ClaimTypes.WILDERNESS) { if (this.type == ClaimTypes.WILDERNESS) {
@ -3019,6 +3022,10 @@ public Context getOverrideClaimContext() {
return this.overrideClaimContext; return this.overrideClaimContext;
} }
public Context getWorldContext() {
return this.worldContext;
}
@Override @Override
public Map<String, ClaimSchematic> getSchematics() { public Map<String, ClaimSchematic> getSchematics() {
return this.schematics; return this.schematics;

View File

@ -382,7 +382,9 @@ protected void showFlagPermissions(GDPermissionUser src, GDClaim claim, MenuType
defaultContexts.add(ClaimContexts.WILDERNESS_DEFAULT_CONTEXT); defaultContexts.add(ClaimContexts.WILDERNESS_DEFAULT_CONTEXT);
overrideContexts.add(ClaimContexts.WILDERNESS_OVERRIDE_CONTEXT); overrideContexts.add(ClaimContexts.WILDERNESS_OVERRIDE_CONTEXT);
} }
defaultContexts.add(claim.getWorldContext());
defaultContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); defaultContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT);
overrideContexts.add(claim.getWorldContext());
overrideContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); overrideContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT);
overrideContexts.add(claim.getOverrideClaimContext()); overrideContexts.add(claim.getOverrideClaimContext());
@ -622,6 +624,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD
filteredContexts.addAll(flagData.getContexts()); filteredContexts.addAll(flagData.getContexts());
Set<Context> newContexts = new HashSet<>(filteredContexts); Set<Context> newContexts = new HashSet<>(filteredContexts);
newContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); newContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT);
newContexts.add(claim.getWorldContext());
newContexts.add(claim.getOverrideTypeContext()); newContexts.add(claim.getOverrideTypeContext());
newContexts.add(claim.getOverrideClaimContext()); newContexts.add(claim.getOverrideClaimContext());
Tristate result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); Tristate result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim");
@ -632,6 +635,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD
// Check claim // Check claim
newContexts = new HashSet<>(filteredContexts); newContexts = new HashSet<>(filteredContexts);
newContexts.add(claim.getWorldContext());
newContexts.add(claim.getContext()); newContexts.add(claim.getContext());
result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim");
if (result != Tristate.UNDEFINED) { if (result != Tristate.UNDEFINED) {
@ -641,6 +645,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD
// Check default // Check default
newContexts = new HashSet<>(filteredContexts); newContexts = new HashSet<>(filteredContexts);
newContexts.add(claim.getWorldContext());
newContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); newContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT);
newContexts.add(claim.getDefaultTypeContext()); newContexts.add(claim.getDefaultTypeContext());
result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim");

View File

@ -213,6 +213,7 @@ public Tristate getFinalPermission(Event event, Location location, Set<Context>
} }
contexts.addAll(sourceContexts); contexts.addAll(sourceContexts);
contexts.addAll(targetContexts); contexts.addAll(targetContexts);
contexts.add(((GDClaim) claim).getWorldContext());
this.eventContexts = contexts; this.eventContexts = contexts;
this.eventPlayerData = playerData; this.eventPlayerData = playerData;
@ -374,6 +375,7 @@ private Tristate getFlagOverride(Claim claim, GDPermissionHolder permissionHolde
player = permissionHolder instanceof GDPermissionUser ? ((GDPermissionUser) permissionHolder).getOnlinePlayer() : null; player = permissionHolder instanceof GDPermissionUser ? ((GDPermissionUser) permissionHolder).getOnlinePlayer() : null;
} }
contexts.add(((GDClaim) claim).getWorldContext());
contexts.add(claim.getOverrideClaimContext()); contexts.add(claim.getOverrideClaimContext());
contexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); contexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT);
contexts.addAll(this.eventContexts); contexts.addAll(this.eventContexts);

View File

@ -358,29 +358,24 @@ public Map<Set<Context>, Map<String, Boolean>> getPermanentPermissions(GDPermiss
final ImmutableCollection<Node> nodes = permissionHolder.getNodes().values(); final ImmutableCollection<Node> nodes = permissionHolder.getNodes().values();
Map<Set<Context>, Map<String, Boolean>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, Boolean>>(CONTEXT_COMPARATOR); Map<Set<Context>, Map<String, Boolean>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, Boolean>>(CONTEXT_COMPARATOR);
Map<ContextSet, Set<Context>> contextMap = new HashMap<>();
for (Node node : nodes) { for (Node node : nodes) {
if (node.isMeta()) { if (node.isMeta()) {
continue; continue;
} }
String serverName = node.getServer().orElse(null); String serverName = node.getServer().orElse(null);
final String worldName = node.getWorld().orElse(null);
if (serverName != null && serverName.equalsIgnoreCase("global")) { if (serverName != null && serverName.equalsIgnoreCase("global")) {
serverName = null; serverName = null;
} }
Set<Context> contexts = null; Set<Context> contexts = getGPContexts(node.getContexts());
if (contextMap.get(node.getContexts()) == null) {
contexts = getGPContexts(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName));
}
contextMap.put(node.getContexts(), contexts);
} else {
contexts = contextMap.get(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName)); contexts.add(new Context("server", serverName));
} }
if (worldName != null) {
contexts.add(new Context("world", worldName.toLowerCase()));
} }
Map<String, Boolean> permissionEntry = permanentPermissionMap.get(contexts); Map<String, Boolean> permissionEntry = permanentPermissionMap.get(contexts);
if (permissionEntry == null) { if (permissionEntry == null) {
permissionEntry = new HashMap<>(); permissionEntry = new HashMap<>();
@ -402,29 +397,24 @@ public Map<Set<Context>, Map<String, Boolean>> getTransientPermissions(GDPermiss
final Set<? extends Node> nodes = permissionHolder.getTransientPermissions(); final Set<? extends Node> nodes = permissionHolder.getTransientPermissions();
Map<Set<Context>, Map<String, Boolean>> transientPermissionMap = new TreeMap<Set<Context>, Map<String, Boolean>>(CONTEXT_COMPARATOR); Map<Set<Context>, Map<String, Boolean>> transientPermissionMap = new TreeMap<Set<Context>, Map<String, Boolean>>(CONTEXT_COMPARATOR);
Map<ContextSet, Set<Context>> contextMap = new HashMap<>();
for (Node node : nodes) { for (Node node : nodes) {
if (node.isMeta()) { if (node.isMeta()) {
continue; continue;
} }
String serverName = node.getServer().orElse(null); String serverName = node.getServer().orElse(null);
final String worldName = node.getWorld().orElse(null);
if (serverName != null && serverName.equalsIgnoreCase("global")) { if (serverName != null && serverName.equalsIgnoreCase("global")) {
serverName = null; serverName = null;
} }
Set<Context> contexts = null; Set<Context> contexts = getGPContexts(node.getContexts());
if (contextMap.get(node.getContexts()) == null) {
contexts = getGPContexts(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName));
}
contextMap.put(node.getContexts(), contexts);
} else {
contexts = contextMap.get(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName)); contexts.add(new Context("server", serverName));
} }
if (worldName != null) {
contexts.add(new Context("world", worldName.toLowerCase()));
} }
Map<String, Boolean> permissionEntry = transientPermissionMap.get(contexts); Map<String, Boolean> permissionEntry = transientPermissionMap.get(contexts);
if (permissionEntry == null) { if (permissionEntry == null) {
permissionEntry = new HashMap<>(); permissionEntry = new HashMap<>();
@ -445,28 +435,23 @@ public Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHo
final ImmutableCollection<Node> nodes = permissionHolder.getNodes().values(); final ImmutableCollection<Node> nodes = permissionHolder.getNodes().values();
Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR); Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR);
Map<ContextSet, Set<Context>> contextMap = new HashMap<>();
for (Node node : nodes) { for (Node node : nodes) {
if (!node.isMeta()) { if (!node.isMeta()) {
continue; continue;
} }
String serverName = node.getServer().orElse(null); String serverName = node.getServer().orElse(null);
final String worldName = node.getWorld().orElse(null);
if (serverName != null && serverName.equalsIgnoreCase("global")) { if (serverName != null && serverName.equalsIgnoreCase("global")) {
serverName = null; serverName = null;
} }
Set<Context> contexts = null; Set<Context> contexts = getGPContexts(node.getContexts());
if (contextMap.get(node.getContexts()) == null) {
contexts = getGPContexts(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName));
}
contextMap.put(node.getContexts(), contexts);
} else {
contexts = contextMap.get(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName)); contexts.add(new Context("server", serverName));
} }
if (worldName != null) {
contexts.add(new Context("world", worldName.toLowerCase()));
} }
Map<String, String> metaEntry = permanentPermissionMap.get(contexts); Map<String, String> metaEntry = permanentPermissionMap.get(contexts);
if (metaEntry == null) { if (metaEntry == null) {
metaEntry = new HashMap<>(); metaEntry = new HashMap<>();
@ -487,28 +472,23 @@ public Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHo
final Set<? extends Node> nodes = permissionHolder.getTransientPermissions(); final Set<? extends Node> nodes = permissionHolder.getTransientPermissions();
Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR); Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR);
Map<ContextSet, Set<Context>> contextMap = new HashMap<>();
for (Node node : nodes) { for (Node node : nodes) {
if (!node.isMeta()) { if (!node.isMeta()) {
continue; continue;
} }
String serverName = node.getServer().orElse(null); String serverName = node.getServer().orElse(null);
final String worldName = node.getWorld().orElse(null);
if (serverName != null && serverName.equalsIgnoreCase("global")) { if (serverName != null && serverName.equalsIgnoreCase("global")) {
serverName = null; serverName = null;
} }
Set<Context> contexts = null; Set<Context> contexts = getGPContexts(node.getContexts());
if (contextMap.get(node.getContexts()) == null) {
contexts = getGPContexts(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName));
}
contextMap.put(node.getContexts(), contexts);
} else {
contexts = contextMap.get(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName)); contexts.add(new Context("server", serverName));
} }
if (worldName != null) {
contexts.add(new Context("world", worldName.toLowerCase()));
} }
Map<String, String> metaEntry = permanentPermissionMap.get(contexts); Map<String, String> metaEntry = permanentPermissionMap.get(contexts);
if (metaEntry == null) { if (metaEntry == null) {
metaEntry = new HashMap<>(); metaEntry = new HashMap<>();

View File

@ -133,6 +133,7 @@ public class GDClaim implements Claim {
// Permission Context // Permission Context
private final Context context; private final Context context;
private final Context overrideClaimContext; private final Context overrideClaimContext;
private final Context worldContext;
private final org.spongepowered.api.service.context.Context spongeContext; private final org.spongepowered.api.service.context.Context spongeContext;
private final org.spongepowered.api.service.context.Context spongeOverrideClaimContext; private final org.spongepowered.api.service.context.Context spongeOverrideClaimContext;
@ -176,6 +177,7 @@ public GDClaim(World world, Vector3i point1, Vector3i point2, ClaimType type, UU
this.type = type; this.type = type;
this.id = UUID.randomUUID(); this.id = UUID.randomUUID();
this.context = new Context("gd_claim", this.id.toString()); this.context = new Context("gd_claim", this.id.toString());
this.worldContext = new Context(world.getContext().getKey(), world.getContext().getValue().toLowerCase());
this.overrideClaimContext = new Context("gd_claim_override", this.id.toString()); this.overrideClaimContext = new Context("gd_claim_override", this.id.toString());
this.spongeContext = SpongeUtil.getSpongeContext(this.context); this.spongeContext = SpongeUtil.getSpongeContext(this.context);
this.spongeOverrideClaimContext = SpongeUtil.getSpongeContext(this.overrideClaimContext); this.spongeOverrideClaimContext = SpongeUtil.getSpongeContext(this.overrideClaimContext);
@ -209,6 +211,7 @@ public GDClaim(World world, Vector3i lesserBoundaryCorner, Vector3i greaterBound
this.type = type; this.type = type;
this.cuboid = cuboid; this.cuboid = cuboid;
this.context = new Context("gd_claim", this.id.toString()); this.context = new Context("gd_claim", this.id.toString());
this.worldContext = new Context(world.getContext().getKey(), world.getContext().getValue().toLowerCase());
this.spongeContext = SpongeUtil.getSpongeContext(this.context); this.spongeContext = SpongeUtil.getSpongeContext(this.context);
this.spongeOverrideClaimContext = SpongeUtil.getSpongeContext(this.overrideClaimContext); this.spongeOverrideClaimContext = SpongeUtil.getSpongeContext(this.overrideClaimContext);
this.hashCode = this.id.hashCode(); this.hashCode = this.id.hashCode();
@ -3069,6 +3072,10 @@ public Context getOverrideClaimContext() {
return this.overrideClaimContext; return this.overrideClaimContext;
} }
public Context getWorldContext() {
return this.worldContext;
}
public org.spongepowered.api.service.context.Context getSpongeOverrideTypeContext() { public org.spongepowered.api.service.context.Context getSpongeOverrideTypeContext() {
if (this.isAdminClaim()) { if (this.isAdminClaim()) {
return SpongeContexts.ADMIN_OVERRIDE_CONTEXT; return SpongeContexts.ADMIN_OVERRIDE_CONTEXT;

View File

@ -382,7 +382,9 @@ protected void showFlagPermissions(GDPermissionUser src, GDClaim claim, MenuType
defaultContexts.add(ClaimContexts.WILDERNESS_DEFAULT_CONTEXT); defaultContexts.add(ClaimContexts.WILDERNESS_DEFAULT_CONTEXT);
overrideContexts.add(ClaimContexts.WILDERNESS_OVERRIDE_CONTEXT); overrideContexts.add(ClaimContexts.WILDERNESS_OVERRIDE_CONTEXT);
} }
defaultContexts.add(claim.getWorldContext());
defaultContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); defaultContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT);
overrideContexts.add(claim.getWorldContext());
overrideContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); overrideContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT);
overrideContexts.add(claim.getOverrideClaimContext()); overrideContexts.add(claim.getOverrideClaimContext());
@ -622,6 +624,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD
filteredContexts.addAll(flagData.getContexts()); filteredContexts.addAll(flagData.getContexts());
Set<Context> newContexts = new HashSet<>(filteredContexts); Set<Context> newContexts = new HashSet<>(filteredContexts);
newContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); newContexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT);
newContexts.add(claim.getWorldContext());
newContexts.add(claim.getOverrideTypeContext()); newContexts.add(claim.getOverrideTypeContext());
newContexts.add(claim.getOverrideClaimContext()); newContexts.add(claim.getOverrideClaimContext());
Tristate result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); Tristate result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim");
@ -632,6 +635,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD
// Check claim // Check claim
newContexts = new HashSet<>(filteredContexts); newContexts = new HashSet<>(filteredContexts);
newContexts.add(claim.getWorldContext());
newContexts.add(claim.getContext()); newContexts.add(claim.getContext());
result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim");
if (result != Tristate.UNDEFINED) { if (result != Tristate.UNDEFINED) {
@ -641,6 +645,7 @@ private Component getCustomClickableText(GDPermissionUser src, GDClaim claim, GD
// Check default // Check default
newContexts = new HashSet<>(filteredContexts); newContexts = new HashSet<>(filteredContexts);
newContexts.add(claim.getWorldContext());
newContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT); newContexts.add(ClaimContexts.GLOBAL_DEFAULT_CONTEXT);
newContexts.add(claim.getDefaultTypeContext()); newContexts.add(claim.getDefaultTypeContext());
result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim"); result = PermissionUtil.getInstance().getPermissionValueWithRequiredContexts(claim, GriefDefenderPlugin.DEFAULT_HOLDER, flagData.getFlag().getPermission(), newContexts, "gd_claim");

View File

@ -350,6 +350,10 @@ public boolean test(Entity entity) {
if (GriefDefenderPlugin.isTargetIdBlacklisted(Flags.ENTITY_CHUNK_SPAWN.getName(), entity, world.getProperties())) { if (GriefDefenderPlugin.isTargetIdBlacklisted(Flags.ENTITY_CHUNK_SPAWN.getName(), entity, world.getProperties())) {
return true; return true;
} }
// Always allow item frames in chunks to spawn
if (entity instanceof ItemFrame) {
return true;
}
permission = GDPermissions.ENTITY_CHUNK_SPAWN; permission = GDPermissions.ENTITY_CHUNK_SPAWN;
} }

View File

@ -272,6 +272,7 @@ public Tristate getFinalPermission(Event event, Location<World> location, Set<Co
} }
contexts.addAll(sourceContexts); contexts.addAll(sourceContexts);
contexts.addAll(targetContexts); contexts.addAll(targetContexts);
contexts.add(((GDClaim) claim).getWorldContext());
this.eventContexts = contexts; this.eventContexts = contexts;
this.eventPlayerData = playerData; this.eventPlayerData = playerData;
@ -428,6 +429,7 @@ private Tristate getFlagOverride(Claim claim, GDPermissionHolder permissionHolde
player = permissionHolder instanceof GDPermissionUser ? ((GDPermissionUser) permissionHolder).getOnlinePlayer() : null; player = permissionHolder instanceof GDPermissionUser ? ((GDPermissionUser) permissionHolder).getOnlinePlayer() : null;
} }
contexts.add(((GDClaim) claim).getWorldContext());
contexts.add(claim.getOverrideClaimContext()); contexts.add(claim.getOverrideClaimContext());
contexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT); contexts.add(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT);
contexts.addAll(this.eventContexts); contexts.addAll(this.eventContexts);

View File

@ -353,29 +353,24 @@ public Map<Set<Context>, Map<String, Boolean>> getPermanentPermissions(GDPermiss
final ImmutableCollection<Node> nodes = permissionHolder.getNodes().values(); final ImmutableCollection<Node> nodes = permissionHolder.getNodes().values();
Map<Set<Context>, Map<String, Boolean>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, Boolean>>(CONTEXT_COMPARATOR); Map<Set<Context>, Map<String, Boolean>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, Boolean>>(CONTEXT_COMPARATOR);
Map<ContextSet, Set<Context>> contextMap = new HashMap<>();
for (Node node : nodes) { for (Node node : nodes) {
if (node.isMeta()) { if (node.isMeta()) {
continue; continue;
} }
String serverName = node.getServer().orElse(null); String serverName = node.getServer().orElse(null);
final String worldName = node.getWorld().orElse(null);
if (serverName != null && serverName.equalsIgnoreCase("global")) { if (serverName != null && serverName.equalsIgnoreCase("global")) {
serverName = null; serverName = null;
} }
Set<Context> contexts = null; Set<Context> contexts = getGPContexts(node.getContexts());
if (contextMap.get(node.getContexts()) == null) {
contexts = getGPContexts(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName));
}
contextMap.put(node.getContexts(), contexts);
} else {
contexts = contextMap.get(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName)); contexts.add(new Context("server", serverName));
} }
if (worldName != null) {
contexts.add(new Context("world", worldName.toLowerCase()));
} }
Map<String, Boolean> permissionEntry = permanentPermissionMap.get(contexts); Map<String, Boolean> permissionEntry = permanentPermissionMap.get(contexts);
if (permissionEntry == null) { if (permissionEntry == null) {
permissionEntry = new HashMap<>(); permissionEntry = new HashMap<>();
@ -397,29 +392,24 @@ public Map<Set<Context>, Map<String, Boolean>> getTransientPermissions(GDPermiss
final Set<? extends Node> nodes = permissionHolder.getTransientPermissions(); final Set<? extends Node> nodes = permissionHolder.getTransientPermissions();
Map<Set<Context>, Map<String, Boolean>> transientPermissionMap = new TreeMap<Set<Context>, Map<String, Boolean>>(CONTEXT_COMPARATOR); Map<Set<Context>, Map<String, Boolean>> transientPermissionMap = new TreeMap<Set<Context>, Map<String, Boolean>>(CONTEXT_COMPARATOR);
Map<ContextSet, Set<Context>> contextMap = new HashMap<>();
for (Node node : nodes) { for (Node node : nodes) {
if (node.isMeta()) { if (node.isMeta()) {
continue; continue;
} }
String serverName = node.getServer().orElse(null); String serverName = node.getServer().orElse(null);
final String worldName = node.getWorld().orElse(null);
if (serverName != null && serverName.equalsIgnoreCase("global")) { if (serverName != null && serverName.equalsIgnoreCase("global")) {
serverName = null; serverName = null;
} }
Set<Context> contexts = null; Set<Context> contexts = getGPContexts(node.getContexts());
if (contextMap.get(node.getContexts()) == null) {
contexts = getGPContexts(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName));
}
contextMap.put(node.getContexts(), contexts);
} else {
contexts = contextMap.get(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName)); contexts.add(new Context("server", serverName));
} }
if (worldName != null) {
contexts.add(new Context("world", worldName.toLowerCase()));
} }
Map<String, Boolean> permissionEntry = transientPermissionMap.get(contexts); Map<String, Boolean> permissionEntry = transientPermissionMap.get(contexts);
if (permissionEntry == null) { if (permissionEntry == null) {
permissionEntry = new HashMap<>(); permissionEntry = new HashMap<>();
@ -440,28 +430,23 @@ public Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHo
final ImmutableCollection<Node> nodes = permissionHolder.getNodes().values(); final ImmutableCollection<Node> nodes = permissionHolder.getNodes().values();
Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR); Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR);
Map<ContextSet, Set<Context>> contextMap = new HashMap<>();
for (Node node : nodes) { for (Node node : nodes) {
if (!node.isMeta()) { if (!node.isMeta()) {
continue; continue;
} }
String serverName = node.getServer().orElse(null); String serverName = node.getServer().orElse(null);
final String worldName = node.getWorld().orElse(null);
if (serverName != null && serverName.equalsIgnoreCase("global")) { if (serverName != null && serverName.equalsIgnoreCase("global")) {
serverName = null; serverName = null;
} }
Set<Context> contexts = null; Set<Context> contexts = getGPContexts(node.getContexts());
if (contextMap.get(node.getContexts()) == null) {
contexts = getGPContexts(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName));
}
contextMap.put(node.getContexts(), contexts);
} else {
contexts = contextMap.get(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName)); contexts.add(new Context("server", serverName));
} }
if (worldName != null) {
contexts.add(new Context("world", worldName.toLowerCase()));
} }
Map<String, String> metaEntry = permanentPermissionMap.get(contexts); Map<String, String> metaEntry = permanentPermissionMap.get(contexts);
if (metaEntry == null) { if (metaEntry == null) {
metaEntry = new HashMap<>(); metaEntry = new HashMap<>();
@ -482,28 +467,23 @@ public Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHo
final Set<? extends Node> nodes = permissionHolder.getTransientPermissions(); final Set<? extends Node> nodes = permissionHolder.getTransientPermissions();
Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR); Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR);
Map<ContextSet, Set<Context>> contextMap = new HashMap<>();
for (Node node : nodes) { for (Node node : nodes) {
if (!node.isMeta()) { if (!node.isMeta()) {
continue; continue;
} }
String serverName = node.getServer().orElse(null); String serverName = node.getServer().orElse(null);
final String worldName = node.getWorld().orElse(null);
if (serverName != null && serverName.equalsIgnoreCase("global")) { if (serverName != null && serverName.equalsIgnoreCase("global")) {
serverName = null; serverName = null;
} }
Set<Context> contexts = null; Set<Context> contexts = getGPContexts(node.getContexts());
if (contextMap.get(node.getContexts()) == null) {
contexts = getGPContexts(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName));
}
contextMap.put(node.getContexts(), contexts);
} else {
contexts = contextMap.get(node.getContexts());
if (serverName != null && !serverName.equalsIgnoreCase("undefined")) { if (serverName != null && !serverName.equalsIgnoreCase("undefined")) {
contexts.add(new Context("server", serverName)); contexts.add(new Context("server", serverName));
} }
if (worldName != null) {
contexts.add(new Context("world", worldName.toLowerCase()));
} }
Map<String, String> metaEntry = permanentPermissionMap.get(contexts); Map<String, String> metaEntry = permanentPermissionMap.get(contexts);
if (metaEntry == null) { if (metaEntry == null) {
metaEntry = new HashMap<>(); metaEntry = new HashMap<>();