From dac89c338a2853050cdb81c2606fb89d4c76e481 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 13 Jan 2013 16:20:09 +0000 Subject: Synchronize pushing to Bukkit perms to prevent any ConcurrentModificationException. --- EssentialsGroupManager/src/Changelog.txt | 3 +- .../permissions/BukkitPermissions.java | 37 ++++++++++++---------- 2 files changed, 22 insertions(+), 18 deletions(-) (limited to 'EssentialsGroupManager') diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 175d59959..0fb2d9d17 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -205,4 +205,5 @@ v 2.0: - Add support for Rcon. - Prevent GM commands from being used on CommandBlocks. - Clear our attachment map upon a manload so we correctly reconfigure a players new permissions. - - Synchronize the raising of GroupManager events to Bukkit.getServer() (should prevent deadlocks). \ No newline at end of file + - Synchronize the raising of GroupManager events to Bukkit.getServer() (should prevent deadlocks). + - Synchronize pushing to Bukkit perms to prevent any ConcurrentModificationException. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index 6b02a2286..a200a7b9a 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -137,8 +137,7 @@ public class BukkitPermissions { /** * Push all permissions which are registered with GM for this player, on - * this world to Bukkit - * and make it update for the child nodes. + * this world to Bukkit and make it update for the child nodes. * * @param player * @param world @@ -148,9 +147,9 @@ public class BukkitPermissions { if (player == null || !GroupManager.isLoaded()) { return; } - + String name = player.getName(); - + // Reset the User objects player reference. User user = plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(name); if (user != null) @@ -175,7 +174,8 @@ public class BukkitPermissions { List playerPermArray = new ArrayList(plugin.getWorldsHolder().getWorldData(world).getPermissionsHandler().getAllPlayersPermissions(name, false)); LinkedHashMap newPerms = new LinkedHashMap(); - // Sort the perm list by parent/child, so it will push to superperms correctly. + // Sort the perm list by parent/child, so it will push to superperms + // correctly. playerPermArray = sort(playerPermArray); Boolean value = false; @@ -186,25 +186,28 @@ public class BukkitPermissions { /** * This is put in place until such a time as Bukkit pull 466 is - * implemented - * https://github.com/Bukkit/Bukkit/pull/466 + * implemented https://github.com/Bukkit/Bukkit/pull/466 */ try { // Codename_B source - @SuppressWarnings("unchecked") - Map orig = (Map) permissions.get(attachment); - // Clear the map (faster than removing the attachment and recalculating) - orig.clear(); - // Then whack our map into there - orig.putAll(newPerms); - // That's all folks! - attachment.getPermissible().recalculatePermissions(); - //player.recalculatePermissions(); + synchronized (attachment.getPermissible()) { + + @SuppressWarnings("unchecked") + Map orig = (Map) permissions.get(attachment); + // Clear the map (faster than removing the attachment and + // recalculating) + orig.clear(); + // Then whack our map into there + orig.putAll(newPerms); + // That's all folks! + attachment.getPermissible().recalculatePermissions(); + + } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } - + GroupManager.logger.finest("Attachment updated for: " + name); } -- cgit v1.2.3 From 8863bfa6a102d7b759afff5cd9a1043f870539af Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 13 Jan 2013 16:20:38 +0000 Subject: Fix the logger so errors are reported again. --- .../src/org/anjocaido/groupmanager/GMConfiguration.java | 2 +- EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'EssentialsGroupManager') diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java index 95fd35eb0..4fcd0a554 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GMConfiguration.java @@ -112,7 +112,7 @@ public class GMConfiguration { Object level = ((Map) getElement("settings", GMconfig).get("logging")).get("level"); if (level instanceof String) - level = (String) level; + loggerLevel = (String) level; /* * Store our mirrors map for parsing later. diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java index 8298988e6..3236b9b84 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/GroupManager.java @@ -152,7 +152,7 @@ public class GroupManager extends JavaPlugin { ch = new GMLoggerHandler(); GroupManager.logger.addHandler(ch); } - logger.setLevel(Level.ALL); + GroupManager.logger.setLevel(Level.ALL); // Create the backup folder, if it doesn't exist. prepareFileFields(); -- cgit v1.2.3 From 2095c426aa75bf4626adff1e673cd302c81b80f1 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 13 Jan 2013 16:39:53 +0000 Subject: Do not grant any permissions (nort update Bukkit) if the server is in offline mode and the player has the permission node 'groupmanager.noofflineperms'. --- EssentialsGroupManager/src/Changelog.txt | 3 ++- .../groupmanager/permissions/AnjoPermissionsHandler.java | 10 ++++++++++ .../groupmanager/permissions/BukkitPermissions.java | 13 ++++++++++++- EssentialsGroupManager/src/users.yml | 9 ++++++--- 4 files changed, 30 insertions(+), 5 deletions(-) (limited to 'EssentialsGroupManager') diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 0fb2d9d17..74e1581a6 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -206,4 +206,5 @@ v 2.0: - Prevent GM commands from being used on CommandBlocks. - Clear our attachment map upon a manload so we correctly reconfigure a players new permissions. - Synchronize the raising of GroupManager events to Bukkit.getServer() (should prevent deadlocks). - - Synchronize pushing to Bukkit perms to prevent any ConcurrentModificationException. \ No newline at end of file + - Synchronize pushing to Bukkit perms to prevent any ConcurrentModificationException. + - Do not grant any permissions (nort update Bukkit) if the server is in offline mode and the player has the permission node 'groupmanager.noofflineperms'. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java index e954a88fd..59efb33dc 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java @@ -16,6 +16,7 @@ import org.anjocaido.groupmanager.data.Group; import org.anjocaido.groupmanager.dataholder.WorldDataHolder; import org.anjocaido.groupmanager.data.User; import org.anjocaido.groupmanager.utils.PermissionCheckResult; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; /** @@ -784,6 +785,15 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { if (user == null || targetPermission == null || targetPermission.isEmpty()) { return result; } + + /* + * Do not push any perms to bukkit if... + * We are in offline mode + * and the player has the 'groupmanager.noofflineperms' permission. + */ + if (!Bukkit.getServer().getOnlineMode() + && (checkFullGMPermission(user, "groupmanager.noofflineperms", true).resultType == PermissionCheckResult.Type.FOUND)) + return result; if (checkBukkit) { // Check Bukkit perms to support plugins which add perms via code diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index a200a7b9a..03742b023 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -31,7 +31,6 @@ import java.util.WeakHashMap; import org.anjocaido.groupmanager.GroupManager; import org.anjocaido.groupmanager.data.User; - import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -183,6 +182,18 @@ public class BukkitPermissions { value = (!permission.startsWith("-")); newPerms.put((value ? permission : permission.substring(1)), value); } + + /* + * Do not push any perms to bukkit if... + * We are in offline mode + * and the player has the 'groupmanager.noofflineperms' permission. + */ + if (!Bukkit.getServer().getOnlineMode() + && (newPerms.containsKey("groupmanager.noofflineperms") && (newPerms.get("groupmanager.noofflineperms") == true))) { + removeAttachment(name); + return; + } + /** * This is put in place until such a time as Bukkit pull 466 is diff --git a/EssentialsGroupManager/src/users.yml b/EssentialsGroupManager/src/users.yml index 19496ad84..eaea6232d 100644 --- a/EssentialsGroupManager/src/users.yml +++ b/EssentialsGroupManager/src/users.yml @@ -3,13 +3,16 @@ users: snowleo: group: Builder subgroups: [] - permissions: [] + permissions: + - groupmanager.noofflineperms KHobbits: group: Moderator subgroups: [] - permissions: [] + permissions: + - groupmanager.noofflineperms ElgarL: group: Moderator subgroups: [] - permissions: [] + permissions: + - groupmanager.noofflineperms -- cgit v1.2.3 From 438f4969b06a8a8137a16d181118b715c866d672 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Sun, 13 Jan 2013 16:40:53 +0000 Subject: typo in changelog. --- EssentialsGroupManager/src/Changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'EssentialsGroupManager') diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index 74e1581a6..bbdab6a4f 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -207,4 +207,4 @@ v 2.0: - Clear our attachment map upon a manload so we correctly reconfigure a players new permissions. - Synchronize the raising of GroupManager events to Bukkit.getServer() (should prevent deadlocks). - Synchronize pushing to Bukkit perms to prevent any ConcurrentModificationException. - - Do not grant any permissions (nort update Bukkit) if the server is in offline mode and the player has the permission node 'groupmanager.noofflineperms'. \ No newline at end of file + - Do not grant any permissions (nor update Bukkit) if the server is in offline mode and the player has the permission node 'groupmanager.noofflineperms'. \ No newline at end of file -- cgit v1.2.3