Beispiel #1
0
        /// <summary>
        /// Grant <see cref="RBACPermission"/> with supplied <see cref="Permission"/> id to account.
        /// </summary>
        public void GrantPermission(Permission permission)
        {
            RBACPermission rbacPermission = RBACManager.Instance.GetPermission(permission);

            if (rbacPermission == null)
            {
                throw new ArgumentException($"Failed to grant permission to account {session.Account.Id}, {permission} isn't a valid permission!");
            }

            if (!permissions.TryGetValue(permission, out AccountPermission accountPermission))
            {
                permissions.Add(rbacPermission.Permission, new AccountPermission(session.Account.Id, rbacPermission));
            }
            else
            {
                // we have this permission but it's pending a delete from the database, reuse the model
                if (accountPermission.PendingDelete)
                {
                    accountPermission.EnqueueDelete(false);
                }
                else
                {
                    throw new ArgumentException($"Failed to grant permission to account {session.Account.Id}, account already has permission!");
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Create a new <see cref="AccountRBACManager"/> from an existing database model.
        /// </summary>
        public AccountRBACManager(WorldSession session, AccountModel model)
        {
            this.session = session;

            foreach (AccountPermissionModel permissionModel in model.AccountPermission)
            {
                RBACPermission rbacPermission = RBACManager.Instance.GetPermission((Permission)permissionModel.PermissionId);
                if (rbacPermission == null)
                {
                    throw new DatabaseDataException($"Account {model.Id} has invalid permission {permissionModel.PermissionId}!");
                }

                permissions.Add(rbacPermission.Permission, new AccountPermission(permissionModel, rbacPermission));
            }

            foreach (AccountRoleModel roleModel in model.AccountRole)
            {
                RBACRole rbacRole = RBACManager.Instance.GetRole((Role)roleModel.RoleId);
                if (rbacRole == null)
                {
                    throw new DatabaseDataException($"Account {model.Id} has invalid role {roleModel.RoleId}!");
                }

                roles.Add(rbacRole.Role, new AccountRole(roleModel, rbacRole));
            }
        }
Beispiel #3
0
        public void Initialise()
        {
            log.Info("Initialising RBAC permissions...");

            var permissionBuilder = ImmutableDictionary.CreateBuilder <Permission, RBACPermission>();

            foreach (PermissionModel permissionModel in DatabaseManager.Instance.AuthDatabase.GetPermissions())
            {
                var permission = new RBACPermission(permissionModel);
                permissionBuilder.Add(permission.Permission, permission);
            }

            permissions = permissionBuilder.ToImmutable();

            var roleBuilder = ImmutableDictionary.CreateBuilder <Role, RBACRole>();

            foreach (RoleModel roleModel in DatabaseManager.Instance.AuthDatabase.GetRoles())
            {
                // check if permissions for role exist
                if (roleModel.RolePermission.Any(p => GetPermission((Permission)p.PermissionId) == null))
                {
                    throw new DatabaseDataException($"Role {roleModel.Flags}");
                }

                // all permissions are included
                RoleFlags flags = (RoleFlags)roleModel.Flags;
                if ((flags & RoleFlags.Inclusive) != 0)
                {
                    var role = new RBACRole(roleModel,
                                            roleModel.RolePermission
                                            .Select(p => GetPermission((Permission)p.PermissionId))
                                            .ToImmutableDictionary(p => p.Permission, p => p));
                    roleBuilder.Add(role.Role, role);
                }
                // all permissions are excluded
                // this is used when a role will have all permission except a few
                else if ((flags & RoleFlags.Exclusive) != 0)
                {
                    ImmutableDictionary <Permission, RBACPermission> except = roleModel.RolePermission
                                                                              .Select(p => GetPermission((Permission)p.PermissionId))
                                                                              .ToImmutableDictionary(p => p.Permission, p => p);

                    var role = new RBACRole(roleModel,
                                            permissions
                                            .Except(except)
                                            .ToImmutableDictionary(p => p.Key, p => p.Value));
                    roleBuilder.Add(role.Role, role);
                }
            }

            roles = roleBuilder.ToImmutable();

            log.Info($"Loaded {permissions.Count} permission(s) in {roles.Count} role(s).");
        }
Beispiel #4
0
 /// <summary>
 /// Create a new <see cref="AccountPermission"/> from a <see cref="RBACPermission"/>.
 /// </summary>
 public AccountPermission(uint id, RBACPermission permission)
 {
     Id         = id;
     Permission = permission;
     saveMask   = SaveMask.Create;
 }
Beispiel #5
0
 /// <summary>
 /// Create a new <see cref="AccountPermission"/> from an existing database model.
 /// </summary>
 public AccountPermission(AccountPermissionModel model, RBACPermission permission)
 {
     Id         = model.Id;
     Permission = permission;
     saveMask   = SaveMask.None;
 }