From f793fd5010e4563f1ea5e35f1f1aca085a69d95d Mon Sep 17 00:00:00 2001 From: Luck Date: Tue, 19 Dec 2017 22:48:53 +0000 Subject: [PATCH] pass and account for the holder type when building PermissionCalculators --- .../calculators/BukkitCalculatorFactory.java | 3 +- .../common/caching/HolderCachedData.java | 4 +- .../common/caching/type/PermissionCache.java | 4 +- .../PermissionCalculatorMetadata.java | 6 ++ .../calculators/SpongeCalculatorFactory.java | 10 +++- .../processors/GroupDefaultsProcessor.java | 58 +++++++++++++++++++ ...cessor.java => UserDefaultsProcessor.java} | 2 +- .../calculated/CalculatedSubjectData.java | 3 +- 8 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 sponge/src/main/java/me/lucko/luckperms/sponge/processors/GroupDefaultsProcessor.java rename sponge/src/main/java/me/lucko/luckperms/sponge/processors/{DefaultsProcessor.java => UserDefaultsProcessor.java} (97%) diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java index 76ad1c4d3..c259bdc01 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java @@ -41,6 +41,7 @@ import me.lucko.luckperms.common.processors.MapProcessor; import me.lucko.luckperms.common.processors.PermissionProcessor; import me.lucko.luckperms.common.processors.RegexProcessor; import me.lucko.luckperms.common.processors.WildcardProcessor; +import me.lucko.luckperms.common.references.HolderType; import java.util.List; @@ -66,7 +67,7 @@ public class BukkitCalculatorFactory extends AbstractCalculatorFactory { processors.add(new WildcardProcessor()); } - if (plugin.getConfiguration().get(ConfigKeys.APPLY_BUKKIT_DEFAULT_PERMISSIONS)) { + if (plugin.getConfiguration().get(ConfigKeys.APPLY_BUKKIT_DEFAULT_PERMISSIONS) && metadata.getHolderType() == HolderType.USER) { processors.add(new DefaultsProcessor(contexts.isOp(), plugin.getDefaultsProvider())); } diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/HolderCachedData.java b/common/src/main/java/me/lucko/luckperms/common/caching/HolderCachedData.java index 6303c77ae..cf8ef7a51 100644 --- a/common/src/main/java/me/lucko/luckperms/common/caching/HolderCachedData.java +++ b/common/src/main/java/me/lucko/luckperms/common/caching/HolderCachedData.java @@ -39,6 +39,7 @@ import me.lucko.luckperms.api.caching.MetaContexts; import me.lucko.luckperms.common.caching.type.MetaAccumulator; import me.lucko.luckperms.common.caching.type.MetaCache; import me.lucko.luckperms.common.caching.type.PermissionCache; +import me.lucko.luckperms.common.calculators.PermissionCalculatorMetadata; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.metastacking.SimpleMetaStack; import me.lucko.luckperms.common.model.PermissionHolder; @@ -85,7 +86,8 @@ public abstract class HolderCachedData implements Ca */ private PermissionCache calculatePermissions(@NonNull Contexts contexts, PermissionCache data) { if (data == null) { - data = new PermissionCache(contexts, getHolderName(), holder.getPlugin().getCalculatorFactory()); + PermissionCalculatorMetadata metadata = PermissionCalculatorMetadata.of(holder.getType(), getHolderName(), contexts.getContexts()); + data = new PermissionCache(contexts, metadata, holder.getPlugin().getCalculatorFactory()); } if (contexts == Contexts.allowAll()) { diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/type/PermissionCache.java b/common/src/main/java/me/lucko/luckperms/common/caching/type/PermissionCache.java index 493dd35ca..daf3b97df 100644 --- a/common/src/main/java/me/lucko/luckperms/common/caching/type/PermissionCache.java +++ b/common/src/main/java/me/lucko/luckperms/common/caching/type/PermissionCache.java @@ -61,12 +61,10 @@ public class PermissionCache implements PermissionData { */ private final PermissionCalculator calculator; - public PermissionCache(Contexts contexts, String friendlyName, CalculatorFactory calculatorFactory) { + public PermissionCache(Contexts contexts, PermissionCalculatorMetadata metadata, CalculatorFactory calculatorFactory) { permissions = new ConcurrentHashMap<>(); permissionsUnmodifiable = Collections.unmodifiableMap(permissions); - PermissionCalculatorMetadata metadata = PermissionCalculatorMetadata.of(friendlyName, contexts.getContexts()); - calculator = calculatorFactory.build(contexts, metadata); calculator.updateBacking(permissions); // Initial setup. } diff --git a/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculatorMetadata.java b/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculatorMetadata.java index 585673a74..753c2f0f5 100644 --- a/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculatorMetadata.java +++ b/common/src/main/java/me/lucko/luckperms/common/calculators/PermissionCalculatorMetadata.java @@ -29,11 +29,17 @@ import lombok.AllArgsConstructor; import lombok.Getter; import me.lucko.luckperms.api.context.ContextSet; +import me.lucko.luckperms.common.references.HolderType; @Getter @AllArgsConstructor(staticName = "of") public class PermissionCalculatorMetadata { + /** + * The type of the object which owns the permission calculator + */ + private final HolderType holderType; + /** * The name of the object which owns the permission calculator */ diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/calculators/SpongeCalculatorFactory.java b/sponge/src/main/java/me/lucko/luckperms/sponge/calculators/SpongeCalculatorFactory.java index 228d5f9eb..e3cf37ad8 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/calculators/SpongeCalculatorFactory.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/calculators/SpongeCalculatorFactory.java @@ -38,9 +38,11 @@ import me.lucko.luckperms.common.processors.MapProcessor; import me.lucko.luckperms.common.processors.PermissionProcessor; import me.lucko.luckperms.common.processors.RegexProcessor; import me.lucko.luckperms.common.processors.WildcardProcessor; +import me.lucko.luckperms.common.references.HolderType; import me.lucko.luckperms.sponge.LPSpongePlugin; -import me.lucko.luckperms.sponge.processors.DefaultsProcessor; +import me.lucko.luckperms.sponge.processors.GroupDefaultsProcessor; import me.lucko.luckperms.sponge.processors.SpongeWildcardProcessor; +import me.lucko.luckperms.sponge.processors.UserDefaultsProcessor; import java.util.List; @@ -67,7 +69,11 @@ public class SpongeCalculatorFactory extends AbstractCalculatorFactory { } if (plugin.getConfiguration().get(ConfigKeys.APPLY_SPONGE_DEFAULT_SUBJECTS)) { - processors.add(new DefaultsProcessor(plugin.getService(), contexts.getContexts().makeImmutable())); + if (metadata.getHolderType() == HolderType.USER) { + processors.add(new UserDefaultsProcessor(plugin.getService(), contexts.getContexts().makeImmutable())); + } else if (metadata.getHolderType() == HolderType.GROUP) { + processors.add(new GroupDefaultsProcessor(plugin.getService(), contexts.getContexts().makeImmutable())); + } } return registerCalculator(new PermissionCalculator(plugin, metadata, processors.build())); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/processors/GroupDefaultsProcessor.java b/sponge/src/main/java/me/lucko/luckperms/sponge/processors/GroupDefaultsProcessor.java new file mode 100644 index 000000000..2ebc6cc53 --- /dev/null +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/processors/GroupDefaultsProcessor.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017 Lucko (Luck) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.sponge.processors; + +import lombok.AllArgsConstructor; + +import me.lucko.luckperms.api.Tristate; +import me.lucko.luckperms.api.context.ImmutableContextSet; +import me.lucko.luckperms.common.processors.PermissionProcessor; +import me.lucko.luckperms.sponge.service.LuckPermsService; + +import java.util.Map; + +@AllArgsConstructor +public class GroupDefaultsProcessor implements PermissionProcessor { + private final LuckPermsService service; + private final ImmutableContextSet contexts; + + @Override + public Tristate hasPermission(String permission) { + Tristate t = service.getGroupSubjects().getDefaults().getPermissionValue(contexts, permission); + if (t != Tristate.UNDEFINED) { + return t; + } + + t = service.getDefaults().getPermissionValue(contexts, permission); + if (t != Tristate.UNDEFINED) { + return t; + } + + return Tristate.UNDEFINED; + } + + @Override + public void updateBacking(Map map) { + // Do nothing, this doesn't use the backing + } +} diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/processors/DefaultsProcessor.java b/sponge/src/main/java/me/lucko/luckperms/sponge/processors/UserDefaultsProcessor.java similarity index 97% rename from sponge/src/main/java/me/lucko/luckperms/sponge/processors/DefaultsProcessor.java rename to sponge/src/main/java/me/lucko/luckperms/sponge/processors/UserDefaultsProcessor.java index a56895b47..8168876c6 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/processors/DefaultsProcessor.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/processors/UserDefaultsProcessor.java @@ -35,7 +35,7 @@ import me.lucko.luckperms.sponge.service.LuckPermsService; import java.util.Map; @AllArgsConstructor -public class DefaultsProcessor implements PermissionProcessor { +public class UserDefaultsProcessor implements PermissionProcessor { private final LuckPermsService service; private final ImmutableContextSet contexts; diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubjectData.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubjectData.java index 37ab15ddf..0e4a3dc49 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubjectData.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubjectData.java @@ -42,6 +42,7 @@ import me.lucko.luckperms.common.calculators.PermissionCalculatorMetadata; import me.lucko.luckperms.common.contexts.ContextSetComparator; import me.lucko.luckperms.common.processors.MapProcessor; import me.lucko.luckperms.common.processors.PermissionProcessor; +import me.lucko.luckperms.common.references.HolderType; import me.lucko.luckperms.common.verbose.CheckOrigin; import me.lucko.luckperms.sponge.processors.SpongeWildcardProcessor; import me.lucko.luckperms.sponge.service.model.LPPermissionService; @@ -84,7 +85,7 @@ public class CalculatedSubjectData implements LPSubjectData { processors.add(new MapProcessor()); processors.add(new SpongeWildcardProcessor()); - CalculatorHolder holder = new CalculatorHolder(new PermissionCalculator(service.getPlugin(), PermissionCalculatorMetadata.of(calculatorDisplayName, contexts), processors.build())); + CalculatorHolder holder = new CalculatorHolder(new PermissionCalculator(service.getPlugin(), PermissionCalculatorMetadata.of(HolderType.GROUP, calculatorDisplayName, contexts), processors.build())); holder.setPermissions(flattenMap(getRelevantEntries(contexts, permissions))); return holder;