using System;
using System.Linq;
namespace InABox.Core
{
///
/// Causes a property to update its editable status based on . If the current user does not have the security token,
/// then the property's visiblity is restricted to at most .
///
///
/// defaults to .
///
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class SecurityAttribute : Attribute
{
public Type SecurityDescriptor { get; set; }
public Editable Editable { get; set; } = Editable.Hidden;
private SecurityAttribute() { }
public SecurityAttribute(Type securityDescriptor)
{
if (!securityDescriptor.GetInterfaces().Contains(typeof(ISecurityDescriptor)))
throw new Exception(securityDescriptor.EntityName() + " is not a valid security descriptor!");
SecurityDescriptor = securityDescriptor;
}
public virtual SecurityAttribute Clone()
{
var result = new SecurityAttribute(SecurityDescriptor)
{
SecurityDescriptor = SecurityDescriptor,
Editable = Editable
};
return result;
}
}
public class CanViewAttribute : SecurityAttribute
{
public CanViewAttribute(Type TEntity): base(
typeof(AutoSecurityDescriptor<,>).MakeGenericType(TEntity, typeof(CanView<>).MakeGenericType(TEntity)))
{
}
}
public class CanEditAttribute : SecurityAttribute
{
public CanEditAttribute(Type TEntity) : base(
typeof(AutoSecurityDescriptor<,>).MakeGenericType(TEntity, typeof(CanEdit<>).MakeGenericType(TEntity)))
{
}
}
public class CanDeleteAttribute : SecurityAttribute
{
public CanDeleteAttribute(Type TEntity) : base(
typeof(AutoSecurityDescriptor<,>).MakeGenericType(TEntity, typeof(CanDelete<>).MakeGenericType(TEntity)))
{
}
}
}