diff --git a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java index de0e15020..43c2fda37 100644 --- a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java @@ -170,25 +170,26 @@ public class AddonsManager { plugin.log("Addons successfully enabled."); } - void setPerms(Addon addon) { + boolean setPerms(Addon addon) { ConfigurationSection perms = addon.getDescription().getPermissions(); - perms.getKeys(true).stream().filter(perm -> perms.contains(perm + DEFAULT) && perms.contains(perm + ".description")) - .forEach(perm -> { - try { - registerPermission(perms, perm); - } catch (InvalidAddonDescriptionException e) { - plugin.logError("Addon " + addon.getDescription().getName() + ": " + e.getMessage()); + if (perms == null) return false; + for (String perm : perms.getKeys(true)) { + // Only try to register perms for end nodes + if (perms.contains(perm + DEFAULT) && perms.contains(perm + ".description")) { + try { + registerPermission(perms, perm); + } catch (InvalidAddonDescriptionException e) { + plugin.logError("Addon " + addon.getDescription().getName() + ": " + e.getMessage()); + } } - }); + } + return true; } void registerPermission(ConfigurationSection perms, String perm) throws InvalidAddonDescriptionException { - if (perms.getString(perm + DEFAULT) == null) { - throw new InvalidAddonDescriptionException("Permission default is invalid : " + perm + DEFAULT); - } PermissionDefault pd = PermissionDefault.getByName(perms.getString(perm + DEFAULT)); if (pd == null) { - throw new InvalidAddonDescriptionException("Permission default is invalid : " + perm + DEFAULT); + throw new InvalidAddonDescriptionException("Permission default is invalid in addon.yml: " + perm + DEFAULT); } String desc = perms.getString(perm + ".description"); // Replace placeholders for Game Mode Addon names diff --git a/src/test/java/world/bentobox/bentobox/managers/AddonsManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/AddonsManagerTest.java index 553d77805..d09804e59 100644 --- a/src/test/java/world/bentobox/bentobox/managers/AddonsManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/AddonsManagerTest.java @@ -350,6 +350,71 @@ public class AddonsManagerTest { assertFalse(am.isAddonCompatibleWithBentoBox(addon, "1.11.1")); } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#setPerms(Addon)} + * @throws InvalidAddonDescriptionException + * @throws InvalidConfigurationException + */ + @Test + public void testSetPermsNoPerms() { + Addon addon = mock(Addon.class); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "Addon-name", "1.0.0").apiVersion("1.11.1.0.0.0.1").build(); + when(addon.getDescription()).thenReturn(addonDesc); + assertFalse(am.setPerms(addon)); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#setPerms(Addon)} + * @throws InvalidAddonDescriptionException + * @throws InvalidConfigurationException + */ + @Test + public void testSetPermsHasPerms() throws InvalidConfigurationException { + String perms = + " '[gamemode].intopten':\n" + + " description: Player is in the top ten.\n" + + " default: true\n"; + YamlConfiguration config = new YamlConfiguration(); + config.loadFromString(perms); + GameModeAddon addon = new MyGameMode(); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "mygame", "1.0.0").apiVersion("1.11.1.0.0.0.1") + .permissions(config) + .build(); + addon.setDescription(addonDesc); + addon.setState(State.ENABLED); + am.getAddons().add(addon); + + assertTrue(am.setPerms(addon)); + } + + /** + * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#setPerms(Addon)} + * @throws InvalidAddonDescriptionException + * @throws InvalidConfigurationException + */ + @Test + public void testSetPermsHasPermsError() throws InvalidConfigurationException { + String perms = + " '[gamemode].intopten':\n" + + " description: Player is in the top ten.\n" + + " default: trudsfgsde\n"; + YamlConfiguration config = new YamlConfiguration(); + config.loadFromString(perms); + GameModeAddon addon = new MyGameMode(); + AddonDescription addonDesc = new AddonDescription.Builder("main.class", "mygame", "1.0.0").apiVersion("1.11.1.0.0.0.1") + .permissions(config) + .build(); + addon.setDescription(addonDesc); + addon.setState(State.ENABLED); + am.getAddons().add(addon); + + assertTrue(am.setPerms(addon)); + verify(plugin).logError(eq("Addon mygame: AddonException : Permission default is invalid in addon.yml: [gamemode].intopten.default")); + } + + + /** * Test method for {@link world.bentobox.bentobox.managers.AddonsManager#registerPermission(org.bukkit.configuration.ConfigurationSection, String)} * @throws InvalidAddonDescriptionException