CodeAccessPermission模板

 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枚举即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值