From 7562c7777c744b9538c9b2821ccfd70301346fc2 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Tue, 20 Sep 2011 10:35:05 +0100 Subject: Fix for pushing perms of non superperms supporting plugins --- .../permissions/AnjoPermissionsHandler.java | 70 ++++++++++++++++++++++ .../permissions/BukkitPermissions.java | 33 +++++++--- .../permissions/PermissionsReaderInterface.java | 4 ++ 3 files changed, 99 insertions(+), 8 deletions(-) mode change 100755 => 100644 EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java mode change 100755 => 100644 EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager') diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java old mode 100755 new mode 100644 index b892e653e..5830f0c88 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/AnjoPermissionsHandler.java @@ -79,6 +79,76 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface { public String getGroup(String userName) { return ph.getUser(userName).getGroup().getName(); } + + /** + * Returns All permissions (including inheritance) of player name. + * @param userName + * @return + */ + @Override + public List getAllPlayersPermissions(String userName) { + + User user = ph.getUser(userName); + List playerPermArray = new ArrayList(user.getPermissionList()); + List playerMainGroupPermArray = new ArrayList(user.getGroup().getPermissionList()); + List subGroupsPermArray = new ArrayList(); + List returnPermArray = new ArrayList(); + + for (String subGroup : user.subGroupListStringCopy()) { + subGroupsPermArray.addAll(ph.getGroup(subGroup).getPermissionList()); + } + + for (String permission : subGroupsPermArray) { + /* + * Add each Negated permission + * unless it's being overridden by a higher permission + */ + if (permission.startsWith("-") + && !playerMainGroupPermArray.contains(permission.substring(1)) + && !playerPermArray.contains(permission.substring(1)) + && !playerMainGroupPermArray.contains("*") + && !playerPermArray.contains("*")) { + if (!returnPermArray.contains(permission)) { + returnPermArray.add(permission); + } + } else + if (!returnPermArray.contains(permission) + && !playerMainGroupPermArray.contains("-"+permission) + && !playerPermArray.contains("-"+permission)) { + returnPermArray.add(permission); + } + } + + for (String permission : playerMainGroupPermArray) { + /* + * Add each Negated permission + * unless it's being overridden by a higher permission + */ + if (permission.startsWith("-") + && !playerPermArray.contains(permission.substring(1)) + && !playerMainGroupPermArray.contains("*") + && !playerPermArray.contains("*")) { + if (!returnPermArray.contains(permission)) { + returnPermArray.add(permission); + } + } else + if (!returnPermArray.contains(permission) + && !playerPermArray.contains("-"+permission)) { + returnPermArray.add(permission); + } + } + + for (String permission : playerPermArray) { + /* + * Add each permission + */ + if (!returnPermArray.contains(permission)) { + returnPermArray.add(permission); + } + } + + return returnPermArray; + } /** * Verify if player is in suck group. diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java index c88f48d6c..b82a8f473 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/BukkitPermissions.java @@ -16,8 +16,10 @@ package org.anjocaido.groupmanager.permissions; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -115,11 +117,12 @@ public class BukkitPermissions { world = player.getWorld().getName(); } + // All permissions registered with Bukkit for this player PermissionAttachment attachment = this.attachments.get(player); OverloadedWorldHolder worldData = GroupManager.getWorldsHolder().getWorldData(world); - User user = worldData.getUser(player.getName()); + User user = worldData.getUser(player.getName()); // clear permissions for (String permission : attachment.getPermissions().keySet()) { @@ -127,18 +130,32 @@ public class BukkitPermissions { } // find matching permissions + PermissionCheckResult permissionResult; + Boolean value; for (Permission permission : registeredPermissions) { - PermissionCheckResult permissionResult = worldData.getPermissionsHandler().checkFullUserPermission(user, permission.getName()); - Boolean value = false; - if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) { - value = false; - } else if (permissionResult.resultType.equals(PermissionCheckResult.Type.FOUND)) + permissionResult = worldData.getPermissionsHandler().checkFullUserPermission(user, permission.getName()); + if (permissionResult.resultType.equals(PermissionCheckResult.Type.FOUND)) value = true; - + else + value = false; attachment.setPermission(permission, value); - } + } + // Add any missing permissions for this player (non bukkit plugins) + List playerPermArray = new ArrayList(worldData.getPermissionsHandler().getAllPlayersPermissions(player.getName())); + + for (String permission : playerPermArray) { + value = true; + if (permission.startsWith("-")) { + permission = permission.substring(1); // cut off - + value = false; + } + + if (!attachment.getPermissions().containsKey(permission)) { + attachment.setPermission(permission, value); + } + } player.recalculatePermissions(); /* diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java old mode 100755 new mode 100644 index ede097ea4..bdad6f186 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/permissions/PermissionsReaderInterface.java @@ -3,6 +3,8 @@ package org.anjocaido.groupmanager.permissions; //import java.util.Collection; //import java.util.Map; //import java.util.Set; +import java.util.List; + import org.anjocaido.groupmanager.data.Group; //import org.anjocaido.groupmanager.data.User; import org.bukkit.entity.Player; @@ -229,4 +231,6 @@ public abstract class PermissionsReaderInterface { public abstract void removeGroupInfo(String name, String path); ////////////////////////////// + + public abstract List getAllPlayersPermissions(String userName); } -- cgit v1.2.3