/* * 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 getAllLoadedPlayerNames() { return PERMISSION_PROVIDER.getAllLoadedPlayerNames(); } public List getAllLoadedGroupNames() { return PERMISSION_PROVIDER.getAllLoadedGroupNames(); } public void addActiveContexts(Set contexts, GDPermissionHolder permissionHolder) { PERMISSION_PROVIDER.addActiveContexts(contexts, permissionHolder); } public void addActiveContexts(Set contexts, GDPermissionHolder permissionHolder, GDPlayerData playerData, Claim claim) { PERMISSION_PROVIDER.addActiveContexts(contexts, permissionHolder, playerData, claim); } public boolean containsDefaultContext(Set contexts) { for (Context context : contexts) { if (context.getKey().equals("gd_claim_default")) { return true; } } return false; } public boolean containsOverrideContext(Set 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 contexts) { PERMISSION_PROVIDER.clearPermissions(holder, contexts); } public boolean holderHasPermission(GDPermissionHolder holder, String permission) { return PERMISSION_PROVIDER.holderHasPermission(holder, permission); } public Map getPermissions(GDPermissionHolder holder, Set contexts) { return PERMISSION_PROVIDER.getPermissions(holder, contexts); } public Map> getOptions(GDPermissionHolder holder, Set contexts) { return PERMISSION_PROVIDER.getOptions(holder, contexts); } public Map, Map> getAllPermanentPermissions() { return PERMISSION_PROVIDER.getAllPermanentPermissions(); } public Map, Map> getPermanentPermissions(GDPermissionHolder holder) { return PERMISSION_PROVIDER.getPermanentPermissions(holder); } public Map, Map> getTransientPermissions(GDPermissionHolder holder) { return PERMISSION_PROVIDER.getTransientPermissions(holder); } public Map, Map>> getPermanentOptions(GDPermissionHolder holder) { return PERMISSION_PROVIDER.getPermanentOptions(holder); } public Map, Map>> getTransientOptions(GDPermissionHolder holder) { return PERMISSION_PROVIDER.getTransientOptions(holder); } public Map, Map> 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 contexts, PermissionDataType type) { return PERMISSION_PROVIDER.getPermissionValue(claim, holder, permission, contexts, type); } public Tristate getPermissionValue(GDClaim claim, GDPermissionHolder holder, String permission, Set contexts) { return PERMISSION_PROVIDER.getPermissionValue(claim, holder, permission, contexts); } public Tristate getPermissionValue(GDPermissionHolder holder, String permission, Set contexts) { return PERMISSION_PROVIDER.getPermissionValue(holder, permission, contexts); } public String getOptionValue(GDPermissionHolder holder, Option option, Set contexts) { return PERMISSION_PROVIDER.getOptionValue(holder, option, contexts); } public List getOptionValueList(GDPermissionHolder holder, Option option, Set contexts) { return PERMISSION_PROVIDER.getOptionValueList(holder, option, contexts); } public CompletableFuture setFlagDefinition(GDPermissionHolder holder, FlagDefinition definition, Tristate value, Set contexts, boolean isTransient) { return PERMISSION_PROVIDER.setFlagDefinition(holder, definition, value, contexts, isTransient); } public CompletableFuture setOptionValue(GDPermissionHolder holder, String permission, String value, Set contexts) { return PERMISSION_PROVIDER.setOptionValue(holder, permission, value, contexts, true); } public CompletableFuture setOptionValue(GDPermissionHolder holder, String permission, String value, Set contexts, boolean check) { return PERMISSION_PROVIDER.setOptionValue(holder, permission, value, contexts, check); } public CompletableFuture setPermissionValue(GDPermissionHolder holder, Flag flag, Tristate value, Set contexts) { return PERMISSION_PROVIDER.setPermissionValue(holder, flag, value, contexts, true, true); } public CompletableFuture setPermissionValue(GDPermissionHolder holder, String permission, Tristate value, Set contexts) { return PERMISSION_PROVIDER.setPermissionValue(holder, permission, value, contexts, true, true); } public CompletableFuture setPermissionValue(GDPermissionHolder holder, Flag flag, Tristate value, Set contexts, boolean check, boolean save) { return PERMISSION_PROVIDER.setPermissionValue(holder, flag, value, contexts, check, save); } public CompletableFuture setPermissionValue(GDPermissionHolder holder, String permission, Tristate value, Set contexts, boolean check, boolean save) { return PERMISSION_PROVIDER.setPermissionValue(holder, permission, value, contexts, check, save); } public CompletableFuture setTransientOption(GDPermissionHolder holder, String permission, String value, Set contexts) { return PERMISSION_PROVIDER.setTransientOption(holder, permission, value, contexts); } public CompletableFuture setTransientPermission(GDPermissionHolder holder, String permission, Tristate value, Set contexts) { return PERMISSION_PROVIDER.setTransientPermission(holder, permission, value, contexts); } public void refreshCachedData(GDPermissionHolder holder) { PERMISSION_PROVIDER.refreshCachedData(holder); } public CompletableFuture save(GDPermissionHolder holder) { return PERMISSION_PROVIDER.save(holder); } public boolean containsKey(Set 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 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; } }