diff --git a/TShockAPI/Group.cs b/TShockAPI/Group.cs index 16e81345..f5f105ea 100644 --- a/TShockAPI/Group.cs +++ b/TShockAPI/Group.cs @@ -174,26 +174,39 @@ namespace TShockAPI /// Returns true if the user has that permission. public virtual bool HasPermission(string permission) { - if (string.IsNullOrEmpty(permission)) - return true; - - var cur = this; - var traversed = new List(); - while (cur != null) - { - if (cur.negatedpermissions.Contains(permission)) - return false; - if (cur.permissions.Contains(permission)) - return true; - if (traversed.Contains(cur)) - { - throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name)); - } - traversed.Add(cur); - cur = cur.Parent; - } - return false; + string[] nodes = permission.Split('.'); + for (int i = nodes.Length - 1; i >= 0; i--) + { + if (RealHasPermission(String.Join(".", nodes))) + { + return true; + } + nodes[i] = "*"; + } + return false; } + private bool RealHasPermission(string permission) + { + if (string.IsNullOrEmpty(permission)) + return true; + + var cur = this; + var traversed = new List(); + while (cur != null) + { + if (cur.negatedpermissions.Contains(permission)) + return false; + if (cur.permissions.Contains(permission)) + return true; + if (traversed.Contains(cur)) + { + throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name)); + } + traversed.Add(cur); + cur = cur.Parent; + } + return false; + } /// /// Adds a permission to the list of negated permissions.