From 19d30532012d0c83efaf27d77115017b62232d29 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Thu, 8 Nov 2018 21:04:18 +1300 Subject: [PATCH] Add config options to disable commands, explicit permissions definitions --- .../disguise/DisguiseConfig.java | 19 ++++++++ .../libraryaddict/disguise/LibsDisguises.java | 46 ++++++++++++------- .../utilities/parser/DisguisePermissions.java | 15 +++--- src/main/resources/config.yml | 24 +++++++++- 4 files changed, 77 insertions(+), 27 deletions(-) diff --git a/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java b/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java index bbbe1813..2e14d8ee 100644 --- a/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java +++ b/src/main/java/me/libraryaddict/disguise/DisguiseConfig.java @@ -66,6 +66,23 @@ public class DisguiseConfig { private static boolean modifyCollisions; private static boolean disableFriendlyInvisibles; private static boolean warnScoreboardConflict; + private static boolean explicitDisguisePermissions; + private static boolean disableCommands; + + /** + * No setter provided as this cannot be changed after startup + */ + public static boolean isDisableCommands() { + return disableCommands; + } + + public static boolean isExplicitDisguisePermissions() { + return explicitDisguisePermissions; + } + + public static void setExplicitDisguisePermissions(boolean explictDisguisePermission) { + explicitDisguisePermissions = explictDisguisePermission; + } public static Entry getCustomDisguise(String disguise) { for (Entry entry : customDisguises.entrySet()) { @@ -226,6 +243,8 @@ public class DisguiseConfig { setModifyCollisions(config.getBoolean("Scoreboard.Collisions")); setDisableFriendlyInvisibles(config.getBoolean("Scoreboard.DisableFriendlyInvisibles")); setWarnScoreboardConflict(config.getBoolean("Scoreboard.WarnConflict")); + disableCommands = config.getBoolean("DisableCommands"); + setExplicitDisguisePermissions(config.getBoolean("Permissions.ExplictDisguises")); if (!LibsPremium.isPremium() && (isSavePlayerDisguises() || isSaveEntityDisguises())) { DisguiseUtilities.getLogger().warning("You must purchase the plugin to use saved disguises!"); diff --git a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java index fb874901..a418fae0 100644 --- a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java @@ -69,23 +69,25 @@ public class LibsDisguises extends JavaPlugin { Bukkit.getPluginManager().registerEvents(listener, this); - registerCommand("disguise", new DisguiseCommand()); - registerCommand("undisguise", new UndisguiseCommand()); - registerCommand("disguiseplayer", new DisguisePlayerCommand()); - registerCommand("undisguiseplayer", new UndisguisePlayerCommand()); - registerCommand("undisguiseentity", new UndisguiseEntityCommand()); - registerCommand("disguiseentity", new DisguiseEntityCommand()); - registerCommand("disguiseradius", new DisguiseRadiusCommand(getConfig().getInt("DisguiseRadiusMax"))); - registerCommand("undisguiseradius", new UndisguiseRadiusCommand(getConfig().getInt("UndisguiseRadiusMax"))); - registerCommand("disguisehelp", new DisguiseHelpCommand()); - registerCommand("disguiseclone", new DisguiseCloneCommand()); - registerCommand("libsdisguises", new LibsDisguisesCommand()); - registerCommand("disguiseviewself", new DisguiseViewSelfCommand()); - registerCommand("disguisemodify", new DisguiseModifyCommand()); - registerCommand("disguisemodifyentity", new DisguiseModifyEntityCommand()); - registerCommand("disguisemodifyplayer", new DisguiseModifyPlayerCommand()); - registerCommand("disguisemodifyradius", - new DisguiseModifyRadiusCommand(getConfig().getInt("DisguiseRadiusMax"))); + if (!DisguiseConfig.isDisableCommands()) { + registerCommand("disguise", new DisguiseCommand()); + registerCommand("undisguise", new UndisguiseCommand()); + registerCommand("disguiseplayer", new DisguisePlayerCommand()); + registerCommand("undisguiseplayer", new UndisguisePlayerCommand()); + registerCommand("undisguiseentity", new UndisguiseEntityCommand()); + registerCommand("disguiseentity", new DisguiseEntityCommand()); + registerCommand("disguiseradius", new DisguiseRadiusCommand(getConfig().getInt("DisguiseRadiusMax"))); + registerCommand("undisguiseradius", new UndisguiseRadiusCommand(getConfig().getInt("UndisguiseRadiusMax"))); + registerCommand("disguisehelp", new DisguiseHelpCommand()); + registerCommand("disguiseclone", new DisguiseCloneCommand()); + registerCommand("libsdisguises", new LibsDisguisesCommand()); + registerCommand("disguiseviewself", new DisguiseViewSelfCommand()); + registerCommand("disguisemodify", new DisguiseModifyCommand()); + registerCommand("disguisemodifyentity", new DisguiseModifyEntityCommand()); + registerCommand("disguisemodifyplayer", new DisguiseModifyPlayerCommand()); + registerCommand("disguisemodifyradius", + new DisguiseModifyRadiusCommand(getConfig().getInt("DisguiseRadiusMax"))); + } infectWithMetrics(); } @@ -230,8 +232,17 @@ public class LibsDisguises extends JavaPlugin { }); metrics.addCustomChart(new Metrics.SimplePie("targeted_disguises") { + /** + * Store value just to minimize amount of times it's called, and to persist even when not using anymore + */ + private boolean targetedDisguises; + @Override public String getValue() { + if (targetedDisguises) { + return "Yes"; + } + Collection> list = DisguiseUtilities.getDisguises().values(); if (list.isEmpty()) @@ -242,6 +253,7 @@ public class LibsDisguises extends JavaPlugin { if (disg.getObservers().isEmpty()) continue; + targetedDisguises = true; return "Yes"; } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePermissions.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePermissions.java index 16975778..4ac36795 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePermissions.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePermissions.java @@ -189,12 +189,10 @@ public class DisguisePermissions { Map permissions = new HashMap<>(); // If the command sender is OP, then this will work even as the below code doesn't - for (String perm : new String[]{permissionNode + "*", "libsdisguises.*.*"}) { - if (!sender.hasPermission(perm)) { - continue; - } - - permissions.put(perm, true); + // libsdisguises.[command].[disguise].[options] + // They can use all commands, all disguises, all options + if (sender.hasPermission("libsdisguises.*.*.*")) { + permissions.put("libsdisguises.*.*.*", true); } for (PermissionAttachmentInfo permission : sender.getEffectivePermissions()) { @@ -294,8 +292,9 @@ public class DisguisePermissions { disabled = false; } - // If the child disguise does not have any options defined, give them wildcard by default - if (parsedPermission.options.isEmpty()) { + // If the child disguise does not have any options defined, give them wildcard by default if + // config allows + if (parsedPermission.options.isEmpty() && !DisguiseConfig.isExplictDisguisePermissions()) { storage.wildcardAllow = true; // If this disguise has options defined, unless wildcard was explictly given then remove it } else if (!storage.permittedOptions.contains("*")) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 0ceb2686..cbe7bb59 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,22 @@ -# Shall I notify people of a LibsDisguises update? -NotifyUpdate: true +Permissions: + # By default "libsdisguises.disguise.cow" will allow all options for cow disguise unless another permission has + # defined otherwise. + # If given "libsdisguises.disguise.animals.setburning" then "libsdisguises.disguise.cow" they will still be able to + # use other options like "setbaby". This was provided for backwards compatibility. + # By turning this from 'false' to 'true' the plugin will no longer give them the options unless the player was + # explicitly granted it. Even if by wildcard. The above example means they can only use "setburning" + + # To summerize, "libsdisguises.disguise.cow" will no longer let them do any options on the cow disguise unless it + # was added to their permissions + + # You can read more about permissions here: https://www.spigotmc.org/wiki/lib-s-disguises-setting-up-permissions/ + # The permission used to check OPs who may not have permissions defined, is "libsdisguises.*.*.*" which you can + # negate with your permissions plugin + ExplicitDisguises: false + +# Disables commands with the exception of /libsdisguises. Useful if you don't want the plugin to be used by anything +# but a plugin +DisableCommands: false # The disguise plugin stores all GameProfiles inside a file called 'cache.yml' # This means that the plugin doesn't need to constantly call Mojang just to find a skin for an offline player @@ -49,6 +66,9 @@ Scoreboard: # If self disguises are disabled, or the scoreboard is using IGNORE_SCOREBOARD then this does nothing. WarnConflict: true +# Shall I notify those with the correct permission when there's a LibsDisguises update? +NotifyUpdate: true + # Whats the permission to get the notification? Permission: 'libsdisguises.update'