330 lines
14 KiB
Java
330 lines
14 KiB
Java
/*
|
|
* This file is part of GriefDefender, licensed under the MIT License (MIT).
|
|
*
|
|
* Copyright (c) bloodmc
|
|
* Copyright (c) contributors
|
|
*
|
|
* 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 com.griefdefender.util;
|
|
|
|
import com.griefdefender.GDPlayerData;
|
|
import com.griefdefender.GriefDefenderPlugin;
|
|
import com.griefdefender.api.Group;
|
|
import com.griefdefender.api.Tristate;
|
|
import com.griefdefender.api.claim.Claim;
|
|
import com.griefdefender.api.claim.TrustTypes;
|
|
import com.griefdefender.api.permission.Context;
|
|
import com.griefdefender.api.permission.ContextKeys;
|
|
import com.griefdefender.api.permission.PermissionResult;
|
|
import com.griefdefender.api.permission.flag.Flag;
|
|
import com.griefdefender.api.permission.flag.FlagDefinition;
|
|
import com.griefdefender.api.permission.flag.Flags;
|
|
import com.griefdefender.api.permission.option.Option;
|
|
import com.griefdefender.cache.PermissionHolderCache;
|
|
import com.griefdefender.claim.GDClaim;
|
|
import com.griefdefender.internal.util.VecHelper;
|
|
import com.griefdefender.permission.GDPermissionHolder;
|
|
import com.griefdefender.permission.GDPermissionManager;
|
|
import com.griefdefender.permission.GDPermissions;
|
|
import com.griefdefender.provider.PermissionProvider;
|
|
import com.griefdefender.provider.PermissionProvider.PermissionDataType;
|
|
import org.spongepowered.api.entity.living.player.Player;
|
|
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
public class PermissionUtil {
|
|
|
|
private final PermissionProvider PERMISSION_PROVIDER;
|
|
|
|
private static PermissionUtil instance;
|
|
|
|
public static PermissionUtil getInstance() {
|
|
return instance;
|
|
}
|
|
|
|
static {
|
|
instance = new PermissionUtil();
|
|
}
|
|
|
|
public PermissionUtil() {
|
|
this.PERMISSION_PROVIDER = GriefDefenderPlugin.getInstance().getPermissionProvider();
|
|
}
|
|
|
|
public String getServerName() {
|
|
return PERMISSION_PROVIDER.getServerName();
|
|
}
|
|
|
|
public boolean hasGroupSubject(String identifier) {
|
|
return PERMISSION_PROVIDER.hasGroupSubject(identifier);
|
|
}
|
|
|
|
public UUID lookupUserUniqueId(String name) {
|
|
return PERMISSION_PROVIDER.lookupUserUniqueId(name);
|
|
}
|
|
|
|
public List<String> getAllLoadedPlayerNames() {
|
|
return PERMISSION_PROVIDER.getAllLoadedPlayerNames();
|
|
}
|
|
|
|
public List<String> getAllLoadedGroupNames() {
|
|
return PERMISSION_PROVIDER.getAllLoadedGroupNames();
|
|
}
|
|
|
|
public void addActiveContexts(Set<Context> contexts, GDPermissionHolder permissionHolder) {
|
|
PERMISSION_PROVIDER.addActiveContexts(contexts, permissionHolder);
|
|
}
|
|
|
|
public void addActiveContexts(Set<Context> contexts, GDPermissionHolder permissionHolder, GDPlayerData playerData, Claim claim) {
|
|
PERMISSION_PROVIDER.addActiveContexts(contexts, permissionHolder, playerData, claim);
|
|
}
|
|
|
|
public boolean containsDefaultContext(Set<Context> contexts) {
|
|
for (Context context : contexts) {
|
|
if (context.getKey().equals("gd_claim_default")) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public boolean containsOverrideContext(Set<Context> contexts) {
|
|
for (Context context : contexts) {
|
|
if (context.getKey().equals("gd_claim_override")) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void clearPermissions(GDClaim claim) {
|
|
PERMISSION_PROVIDER.clearPermissions(claim);
|
|
}
|
|
|
|
public void clearPermissions(GDPermissionHolder holder, Context context) {
|
|
PERMISSION_PROVIDER.clearPermissions(holder, context);
|
|
}
|
|
|
|
public void clearPermissions(GDPermissionHolder holder, Set<Context> contexts) {
|
|
PERMISSION_PROVIDER.clearPermissions(holder, contexts);
|
|
}
|
|
|
|
public boolean holderHasPermission(GDPermissionHolder holder, String permission) {
|
|
return PERMISSION_PROVIDER.holderHasPermission(holder, permission);
|
|
}
|
|
|
|
public Map<String, Boolean> getPermissions(GDPermissionHolder holder, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.getPermissions(holder, contexts);
|
|
}
|
|
|
|
public Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.getOptions(holder, contexts);
|
|
}
|
|
|
|
public Map<Set<Context>, Map<String, Boolean>> getAllPermanentPermissions() {
|
|
return PERMISSION_PROVIDER.getAllPermanentPermissions();
|
|
}
|
|
|
|
public Map<Set<Context>, Map<String, Boolean>> getPermanentPermissions(GDPermissionHolder holder) {
|
|
return PERMISSION_PROVIDER.getPermanentPermissions(holder);
|
|
}
|
|
|
|
public Map<Set<Context>, Map<String, Boolean>> getTransientPermissions(GDPermissionHolder holder) {
|
|
return PERMISSION_PROVIDER.getTransientPermissions(holder);
|
|
}
|
|
|
|
public Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder) {
|
|
return PERMISSION_PROVIDER.getPermanentOptions(holder);
|
|
}
|
|
|
|
public Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder) {
|
|
return PERMISSION_PROVIDER.getTransientOptions(holder);
|
|
}
|
|
|
|
public Map<Set<Context>, Map<String, Boolean>> getAllPermissions(GDPermissionHolder holder) {
|
|
return PERMISSION_PROVIDER.getAllPermissions(holder);
|
|
}
|
|
|
|
public Tristate getPermissionValue(GDPermissionHolder holder, String permission) {
|
|
return PERMISSION_PROVIDER.getPermissionValue(holder, permission);
|
|
}
|
|
|
|
public Tristate getPermissionValue(GDClaim claim, GDPermissionHolder holder, String permission, Set<Context> contexts, PermissionDataType type) {
|
|
return PERMISSION_PROVIDER.getPermissionValue(claim, holder, permission, contexts, type);
|
|
}
|
|
|
|
public Tristate getPermissionValue(GDClaim claim, GDPermissionHolder holder, String permission, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.getPermissionValue(claim, holder, permission, contexts);
|
|
}
|
|
|
|
public Tristate getPermissionValue(GDPermissionHolder holder, String permission, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.getPermissionValue(holder, permission, contexts);
|
|
}
|
|
|
|
public String getOptionValue(GDPermissionHolder holder, Option option, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.getOptionValue(holder, option, contexts);
|
|
}
|
|
|
|
public List<String> getOptionValueList(GDPermissionHolder holder, Option option, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.getOptionValueList(holder, option, contexts);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setFlagDefinition(GDPermissionHolder holder, FlagDefinition definition, Tristate value, Set<Context> contexts, boolean isTransient) {
|
|
return PERMISSION_PROVIDER.setFlagDefinition(holder, definition, value, contexts, isTransient);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setOptionValue(GDPermissionHolder holder, String permission, String value, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.setOptionValue(holder, permission, value, contexts, true);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setOptionValue(GDPermissionHolder holder, String permission, String value, Set<Context> contexts, boolean check) {
|
|
return PERMISSION_PROVIDER.setOptionValue(holder, permission, value, contexts, check);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setPermissionValue(GDPermissionHolder holder, Flag flag, Tristate value, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.setPermissionValue(holder, flag, value, contexts, true, true);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setPermissionValue(GDPermissionHolder holder, String permission, Tristate value, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.setPermissionValue(holder, permission, value, contexts, true, true);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setPermissionValue(GDPermissionHolder holder, Flag flag, Tristate value, Set<Context> contexts, boolean check, boolean save) {
|
|
return PERMISSION_PROVIDER.setPermissionValue(holder, flag, value, contexts, check, save);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setPermissionValue(GDPermissionHolder holder, String permission, Tristate value, Set<Context> contexts, boolean check, boolean save) {
|
|
return PERMISSION_PROVIDER.setPermissionValue(holder, permission, value, contexts, check, save);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setTransientOption(GDPermissionHolder holder, String permission, String value, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.setTransientOption(holder, permission, value, contexts);
|
|
}
|
|
|
|
public CompletableFuture<PermissionResult> setTransientPermission(GDPermissionHolder holder, String permission, Tristate value, Set<Context> contexts) {
|
|
return PERMISSION_PROVIDER.setTransientPermission(holder, permission, value, contexts);
|
|
}
|
|
|
|
public void refreshCachedData(GDPermissionHolder holder) {
|
|
PERMISSION_PROVIDER.refreshCachedData(holder);
|
|
}
|
|
|
|
public CompletableFuture<Void> save(GDPermissionHolder holder) {
|
|
return PERMISSION_PROVIDER.save(holder);
|
|
}
|
|
|
|
public boolean containsKey(Set<Context> contexts, String key) {
|
|
for (Context context : contexts) {
|
|
if (context.getKey().equalsIgnoreCase(key)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public Tristate getTristateFromString(String value) {
|
|
Tristate tristate = null;
|
|
int intValue = -999;
|
|
try {
|
|
intValue = Integer.parseInt(value);
|
|
if (intValue <= -1) {
|
|
tristate = Tristate.FALSE;
|
|
} else if (intValue == 0) {
|
|
tristate = Tristate.UNDEFINED;
|
|
} else {
|
|
tristate = Tristate.TRUE;
|
|
}
|
|
return tristate;
|
|
|
|
} catch (NumberFormatException e) {
|
|
// ignore
|
|
}
|
|
|
|
try {
|
|
tristate = Tristate.valueOf(value.toUpperCase());
|
|
} catch (IllegalArgumentException e) {
|
|
return null;
|
|
}
|
|
|
|
return tristate;
|
|
}
|
|
|
|
public boolean canPlayerTeleport(Player player, GDClaim claim) {
|
|
final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getPlayerData(player.getWorld(), player.getUniqueId());
|
|
boolean allowTeleport = true;
|
|
if (!playerData.canIgnoreClaim(claim) && !playerData.canManageAdminClaims) {
|
|
// if not owner of claim, validate perms
|
|
if (!player.getUniqueId().equals(claim.getOwnerUniqueId())) {
|
|
if (!player.hasPermission(GDPermissions.COMMAND_CLAIM_INFO_TELEPORT_OTHERS)) {
|
|
allowTeleport = false;
|
|
} else {
|
|
if (!claim.isUserTrusted(player, TrustTypes.ACCESSOR)) {
|
|
if (GriefDefenderPlugin.getInstance().economyService.orElse(null) != null) {
|
|
// Allow non-trusted to TP to claims for sale
|
|
if (!claim.getEconomyData().isForSale() && !claim.getEconomyData().isForRent()) {
|
|
allowTeleport = false;
|
|
}
|
|
} else {
|
|
allowTeleport = false;
|
|
}
|
|
}
|
|
}
|
|
} else if (!player.hasPermission(GDPermissions.COMMAND_CLAIM_INFO_TELEPORT_BASE)) {
|
|
allowTeleport = false;
|
|
}
|
|
}
|
|
if (!claim.isWilderness() && !allowTeleport && player.hasPermission(GDPermissions.COMMAND_CLAIM_INFO_TELEPORT_INSIDE)) {
|
|
// check if player is in claim
|
|
if (!player.getUniqueId().equals(claim.getOwnerUniqueId()) && !claim.isUserTrusted(player, TrustTypes.BUILDER)) {
|
|
if (claim.contains(VecHelper.toVector3i(player.getLocation()))) {
|
|
// check place
|
|
final Tristate placeResult = GDPermissionManager.getInstance().getFinalPermission(null, player.getLocation(), claim, Flags.BLOCK_PLACE, player, player.getLocation(), player, TrustTypes.BUILDER, true);
|
|
if (placeResult == Tristate.FALSE) {
|
|
allowTeleport = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return allowTeleport;
|
|
}
|
|
|
|
public GDPermissionHolder getGDPermissionHolder(GDPermissionHolder holder, Set<Context> contexts) {
|
|
if (holder != GriefDefenderPlugin.DEFAULT_HOLDER && holder != GriefDefenderPlugin.GD_DEFAULT_HOLDER) {
|
|
return holder;
|
|
}
|
|
|
|
for (Context context : contexts) {
|
|
if (context.getKey().equals(ContextKeys.CLAIM_OVERRIDE)) {
|
|
return GriefDefenderPlugin.GD_OVERRIDE_HOLDER;
|
|
}
|
|
if (context.getKey().equals(ContextKeys.CLAIM)) {
|
|
return GriefDefenderPlugin.GD_CLAIM_HOLDER;
|
|
}
|
|
}
|
|
return GriefDefenderPlugin.GD_DEFAULT_HOLDER;
|
|
}
|
|
}
|