using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Abp.Application.Features;
using Abp.Collections.Extensions;
using Abp.Configuration.Startup;
using Abp.Dependency;
using Abp.MultiTenancy;
using Abp.Runtime.Session;
namespace Abp.Authorization
{
///
/// Permission manager.
///
internal class PermissionManager : PermissionDefinitionContextBase, IPermissionManager, ISingletonDependency
{
public IAbpSession AbpSession { get; set; }
private readonly IIocManager _iocManager;
private readonly IAuthorizationConfiguration _authorizationConfiguration;
///
/// Constructor.
///
public PermissionManager(
IIocManager iocManager,
IAuthorizationConfiguration authorizationConfiguration)
{
_iocManager = iocManager;
_authorizationConfiguration = authorizationConfiguration;
AbpSession = NullAbpSession.Instance;
}
public void Initialize()
{
foreach (var providerType in _authorizationConfiguration.Providers)
{
using (var provider = _iocManager.ResolveAsDisposable(providerType))
{
provider.Object.SetPermissions(this);
}
}
Permissions.AddAllPermissions();
}
public Permission GetPermission(string name)
{
var permission = Permissions.GetOrDefault(name);
if (permission == null)
{
throw new AbpException("There is no permission with name: " + name);
}
return permission;
}
public IReadOnlyList GetAllPermissions(bool tenancyFilter = true)
{
using (var featureDependencyContext = _iocManager.ResolveAsDisposable())
{
var featureDependencyContextObject = featureDependencyContext.Object;
return Permissions.Values
.WhereIf(tenancyFilter, p => p.MultiTenancySides.HasFlag(AbpSession.MultiTenancySide))
.Where(p =>
p.FeatureDependency == null ||
AbpSession.MultiTenancySide == MultiTenancySides.Host ||
p.FeatureDependency.IsSatisfied(featureDependencyContextObject)
).ToImmutableList();
}
}
public IReadOnlyList GetAllPermissions(MultiTenancySides multiTenancySides)
{
using (var featureDependencyContext = _iocManager.ResolveAsDisposable())
{
var featureDependencyContextObject = featureDependencyContext.Object;
return Permissions.Values
.Where(p => p.MultiTenancySides.HasFlag(multiTenancySides))
.Where(p =>
p.FeatureDependency == null ||
AbpSession.MultiTenancySide == MultiTenancySides.Host ||
(p.MultiTenancySides.HasFlag(MultiTenancySides.Host) &&
multiTenancySides.HasFlag(MultiTenancySides.Host)) ||
p.FeatureDependency.IsSatisfied(featureDependencyContextObject)
).ToImmutableList();
}
}
}
}