Merge pull request #393 from stevenh/4c09e7b66ffae774c7033b2a68cf25a105ab6406
Fix negated permissions and permissions not applying instantly
This commit is contained in:
commit
22a0e4307e
3 changed files with 46 additions and 5 deletions
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue