using System; using System.Collections.Generic; using System.Linq; using Orchard.Data; using Orchard.Logging; using Orchard.Roles.Models; using Orchard.Security.Permissions; namespace Orchard.Roles.Services { public interface IRoleService : IDependency { IEnumerable GetRoles(); RoleRecord GetRole(int id); void CreateRole(string roleName); void CreatePermissionForRole(string roleName, string permissionName); void UpdateRole(int id, string roleName, IEnumerable rolePermissions); void DeleteRole(int id); IDictionary> GetInstalledPermissions(); IEnumerable GetPermissionsForRole(int id); } public class RoleService : IRoleService { private readonly IRepository _roleRepository; private readonly IRepository _permissionRepository; private readonly IEnumerable _permissionProviders; public RoleService(IRepository roleRepository, IRepository permissionRepository, IEnumerable permissionProviders) { _roleRepository = roleRepository; _permissionRepository = permissionRepository; _permissionProviders = permissionProviders; Logger = NullLogger.Instance; } public ILogger Logger { get; set; } #region Implementation of IRoleService public IEnumerable GetRoles() { var roles = from role in _roleRepository.Table select role; return roles.ToList(); } public RoleRecord GetRole(int id) { return _roleRepository.Get(id); } public void CreateRole(string roleName) { _roleRepository.Create(new RoleRecord { Name = roleName }); } public void CreatePermissionForRole(string roleName, string permissionName) { if (_permissionRepository.Get(x => x.Name == permissionName) == null) { _permissionRepository.Create(new PermissionRecord { Description = GetPermissionDescription(permissionName), Name = permissionName, PackageName = GetPackageName(permissionName) }); } RoleRecord roleRecord = _roleRepository.Get(x => x.Name == roleName); PermissionRecord permissionRecord = _permissionRepository.Get(x => x.Name == permissionName); roleRecord.RolesPermissions.Add(new RolesPermissions { Permission = permissionRecord, Role = roleRecord }); } public void UpdateRole(int id, string roleName, IEnumerable rolePermissions) { RoleRecord roleRecord = GetRole(id); roleRecord.Name = roleName; roleRecord.RolesPermissions.Clear(); foreach (var rolePermission in rolePermissions) { string permission = rolePermission; if (_permissionRepository.Get(x => x.Name == permission) == null) { _permissionRepository.Create(new PermissionRecord { Description = GetPermissionDescription(permission), Name = permission, PackageName = GetPackageName(permission) }); } PermissionRecord permissionRecord = _permissionRepository.Get(x => x.Name == permission); roleRecord.RolesPermissions.Add(new RolesPermissions { Permission = permissionRecord, Role = roleRecord }); } } private string GetPackageName(string permissionName) { foreach (var permissionProvider in _permissionProviders) { foreach (var permission in permissionProvider.GetPermissions()) { if (String.Equals(permissionName, permission.Name, StringComparison.OrdinalIgnoreCase)) { return permissionProvider.PackageName; } } } throw new ArgumentException("Permission " + permissionName + " was not found in any of the installed packages."); } private string GetPermissionDescription(string permissionName) { foreach (var permissionProvider in _permissionProviders) { foreach (var permission in permissionProvider.GetPermissions()) { if (String.Equals(permissionName, permission.Name, StringComparison.OrdinalIgnoreCase)) { return permission.Description; } } } throw new ArgumentException("Permission " + permissionName + " was not found in any of the installed packages."); } public void DeleteRole(int id) { _roleRepository.Delete(GetRole(id)); } public IDictionary> GetInstalledPermissions() { Dictionary> installedPermissions = new Dictionary>(); foreach (var permissionProvider in _permissionProviders) { IEnumerable permissions = permissionProvider.GetPermissions(); installedPermissions.Add(permissionProvider.PackageName, permissions); } return installedPermissions; } public IEnumerable GetPermissionsForRole(int id) { List permissions = new List(); RoleRecord roleRecord = GetRole(id); foreach (RolesPermissions rolesPermission in roleRecord.RolesPermissions) { permissions.Add(rolesPermission.Permission.Name); } return permissions; } #endregion } }