Author:水如烟
Namespace LzmTW.uSystem.uSecurity < Flags() > _ Public Enum NamePermissionFlags NoFlags = 0 ' 固定 Define1 = 1 Define2 = 2 AllFlags = 3 ' 固定,总和 End Enum End Namespace
Imports LzmTW.uSystem.uSecurity.uUti Namespace LzmTW.uSystem.uSecurity < Serializable() > _ Public NotInheritable Class NamePermission Inherits CodeAccessPermission Implements IUnrestrictedPermission Private gFlags As NamePermissionFlags Public Property Flags() As NamePermissionFlags Get Return Me .gFlags End Get Set ( ByVal value As NamePermissionFlags) VerifyFlags(value) Me .gFlags = value End Set End Property Sub New ( ByVal state As PermissionState) If state = PermissionState.Unrestricted Then Me .SetUnrestricted( True ) Else If (state <> PermissionState.None) Then Throw New ArgumentException( " state " ) End If Me .SetUnrestricted( False ) Me .Reset() End If End Sub Sub New ( ByVal flags As NamePermissionFlags) VerifyFlags(flags) Me .gFlags = flags End Sub Private Sub SetUnrestricted( ByVal unrestricted As Boolean ) If unrestricted Then Me .gFlags = NamePermissionFlags.AllFlags End If End Sub Private Sub Reset () Me .gFlags = NamePermissionFlags.NoFlags End Sub Friend Function VerifyType( ByVal perm As CodeAccessPermission) As Boolean If Not perm Is Nothing AndAlso perm.GetType Is MyBase .GetType Then Return True End If Return False End Function Friend Shared Sub VerifyFlags( ByVal flags As NamePermissionFlags) If ((flags And Not NamePermissionFlags.AllFlags) <> NamePermissionFlags.NoFlags) Then Throw New ArgumentException( " flags " ) End If End Sub Public Function IsUnrestricted() As Boolean Implements IUnrestrictedPermission.IsUnrestricted Return Me .gFlags = NamePermissionFlags.AllFlags End Function Public Overrides Function Copy() As IPermission Return New NamePermission( Me .gFlags) End Function Public Overrides Sub FromXml( ByVal element As SecurityElement) XMLUtil.ValidateElement(element) If XMLUtil.IsUnrestricted(element) Then Me .SetUnrestricted( True ) Else Me .gFlags = NamePermissionFlags.NoFlags Dim strFlags As String = element.Attribute( " Flags " ) If Not strFlags Is Nothing Then Me .gFlags = DirectCast ([ Enum ].Parse( GetType (NamePermissionFlags), strFlags), NamePermissionFlags) End If End If End Sub Public Overrides Function Intersect( ByVal target As IPermission) As IPermission If target Is Nothing Then Return Nothing End If If Not VerifyType( CType (target, CodeAccessPermission)) Then Throw New ArgumentException( " WrongType " ) End If Dim mPermission As NamePermission = DirectCast (target, NamePermission) Dim mFlags As NamePermissionFlags = Me .gFlags And mPermission.Flags If mFlags = NamePermissionFlags.NoFlags Then Return Nothing End If Return New NamePermission(mFlags) End Function Public Overrides Function IsSubsetOf( ByVal target As IPermission) As Boolean If target Is Nothing Then Return Me .gFlags = NamePermissionFlags.NoFlags End If Dim mResult As Boolean = False Try Dim mPermission As NamePermission = DirectCast (target, NamePermission) If mPermission.IsUnrestricted Then Return True End If If Me .IsUnrestricted Then Return False End If Dim mMaxInt As Integer = NamePermissionFlags.AllFlags + 1 Dim mNum As Integer = CInt (Math.Log(mMaxInt) / Math.Log( 2 )) Dim mValue As Integer For i As Integer = 0 To mNum - 1 mValue = CInt (Math.Pow( 2 , i)) mResult = (( Me .gFlags And mValue) <= (mPermission.Flags And mValue)) If mResult = False Then Exit For Next Catch ex As InvalidCastException Throw New ArgumentException( " WrongType " ) End Try Return mResult End Function Public Overrides Function Union( ByVal target As IPermission) As IPermission If target Is Nothing Then Return Me .Copy End If If Not VerifyType( CType (target, CodeAccessPermission)) Then Throw New ArgumentException( " WrongType " ) End If Dim mPermission As NamePermission = DirectCast (target, NamePermission) Return New NamePermission(( Me .gFlags Or mPermission.Flags)) End Function Public Overrides Function ToXml() As SecurityElement Dim element As SecurityElement = XMLUtil.CreatePermissionElement( Me ) If Not Me .IsUnrestricted Then If Me .gFlags <> NamePermissionFlags.NoFlags Then element.AddAttribute( " Flags " , [ Enum ].GetName( GetType (NamePermissionFlags), Me .gFlags)) End If Return element End If XMLUtil.AddUnrestrictedAttribute(element) Return element End Function End Class End Namespace
Namespace LzmTW.uSystem.uSecurity < Serializable() > _ < AttributeUsage( _ AttributeTargets.Method Or _ AttributeTargets.Constructor Or _ AttributeTargets.Struct Or _ AttributeTargets.Class Or _ AttributeTargets.Assembly, AllowMultiple: = True , Inherited: = False ) > _ Public NotInheritable Class NamePermissionAttribute Inherits CodeAccessSecurityAttribute Private gflags As NamePermissionFlags Public Sub New ( ByVal action As SecurityAction) MyBase .New(action) End Sub Public Overrides Function CreatePermission() As System.Security.IPermission If MyBase .Unrestricted Then Return New NamePermission(PermissionState.Unrestricted) End If Return New NamePermission( Me .gflags) End Function ' 这里需要一个个添加枚举值,如 Public Property Define1() As Boolean Get Return GetValue(NamePermissionFlags.Define1) End Get Set ( ByVal value As Boolean ) SetValue(NamePermissionFlags.Define1, value) End Set End Property Public Property Define2() As Boolean Get Return GetValue(NamePermissionFlags.Define2) End Get Set ( ByVal value As Boolean ) SetValue(NamePermissionFlags.Define2, value) End Set End Property Private Function GetValue( ByVal flags As NamePermissionFlags) As Boolean Return (( Me .gflags And flags) <> NamePermissionFlags.NoFlags) End Function Private Sub SetValue( ByVal flags As NamePermissionFlags, ByVal value As Boolean ) If value = True Then Me .gflags = Me .gflags Or flags Else Me .gflags = Me .gflags And Not flags End If End Sub End Class End Namespace
Namespace LzmTW.uSystem.uSecurity.uUti Friend Class XMLUtil Private Shared Function IsPermissionElement( ByVal element As SecurityElement) As Boolean If Not element.Tag.Equals( " Permission " ) AndAlso Not element.Tag.Equals( " IPermission " ) Then Return False End If Return True End Function Friend Shared Function CreatePermissionElement( ByVal perm As CodeAccessPermission, _ Optional ByVal permname As String = Nothing ) As SecurityElement Dim element As New SecurityElement( " IPermission " ) AddClassAttribute(element, perm.GetType, permname) element.AddAttribute( " version " , " 1 " ) Return element End Function Private Shared Sub AddClassAttribute( ByVal element As SecurityElement, ByVal type As Type, ByVal typename As String ) If typename Is Nothing Then typename = type.FullName End If element.AddAttribute( " class " , String .Concat( typename , " , " , type.Module.Assembly.FullName.Replace( " "" " c, " ' " c))) End Sub Friend Shared Sub AddUnrestrictedAttribute( ByVal element As SecurityElement) element.AddAttribute( " Unrestricted " , " true " ) End Sub Friend Shared Sub ValidateElement( ByVal element As SecurityElement) If element Is Nothing Then Throw New ArgumentNullException( " element " ) End If If Not IsPermissionElement(element) Then Throw New ArgumentException( " PermissionElement " ) End If Dim version As String = element.Attribute( " version " ) If Not version Is Nothing AndAlso Not version.Equals( " 1 " ) Then Throw New ArgumentException( " version " ) End If End Sub Friend Shared Function IsUnrestricted( ByVal element As SecurityElement) As Boolean Dim Unrestricted As String = element.Attribute( " Unrestricted " ) If Unrestricted Is Nothing Then Return False End If Return Unrestricted.Equals( " true " ) End Function End Class End Namespace
使用:
将新创建的Attibute名称更换所有的NamePermission,包括三个文件名,重新定义Flags枚举即可。