pass and account for the holder type when building PermissionCalculators

This commit is contained in:
Luck 2017-12-19 22:48:53 +00:00
parent fb92fd9357
commit f793fd5010
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
8 changed files with 81 additions and 9 deletions

View File

@ -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()));
}

View File

@ -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<T extends PermissionHolder> 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()) {

View File

@ -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.
}

View File

@ -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
*/

View File

@ -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()));

View File

@ -0,0 +1,58 @@
/*
* Copyright (c) 2017 Lucko (Luck) <luck@lucko.me>
*
* 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<String, Boolean> map) {
// Do nothing, this doesn't use the backing
}
}

View File

@ -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;

View File

@ -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;