CodeAccessPermission模板

    技术2022-05-11  67

     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)