Exemple #1
0
        public async Task CheckAndSaveNewRole_Error_NameAlreadyTakenAsync()
        {
            string roleName = "New Role 1 " + DateTime.Now.Ticks;
            var    permRepo = DatabaseFixture.Storage.GetRepository <IRolePermissionRepository>();

            try
            {
                // Arrange
                SaveNewRoleAndGrantsViewModel model = new SaveNewRoleAndGrantsViewModel
                {
                    // Really unique value
                    RoleName   = roleName,
                    Extensions = new System.Collections.Generic.List <string> {
                        "Security"
                    },
                    PermissionValue = Permission.Write.ToString()
                };

                // Execute
                var result = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(DatabaseFixture.Storage, DatabaseFixture.RoleManager, model);

                // Assert
                Assert.Null(result);

                // Read back and expect to find the Role record for the new role
                var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(model.RoleName);

                Assert.NotNull(createdRole);

                result = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(DatabaseFixture.Storage, DatabaseFixture.RoleManager, model);

                Assert.NotNull(result);
                Assert.Equal("A role with this name already exists", result);
            }
            finally
            {
                // Cleanup created data
                var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(roleName);

                if (createdRole != null)
                {
                    foreach (var rolePermission in permRepo.FilteredByRoleId(createdRole.Id))
                    {
                        permRepo.Delete(rolePermission.RoleId, rolePermission.Extension);
                    }

                    await DatabaseFixture.RoleManager.DeleteAsync(createdRole);
                }
            }
        }
Exemple #2
0
        public async Task CheckAndSaveNewRole_OkAsync(string extensionNames_)
        {
            string roleName = "New Role 1 " + DateTime.Now.Ticks;
            var    permRepo = DatabaseFixture.Storage.GetRepository <IRolePermissionRepository>();

            try
            {
                // Arrange
                string[] extensions = extensionNames_.Split(',');
                SaveNewRoleAndGrantsViewModel model = new SaveNewRoleAndGrantsViewModel
                {
                    // Really unique value
                    RoleName        = roleName,
                    Extensions      = new System.Collections.Generic.List <string>(extensions),
                    PermissionValue = Permission.Write.ToString()
                };

                // Execute
                var result = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(DatabaseFixture.Storage, DatabaseFixture.RoleManager, model);

                // Assert
                Assert.Null(result);

                // Read back and assert that we have the expected data
                // 1. Expect to find the Role record for the new role
                var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(model.RoleName);

                Assert.NotNull(createdRole);

                // 2. Expect to have an expected number of records in RolePermission table for the new role
                var rolePermissionRecords = permRepo.FilteredByRoleId(createdRole.Id);
                Assert.Equal(extensions.Count(), rolePermissionRecords.Count());
            }
            finally
            {
                // Cleanup created data
                var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(roleName);

                if (createdRole != null)
                {
                    foreach (var rolePermission in permRepo.FilteredByRoleId(createdRole.Id))
                    {
                        permRepo.Delete(rolePermission.RoleId, rolePermission.Extension);
                    }

                    await DatabaseFixture.RoleManager.DeleteAsync(createdRole);
                }
            }
        }
        /// <summary>
        /// First, check that a role with this name doesn't already exist.
        /// Second, save new data into database.
        /// </summary>
        /// <param name="model_">Model with role name and grant data (extensions and permission level)</param>
        /// <param name="roleManager_"></param>
        /// <param name="storage_"></param>
        /// <returns>Not null when something failed, else null when save went ok</returns>
        public static async Task <string> CheckAndSaveNewRoleAndGrants(SaveNewRoleAndGrantsViewModel model_, RoleManager <IdentityRole <string> > roleManager_, IStorage storage_)
        {
            if (await UpdateRole.CheckThatRoleOfThisNameExists(roleManager_, model_.RoleName))
            {
                return("A role with this name already exists");
            }

            try
            {
                // Convert the string to the enum
                var permissionEnum = Enum.Parse <Security.Common.Enums.Permission>(model_.Permission, true);

                // Save the Role
                IdentityRole <string> identityRole = new IdentityRole <string>
                {
                    // Auto-incremented ID
                    Name = model_.RoleName
                };
                await roleManager_.CreateAsync(identityRole);

                // Save the role-extension-permission link
                if (model_.Extensions != null)
                {
                    IRolePermissionRepository repo = storage_.GetRepository <IRolePermissionRepository>();
                    foreach (string extension in model_.Extensions)
                    {
                        repo.Create(new RolePermission
                        {
                            RoleId = identityRole.Id, PermissionId = permissionEnum.ToString(), Scope = extension
                        });
                    }
                }

                storage_.Save();

                return(null);
            }
            catch (Exception e)
            {
                return($"{e.Message} {e.StackTrace}");
            }
        }
Exemple #4
0
        public async Task CheckAndSaveNewRole_Error_NoExtensionSelectedAsync()
        {
            string roleName = "New Role 1 " + DateTime.Now.Ticks;
            var    permRepo = DatabaseFixture.Storage.GetRepository <IRolePermissionRepository>();

            try
            {
                // Arrange
                SaveNewRoleAndGrantsViewModel model = new SaveNewRoleAndGrantsViewModel
                {
                    // Really unique value
                    RoleName        = roleName,
                    Extensions      = null,
                    PermissionValue = Permission.Write.ToString()
                };

                // Execute
                var result = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(DatabaseFixture.Storage, DatabaseFixture.RoleManager, model);

                // Assert
                Assert.NotNull(result);
                Assert.Equal("At least one extension must be selected", result);
            }
            finally
            {
                // Cleanup created data
                var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(roleName);

                if (createdRole != null)
                {
                    foreach (var rolePermission in permRepo.FilteredByRoleId(createdRole.Id))
                    {
                        permRepo.Delete(rolePermission.RoleId, rolePermission.Extension);
                    }

                    await DatabaseFixture.RoleManager.DeleteAsync(createdRole);
                }
            }
        }
Exemple #5
0
        /// <summary>
        /// First, check that a role with this name doesn't already exist.
        ///
        /// Second, save new data into database.
        /// </summary>
        /// <param name="storage_">Storage interface provided by services container.</param>
        /// <param name="roleManager_">Roles manager object.</param>
        /// <param name="model_">A <see cref="SaveNewRoleAndGrantsViewModel" /> object.</param>
        /// <returns>Null if success, otherwise error message.</returns>
        public static async Task <string> CheckAndSaveNewRoleAndGrantsAsync(IStorage storage_, RoleManager <IdentityRole <string> > roleManager_, SaveNewRoleAndGrantsViewModel model_)
        {
            if (await UpdateRoleAndGrants.CheckThatRoleOfThisNameExistsAsync(roleManager_, model_.RoleName))
            {
                return("A role with this name already exists");
            }

            if (model_.Extensions == null || !model_.Extensions.Any())
            {
                return("At least one extension must be selected");
            }

            try
            {
                // Convert the string to the enum
                if (Enum.TryParse <Common.Enums.Permission>(model_.PermissionValue, true, out var permissionEnumValue))
                {
                    var permissionEntity = storage_.GetRepository <IPermissionRepository>().Find(permissionEnumValue);

                    // Save the Role
                    IdentityRole <string> identityRole = new IdentityRole <string>
                    {
                        // Auto-incremented ID
                        Name = model_.RoleName
                    };
                    await roleManager_.CreateAsync(identityRole);

                    // Save the role-extension-permission link
                    if (model_.Extensions != null)
                    {
                        IRolePermissionRepository repo = storage_.GetRepository <IRolePermissionRepository>();
                        foreach (string extension in model_.Extensions)
                        {
                            repo.Create(new RolePermission
                            {
                                RoleId       = identityRole.Id,
                                PermissionId = permissionEntity.Id,
                                Extension    = extension
                            });
                        }
                    }
                }

                await storage_.SaveAsync();

                return(null);
            }
            catch (Exception e)
            {
                return($"{e.Message} {e.StackTrace}");
            }
        }
        public async Task <IActionResult> SaveNewRoleAndItsPermissionsAsync([FromBody] SaveNewRoleAndGrantsViewModel model_)
        {
            string error = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(Storage, _roleManager, model_);

            return(StatusCode(string.IsNullOrEmpty(error) ? (int)HttpStatusCode.Created : (int)HttpStatusCode.BadRequest, error));
        }
Exemple #7
0
        public async Task <ObjectResult> SaveNewRoleAndItsPermissions(SaveNewRoleAndGrantsViewModel model_)
        {
            string error = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrants(model_, _roleManager, Storage);

            return(StatusCode(string.IsNullOrEmpty(error) ? 201 : 400, error));
        }