From b860e943f63f2006a15441e75492dc9b44f041cc 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. --- .../permissions/BukkitPermissions.java | 37 ++++++++++++---------- 1 file changed, 20 insertions(+), 17 deletions(-) (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java') 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 ad7009c77ebbb47a9694ed4e7f57e8eb5044beaf 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'. --- .../groupmanager/permissions/BukkitPermissions.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java') 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 -- cgit v1.2.3