Permission Issue Fix

Fixed Issue with the View Category Permission
This commit is contained in:
LikeWhat 2023-09-24 23:27:36 +02:00
parent ae369fac53
commit 3faa8e26ff
10 changed files with 54 additions and 24 deletions

View File

@ -6,7 +6,7 @@
<groupId>de.likewhat.customheads</groupId>
<artifactId>CustomHeads</artifactId>
<version>3.0.8</version>
<version>3.0.9</version>
<packaging>jar</packaging>
<properties>

View File

@ -12,9 +12,9 @@ import de.likewhat.customheads.category.CustomHead;
import de.likewhat.customheads.headwriter.HeadFontType;
import de.likewhat.customheads.utils.FireworksBatteryHandler;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
/**
@ -31,7 +31,7 @@ public interface CustomHeadsAPI {
* @param player Player to wrap (whether online or offline)
* @return Wrapped Player Instance
*/
CustomHeadsPlayer wrapPlayer(OfflinePlayer player);
CustomHeadsPlayer wrapPlayer(Player player);
/**
* Will get the Texture from a Skull

View File

@ -148,7 +148,7 @@ public class Category extends BaseCategory {
category = new Category(
categoryJson.get("id").getAsInt(),
Utils.format(categoryJson.get("name").getAsString()),
"heads.viewCategory." + categoryJson.get("permission").getAsString(),
CategoryManager.VIEW_CATEGORY_PERMISSION_PREFIX + categoryJson.get("permission").getAsString(),
CustomHeads.hasEconomy() && categoryJson.has("price") ? categoryJson.get("price").getAsInt() : CustomHeads.getCategoryManager().getDefaultCategoryPrice(),
categoryJson.has("sub_categories") ? null :
CustomHeads.getTagEditor().setTags(JsonToItem.convertFromJson(categoryJson.get("icon").toString()), "openCategory", "category#>" + categoryJson.get("id").getAsString(), "icon"));
@ -214,7 +214,7 @@ public class Category extends BaseCategory {
//Sub Category Info Header
categoryObject.addProperty("id", Integer.parseInt(category.getId().contains(":") ? category.getId().split(":")[0] : category.getId()));
categoryObject.addProperty("name", category.getName());
categoryObject.addProperty("permission", category.getPermission().replaceFirst("heads.viewCategory.", ""));
categoryObject.addProperty("permission", category.getPermission().replaceFirst(CategoryManager.VIEW_CATEGORY_PERMISSION_PREFIX, ""));
categoryObject.addProperty("fixed-icon", category.isFixedIcon());
if (category.hasCategoryIcon()) {
categoryObject.add("icon", new JsonParser().parse(JsonToItem.convertToJson(category.getCategoryIcon())));

View File

@ -6,6 +6,8 @@ import de.likewhat.customheads.utils.JsonFile;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.PluginManager;
import java.io.File;
import java.io.FileOutputStream;
@ -26,6 +28,8 @@ import java.util.logging.Level;
@Getter
public class CategoryManager {
public static final String VIEW_CATEGORY_PERMISSION_PREFIX = "heads.viewcategory.";
@Getter
private static boolean loaded;
private final HashMap<String, SubCategory> subCategories = new HashMap<>();
@ -67,6 +71,9 @@ public class CategoryManager {
CustomHeads.getInstance().getServer().getConsoleSender().sendMessage(CustomHeads.PREFIX_GENERAL + "Loading " + fileList.size() + " Categories from " + language + "/categories...");
long timestamp = System.currentTimeMillis();
CustomHeads.getHeadsConfig().reload();
Permission viewCategoryWildcard = Bukkit.getPluginManager().getPermission(VIEW_CATEGORY_PERMISSION_PREFIX + "*");
PluginManager pluginManager = Bukkit.getPluginManager();
for (File file : fileList) {
JsonFile jsf = new JsonFile(file);
categoriesIgnored = CustomHeads.getHeadsConfig().get().getList("disabledCategories").size();
@ -83,11 +90,24 @@ public class CategoryManager {
}
categories.put(category.getId(), category);
sourceFiles.put(category, file);
Permission categoryBasePermission = new Permission(category.getPermission()); // heads.view_category.<category-name>
Permission categoryAllHeadsPermission = new Permission(category.getPermission() + ".all_heads");
// Add Permissions from the Categories dynamically
pluginManager.addPermission(categoryBasePermission);
pluginManager.addPermission(categoryAllHeadsPermission);
// Add the Category Permissions as Parent from the View Category Permission
categoryBasePermission.addParent(viewCategoryWildcard, true);
categoryBasePermission.addParent(categoryAllHeadsPermission, true);
categoryAllHeadsPermission.addParent(viewCategoryWildcard, true);
categoriesLoaded++;
if (category.hasSubCategories()) {
for (SubCategory subCategory : category.getSubCategories()) {
if (subCategories.containsKey(subCategory.getId())) {
CustomHeads.getInstance().getServer().getConsoleSender().sendMessage(CustomHeads.PREFIX_WARNING + file.getName() + ": §cAn Subcategory with ID " + subCategory.getId() + " (" + subCategories.get(subCategory.getId()).getName() + ") already exists.");
CustomHeads.getInstance().getServer().getConsoleSender().sendMessage(CustomHeads.PREFIX_WARNING + file.getName() + ": §cA Subcategory with ID " + subCategory.getId() + " (" + subCategories.get(subCategory.getId()).getName() + ") already exists.");
continue;
}
subCategories.put(subCategory.getId(), subCategory);

View File

@ -9,6 +9,7 @@ import de.likewhat.customheads.category.SubCategory;
import de.likewhat.customheads.headwriter.HeadFontType;
import de.likewhat.customheads.headwriter.HeadWriter;
import de.likewhat.customheads.utils.*;
import de.likewhat.customheads.utils.history.SearchHistory;
import de.likewhat.customheads.utils.reflection.helpers.ReflectionUtils;
import de.likewhat.customheads.utils.reflection.helpers.Version;
import de.likewhat.customheads.utils.updaters.FetchResult;
@ -424,7 +425,7 @@ public class CustomHeadsCommand implements CommandExecutor {
OfflinePlayer phis = Bukkit.getOfflinePlayer(Utils.parseUUID(uuid));
if (phis.hasPlayedBefore() || phis.isOnline()) {
if (hasPermission(player, "heads.view.history." + phis.getName()) || hasPermission(player, "heads.view.history.*") || (phis == player && CustomHeads.canSeeOwnHistory())) {
player.openInventory(CustomHeads.getApi().wrapPlayer(phis).getSearchHistory().getInventory());
player.openInventory(new SearchHistory(player).getInventory());
return;
}
player.sendMessage(CustomHeads.getLanguageManager().HISTORY_NO_VIEW_PERMISSION);

View File

@ -61,6 +61,7 @@ public class InventoryListener implements Listener {
return;
}
CustomHeadsPlayer customHeadsPlayer = CustomHeads.getApi().wrapPlayer(player);
List<Category> unlockedCategories = customHeadsPlayer.getUnlockedCategories(CustomHeads.hasEconomy() && !CustomHeads.keepCategoryPermissions());
ItemStack[] inventoryContent = event.getInventory().getContents();
for (int i = 0; i < inventoryContent.length; i++) {
if (inventoryContent[i] == null) continue;
@ -70,15 +71,18 @@ public class InventoryListener implements Listener {
if (categoryArgs[0].equals("category")) {
Category category = CustomHeads.getCategoryManager().getCategory(categoryArgs[1]);
ItemStack nextIcon = category.nextIcon();
boolean bought = customHeadsPlayer.getUnlockedCategories(true).contains(category);
boolean bought = false;
if(CustomHeads.hasEconomy() && CustomHeads.categoriesBuyable()) {
bought = customHeadsPlayer.getUnlockedCategories(true).contains(category);
}
nextIcon = new ItemEditor(nextIcon)
.setDisplayName(customHeadsPlayer.getUnlockedCategories(CustomHeads.hasEconomy() && !CustomHeads.keepCategoryPermissions()).contains(category) ? "§a" + nextIcon.getItemMeta().getDisplayName() : "§7" + ChatColor.stripColor(nextIcon.getItemMeta().getDisplayName()) + " " + CustomHeads.getLanguageManager().LOCKED)
.setDisplayName(unlockedCategories.contains(category) ? ("§a" + nextIcon.getItemMeta().getDisplayName()) : ("§7" + ChatColor.stripColor(nextIcon.getItemMeta().getDisplayName()) + " " + CustomHeads.getLanguageManager().LOCKED))
.addLoreLine(CustomHeads.hasEconomy() && CustomHeads.categoriesBuyable() ? bought || hasPermission(player, category.getPermission()) ? CustomHeads.getLanguageManager().ECONOMY_BOUGHT : Utils.getCategoryPriceFormatted(category, true) + "\n" + CustomHeads.getLanguageManager().ECONOMY_BUY_PROMPT : null)
.addLoreLines(hasPermission(player, "heads.view.permissions") ? Arrays.asList(" ", "§7§oPermission: " + category.getPermission()) : null)
.getItem();
if (CustomHeads.hasEconomy()) {
if (CustomHeads.hasEconomy() && CustomHeads.categoriesBuyable()) {
if(!(CustomHeads.keepCategoryPermissions() && hasPermission(player, category.getPermission()))) {
if (!bought && CustomHeads.categoriesBuyable()) {
if (!bought) {
nextIcon = CustomHeads.getTagEditor().addTags(nextIcon, "buyCategory", category.getId());
}
}
@ -570,7 +574,7 @@ public class InventoryListener implements Listener {
String[] id = itemTags.get(itemTags.indexOf("headID")+1).split(":");
category = CustomHeads.getCategoryManager().getCategory(id[0]);
}
if (getHeadFromItem(event.getCurrentItem()) == null || (category != null && hasPermission(player, "heads.viewCategory." + category.getPermission().replaceFirst("heads.viewCategory.", "") + ".allheads")) || customHeadsPlayer.getUnlockedHeads().contains(getHeadFromItem(event.getCurrentItem())) || getHeadFromItem(event.getCurrentItem()).isFree()) {
if (getHeadFromItem(event.getCurrentItem()) == null || (category != null && hasPermission(player, category.getPermission() + ".allheads")) || customHeadsPlayer.getUnlockedHeads().contains(getHeadFromItem(event.getCurrentItem())) || getHeadFromItem(event.getCurrentItem()).isFree()) {
ItemEditor itemEditor = new ItemEditor(event.getCurrentItem());
if (!CustomHeads.shouldGrabHeadToCursor() || event.getClick() == ClickType.SHIFT_LEFT) {
player.getInventory().addItem(TagEditor.clearTags(itemEditor.removeLoreLine(itemEditor.hasLore() ? itemEditor.getLore().size() - 1 : 0).getItem()));

View File

@ -26,6 +26,7 @@ import org.bukkit.block.BlockFace;
import org.bukkit.block.Skull;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.scheduler.BukkitRunnable;
@ -199,7 +200,7 @@ public void setSkull(Block block, String texture, BlockFace blockFace) {
}
// API Impl
public CustomHeadsPlayer wrapPlayer(OfflinePlayer player) {
public CustomHeadsPlayer wrapPlayer(Player player) {
return PlayerWrapper.wrapPlayer(player);
}

View File

@ -18,7 +18,6 @@ import de.likewhat.customheads.utils.history.GetHistory;
import de.likewhat.customheads.utils.history.SearchHistory;
import lombok.Getter;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@ -39,9 +38,9 @@ public class PlayerWrapper implements CustomHeadsPlayer {
@Getter private SearchHistory searchHistory;
@Getter private GetHistory getHistory;
private final OfflinePlayer player;
private final Player player;
private PlayerWrapper(OfflinePlayer player) {
private PlayerWrapper(Player player) {
this.player = player;
try {
JsonObject dataRoot = CustomHeads.getPlayerDataFile().getJson().getAsJsonObject();
@ -82,8 +81,8 @@ public class PlayerWrapper implements CustomHeadsPlayer {
WRAPPED_PLAYERS_CACHE.put(player.getUniqueId(), this);
}
static CustomHeadsPlayer wrapPlayer(OfflinePlayer player) {
return WRAPPED_PLAYERS_CACHE.containsKey(player.getUniqueId()) ? WRAPPED_PLAYERS_CACHE.get(player.getUniqueId()) : new PlayerWrapper(player);
static CustomHeadsPlayer wrapPlayer(Player player) {
return WRAPPED_PLAYERS_CACHE.getOrDefault(player.getUniqueId(), new PlayerWrapper(player));
}
public static void clearCache() {
@ -140,11 +139,11 @@ public class PlayerWrapper implements CustomHeadsPlayer {
}
public List<Category> getUnlockedCategories(boolean ignorePermission) {
return CustomHeads.getCategoryManager().getCategoryList().stream().filter(category -> (!ignorePermission && (Utils.hasPermission(player.getPlayer(), category.getPermission()) || Utils.hasPermission(player.getPlayer(), category.getPermission() + ".allheads"))) || unlockedCategories.contains(category)).collect(Collectors.toList());
return CustomHeads.getCategoryManager().getCategoryList().stream().filter(category -> (!ignorePermission && (Utils.hasPermission(player, category.getPermission()) || Utils.hasPermission(player, category.getPermission() + ".allheads"))) || unlockedCategories.contains(category)).collect(Collectors.toList());
}
public Player unwrap() {
return player.getPlayer();
return this.player;
}
public boolean unlockCategory(Category category) {

View File

@ -68,6 +68,8 @@ public class Utils {
public static final String TEXT_JSON_FORMAT = "{\"text\":\"%s\"}";
private static final HashMap<String, List<String>> PERMISSION_CACHE = new HashMap<>();
public static String getTextureFromProfile(GameProfile profile) {
String value = "";
for (Property prop : profile.getProperties().get("textures")) {
@ -311,7 +313,7 @@ public class Utils {
}
public static boolean hasPermission(Player player, String permission) {
return player.hasPermission(permission) || player.hasPermission("heads.admin") || player.hasPermission("heads.*") || player.isOp();
return player.isOp() || player.hasPermission("heads.admin") || player.hasPermission(permission);
}
public static UUID parseUUID(String uuidStr) {
@ -402,7 +404,7 @@ public class Utils {
inventory.setContent(categoryHeads.stream().map(customHead -> {
boolean bought = customHeadsPlayer.getUnlockedHeads().contains(customHead);
ItemEditor itemEditor = new ItemEditor(customHead);
return CustomHeads.hasEconomy() && CustomHeads.headsBuyable() ? (bought || hasPermission(player, "heads.unlockAllHeads." + baseCategory.getPermission().replaceFirst("heads.viewCategory.", ""))) ? CustomHeads.getTagEditor().addTags(itemEditor.addLoreLine(CustomHeads.getLanguageManager().ECONOMY_BOUGHT).getItem(), "wearable", "clonable") : CustomHeads.getTagEditor().addTags(itemEditor.addLoreLine(formatPrice(customHead.getPrice(), true)).getItem(), "buyHead", "buyHead#>" + customHead.getOriginCategory().getId() + ":" + customHead.getId()) : CustomHeads.getTagEditor().addTags(itemEditor.getItem(), "wearable", "clonable");
return CustomHeads.hasEconomy() && CustomHeads.headsBuyable() ? (bought || hasPermission(player, "heads.unlock-all-heads." + baseCategory.getPermission().replaceFirst("heads.viewCategory.", ""))) ? CustomHeads.getTagEditor().addTags(itemEditor.addLoreLine(CustomHeads.getLanguageManager().ECONOMY_BOUGHT).getItem(), "wearable", "clonable") : CustomHeads.getTagEditor().addTags(itemEditor.addLoreLine(formatPrice(customHead.getPrice(), true)).getItem(), "buyHead", "buyHead#>" + customHead.getOriginCategory().getId() + ":" + customHead.getId()) : CustomHeads.getTagEditor().addTags(itemEditor.getItem(), "wearable", "clonable");
}).collect(Collectors.toList()));
inventory.setBarItem(1, Utils.getBackButton(backAction));
inventory.setBarItem(3, CustomHeads.getTagEditor().setTags(new ItemEditor(Material.PAPER).setDisplayName(CustomHeads.getLanguageManager().ITEMS_INFO).setLore(CustomHeads.getLanguageManager().ITEMS_INFO_LORE).getItem(), "dec", "info-item", "blockMoving"));

View File

@ -12,16 +12,19 @@ permissions:
heads.*:
description: Gives all Permission for the Plugin
children:
heads.use: true
heads.use.*: true
heads.view.*: true
heads.viewCategory.*: true
heads.viewcategory.*: true
heads.view.history.*: true
default: op
heads.use:
default: op
heads.view.history:
default: op
heads.viewCategory:
heads.viewcategory:
default: op
heads.viewcategory.*:
default: op
heads.use.more:
default: op