2022-02-03 15:26:44 +00:00
|
|
|
namespace ASC.Common.Security.Authorizing;
|
2019-05-15 14:56:09 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
public class AzObjectSecurityProviderHelper
|
|
|
|
{
|
|
|
|
public ISecurityObjectId CurrentObjectId { get; private set; }
|
|
|
|
public bool ObjectRolesSupported => _currSecObjProvider != null && _currSecObjProvider.ObjectRolesSupported;
|
2019-05-15 14:56:09 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
private readonly SecurityCallContext _callContext;
|
|
|
|
private readonly bool _currObjIdAsProvider;
|
|
|
|
private ISecurityObjectProvider _currSecObjProvider;
|
2019-05-15 14:56:09 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
public AzObjectSecurityProviderHelper(ISecurityObjectId objectId, ISecurityObjectProvider secObjProvider)
|
2022-03-09 17:15:51 +00:00
|
|
|
{
|
|
|
|
ArgumentNullException.ThrowIfNull(objectId);
|
2022-02-03 15:26:44 +00:00
|
|
|
_currObjIdAsProvider = false;
|
2022-03-09 17:15:51 +00:00
|
|
|
CurrentObjectId = objectId;
|
2022-02-03 15:26:44 +00:00
|
|
|
_currSecObjProvider = secObjProvider;
|
2019-05-15 14:56:09 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
if (_currSecObjProvider == null && CurrentObjectId is ISecurityObjectProvider securityObjectProvider)
|
2019-05-15 14:56:09 +00:00
|
|
|
{
|
2022-02-03 15:26:44 +00:00
|
|
|
_currObjIdAsProvider = true;
|
|
|
|
_currSecObjProvider = securityObjectProvider;
|
2019-05-15 14:56:09 +00:00
|
|
|
}
|
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
_callContext = new SecurityCallContext();
|
|
|
|
}
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
public IEnumerable<IRole> GetObjectRoles(ISubject account)
|
|
|
|
{
|
|
|
|
var roles = _currSecObjProvider.GetObjectRoles(account, CurrentObjectId, _callContext);
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
foreach (var role in roles)
|
|
|
|
{
|
2022-02-08 11:07:28 +00:00
|
|
|
if (!_callContext.RolesList.Contains(role))
|
|
|
|
{
|
|
|
|
_callContext.RolesList.Add(role);
|
|
|
|
}
|
2019-05-15 14:56:09 +00:00
|
|
|
}
|
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
return roles;
|
|
|
|
}
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
public bool NextInherit()
|
|
|
|
{
|
2022-02-08 11:07:28 +00:00
|
|
|
if (_currSecObjProvider == null || !_currSecObjProvider.InheritSupported)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
CurrentObjectId = _currSecObjProvider.InheritFrom(CurrentObjectId);
|
2022-02-08 11:07:28 +00:00
|
|
|
if (CurrentObjectId == null)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-08 11:07:28 +00:00
|
|
|
if (_currObjIdAsProvider)
|
|
|
|
{
|
|
|
|
_currSecObjProvider = CurrentObjectId as ISecurityObjectProvider;
|
|
|
|
}
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
_callContext.ObjectsStack.Insert(0, CurrentObjectId);
|
|
|
|
|
|
|
|
return _currSecObjProvider != null;
|
2019-05-15 14:56:09 +00:00
|
|
|
}
|
|
|
|
}
|