Merge pull request #393 from stevenh/4c09e7b66ffae774c7033b2a68cf25a105ab6406

Fix negated permissions and permissions not applying instantly
This commit is contained in:
Steven Hartland 2012-02-20 03:06:52 -08:00
commit 22a0e4307e
3 changed files with 46 additions and 5 deletions

View file

@ -19,6 +19,7 @@ using System;
using System.Data; using System.Data;
using System.IO; using System.IO;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -130,11 +131,18 @@ namespace TShockAPI.DB
{ {
try try
{ {
if (!TShock.Groups.GroupExists(group)) Group grp = TShock.Groups.GetGroupByName(group);
if (null == grp)
throw new GroupNotExistsException(group); throw new GroupNotExistsException(group);
if (database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", group, user.Name) == 0) if (database.Query("UPDATE Users SET UserGroup = @0 WHERE Username = @1;", group, user.Name) == 0)
throw new UserNotExistException(user.Name); throw new UserNotExistException(user.Name);
// Update player group reference for any logged in player
foreach (var player in TShock.Players.Where(p => null != p && p.UserAccountName == user.Name))
{
player.Group = grp;
}
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -16,6 +16,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using System; using System;
using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
namespace TShockAPI namespace TShockAPI
@ -59,7 +60,7 @@ namespace TShockAPI
get get
{ {
List<string> all = new List<string>(permissions); List<string> all = new List<string>(permissions);
permissions.ForEach(p => all.Add("!" + p)); negatedpermissions.ForEach(p => all.Add("!" + p));
return string.Join(",", all); return string.Join(",", all);
} }
set set
@ -71,6 +72,36 @@ namespace TShockAPI
} }
} }
public List<string> TotalPermissions
{
get
{
var cur = this;
var traversed = new List<Group>();
HashSet<string> all = new HashSet<string>();
while (cur != null)
{
foreach (var perm in cur.permissions)
{
all.Add(perm);
}
foreach (var perm in cur.negatedpermissions)
{
all.Remove(perm);
}
if (traversed.Contains(cur))
{
throw new Exception("Infinite group parenting ({0})".SFormat(cur.Name));
}
traversed.Add(cur);
cur = cur.Parent;
}
return all.ToList();
}
}
public byte R = 255; public byte R = 255;
public byte G = 255; public byte G = 255;
public byte B = 255; public byte B = 255;
@ -85,12 +116,13 @@ namespace TShockAPI
public virtual bool HasPermission(string permission) public virtual bool HasPermission(string permission)
{ {
if (string.IsNullOrEmpty(permission))
return true;
var cur = this; var cur = this;
var traversed = new List<Group>(); var traversed = new List<Group>();
while (cur != null) while (cur != null)
{ {
if (string.IsNullOrEmpty(permission))
return true;
if (cur.negatedpermissions.Contains(permission)) if (cur.negatedpermissions.Contains(permission))
return false; return false;
if (cur.permissions.Contains(permission)) if (cur.permissions.Contains(permission))

View file

@ -584,7 +584,8 @@ namespace TShockAPI
{"parent", group.ParentName}, {"parent", group.ParentName},
{"chatcolor", group.ChatColor}, {"chatcolor", group.ChatColor},
{"permissions", group.permissions}, {"permissions", group.permissions},
{"negatedpermissions", group.negatedpermissions} {"negatedpermissions", group.negatedpermissions},
{"totalpermissions", group.TotalPermissions}
}; };
} }