Author:水如烟
Namespace
LzmTW.uSystem.uSecurity
< Flags() > _
Public Enum NamePermissionFlags
NoFlags = 0 ' 固定
Define1 = 1
Define2 = 2
AllFlags = 3 ' 固定,总和
End Enum
End Namespace
< 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() > _
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
< 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
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枚举即可。