StrongNameIdentityPermission.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Security / Permissions / StrongNameIdentityPermission.cs / 1 / StrongNameIdentityPermission.cs

                            // ==++== 
//
//   Copyright (c) Microsoft Corporation.  All rights reserved.
//
// ==--== 
// StrongNameIdentityPermission.cs
// 
 
namespace System.Security.Permissions
{ 
    using System;
    using SecurityElement = System.Security.SecurityElement;
    using System.Security.Util;
    using System.IO; 
    using String = System.String;
    using Version = System.Version; 
    using System.Security.Policy; 
    using System.Collections;
    using System.Globalization; 

    // The only difference between this class and System.Security.Policy.StrongName is that this one
    // allows m_name to be null.  We should merge this class with System.Security.Policy.StrongName
    [Serializable()] sealed internal class StrongName2 
    {
        public StrongNamePublicKeyBlob m_publicKeyBlob; 
        public String m_name; 
        public Version m_version;
 
        public StrongName2(StrongNamePublicKeyBlob publicKeyBlob, String name, Version version)
        {
            m_publicKeyBlob = publicKeyBlob;
            m_name = name; 
            m_version = version;
        } 
 
        public StrongName2 Copy()
        { 
            return new StrongName2(m_publicKeyBlob, m_name, m_version);
        }

        public bool IsSubsetOf(StrongName2 target) 
        {
            // This StrongName2 is a subset of the target if it's public key blob is null no matter what 
            if (this.m_publicKeyBlob == null) 
                return true;
 
            // Subsets are always false if the public key blobs do not match
            if (!this.m_publicKeyBlob.Equals( target.m_publicKeyBlob ))
                return false;
 
            // We use null in strings to represent the "Anything" state.
            // Therefore, the logic to detect an individual subset is: 
            // 
            // 1. If the this string is null ("Anything" is a subset of any other).
            // 2. If the this string and target string are the same (equality is sufficient for a subset). 
            //
            // The logic is reversed here to discover things that are not subsets.
            if (this.m_name != null)
            { 
                if (target.m_name == null || !System.Security.Policy.StrongName.CompareNames( target.m_name, this.m_name ))
                    return false; 
            } 

            if ((Object) this.m_version != null) 
            {
                if ((Object) target.m_version == null ||
                    target.m_version.CompareTo( this.m_version ) != 0)
                { 
                    return false;
                } 
            } 

            return true; 
        }

        public StrongName2 Intersect(StrongName2 target)
        { 
            if (target.IsSubsetOf( this ))
                return target.Copy(); 
            else if (this.IsSubsetOf( target )) 
                return this.Copy();
            else 
                return null;
        }

        public bool Equals(StrongName2 target) 
        {
            if (!target.IsSubsetOf(this)) 
                return false; 
            if (!this.IsSubsetOf(target))
                return false; 
            return true;
        }
    }
 

 
[System.Runtime.InteropServices.ComVisible(true)] 
    [Serializable()] sealed public class StrongNameIdentityPermission : CodeAccessPermission, IBuiltInPermission
    { 
        //------------------------------------------------------
        //
        // PRIVATE STATE DATA
        // 
        //-----------------------------------------------------
 
        private bool m_unrestricted; 
        private StrongName2[] m_strongNames;
 
        //-----------------------------------------------------
        //
        // PUBLIC CONSTRUCTORS
        // 
        //-----------------------------------------------------
 
 
        public StrongNameIdentityPermission(PermissionState state)
        { 
            if (state == PermissionState.Unrestricted)
            {
                if(CodeAccessSecurityEngine.DoesFullTrustMeanFullTrust())
                    m_unrestricted = true; 
                else
                    throw new ArgumentException(Environment.GetResourceString("Argument_UnrestrictedIdentityPermission")); 
            } 
            else if (state == PermissionState.None)
            { 
                m_unrestricted = false;
            }
            else
            { 
                throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPermissionState"));
            } 
        } 

        public StrongNameIdentityPermission( StrongNamePublicKeyBlob blob, String name, Version version ) 
        {
            if (blob == null)
                throw new ArgumentNullException( "blob" );
            if (name != null && name.Equals( "" )) 
                throw new ArgumentException( Environment.GetResourceString( "Argument_EmptyStrongName" ) );
            m_unrestricted = false; 
            m_strongNames = new StrongName2[1]; 
            m_strongNames[0] = new StrongName2(blob, name, version);
        } 


        //------------------------------------------------------
        // 
        // PUBLIC ACCESSOR METHODS
        // 
        //----------------------------------------------------- 

        public StrongNamePublicKeyBlob PublicKey 
        {
            set
            {
                if (value == null) 
                    throw new ArgumentNullException( "PublicKey" );
                m_unrestricted = false; 
                if(m_strongNames != null && m_strongNames.Length == 1) 
                    m_strongNames[0].m_publicKeyBlob = value;
                else 
                {
                    m_strongNames = new StrongName2[1];
                    m_strongNames[0] = new StrongName2(value, "", new Version());
                } 
            }
 
            get 
            {
                if(m_strongNames == null || m_strongNames.Length == 0) 
                    return null;
                if(m_strongNames.Length > 1)
                    throw new NotSupportedException(Environment.GetResourceString("NotSupported_AmbiguousIdentity"));
                return m_strongNames[0].m_publicKeyBlob; 
            }
        } 
 
        public String Name
        { 
            set
            {
                if (value != null && value.Length == 0)
                    throw new ArgumentException( Environment.GetResourceString("Argument_EmptyName" )); 
                m_unrestricted = false;
                if(m_strongNames != null && m_strongNames.Length == 1) 
                    m_strongNames[0].m_name = value; 
                else
                { 
                    m_strongNames = new StrongName2[1];
                    m_strongNames[0] = new StrongName2(null, value, new Version());
                }
            } 

            get 
            { 
                if(m_strongNames == null || m_strongNames.Length == 0)
                    return ""; 
                if(m_strongNames.Length > 1)
                    throw new NotSupportedException(Environment.GetResourceString("NotSupported_AmbiguousIdentity"));
                return m_strongNames[0].m_name;
            } 
        }
 
        public Version Version 
        {
            set 
            {
                m_unrestricted = false;
                if(m_strongNames != null && m_strongNames.Length == 1)
                    m_strongNames[0].m_version = value; 
                else
                { 
                    m_strongNames = new StrongName2[1]; 
                    m_strongNames[0] = new StrongName2(null, "", value);
                } 
            }

            get
            { 
                if(m_strongNames == null || m_strongNames.Length == 0)
                    return new Version(); 
                if(m_strongNames.Length > 1) 
                    throw new NotSupportedException(Environment.GetResourceString("NotSupported_AmbiguousIdentity"));
                return m_strongNames[0].m_version; 
            }
        }

        //------------------------------------------------------ 
        //
        // PRIVATE AND PROTECTED HELPERS FOR ACCESSORS AND CONSTRUCTORS 
        // 
        //------------------------------------------------------
 
        //-----------------------------------------------------
        //
        // CODEACCESSPERMISSION IMPLEMENTATION
        // 
        //------------------------------------------------------
 
        //----------------------------------------------------- 
        //
        // IPERMISSION IMPLEMENTATION 
        //
        //-----------------------------------------------------

 
        public override IPermission Copy()
        { 
            StrongNameIdentityPermission perm = new StrongNameIdentityPermission(PermissionState.None); 
            perm.m_unrestricted = this.m_unrestricted;
            if(this.m_strongNames != null) 
            {
                perm.m_strongNames = new StrongName2[this.m_strongNames.Length];
                int n;
                for(n = 0; n < this.m_strongNames.Length; n++) 
                    perm.m_strongNames[n] = this.m_strongNames[n].Copy();
            } 
            return perm; 
        }
 
        public override bool IsSubsetOf(IPermission target)
        {
            if (target == null)
            { 
                if(m_unrestricted)
                    return false; 
                if(m_strongNames == null) 
                    return true;
                if(m_strongNames.Length == 0) 
                    return true;
                return false;
            }
            StrongNameIdentityPermission that = target as StrongNameIdentityPermission; 
            if(that == null)
                throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName)); 
            if(that.m_unrestricted) 
                return true;
            if(m_unrestricted) 
                return false;
            if(this.m_strongNames != null)
            {
                foreach(StrongName2 snThis in m_strongNames) 
                {
                    bool bOK = false; 
                    if(that.m_strongNames != null) 
                    {
                        foreach(StrongName2 snThat in that.m_strongNames) 
                        {
                            if(snThis.IsSubsetOf(snThat))
                            {
                                bOK = true; 
                                break;
                            } 
                        } 
                    }
                    if(!bOK) 
                        return false;
                }
            }
            return true; 
        }
 
 

        public override IPermission Intersect(IPermission target) 
        {
            if (target == null)
                return null;
            StrongNameIdentityPermission that = target as StrongNameIdentityPermission; 
            if(that == null)
                throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName)); 
            if(this.m_unrestricted && that.m_unrestricted) 
            {
                StrongNameIdentityPermission res = new StrongNameIdentityPermission(PermissionState.None); 
                res.m_unrestricted = true;
                return res;
            }
            if(this.m_unrestricted) 
                return that.Copy();
            if(that.m_unrestricted) 
                return this.Copy(); 
            if(this.m_strongNames == null || that.m_strongNames == null || this.m_strongNames.Length == 0 || that.m_strongNames.Length == 0)
                return null; 
            ArrayList alStrongNames = new ArrayList();
            foreach(StrongName2 snThis in this.m_strongNames)
            {
                foreach(StrongName2 snThat in that.m_strongNames) 
                {
                    StrongName2 snInt = (StrongName2)snThis.Intersect(snThat); 
                    if(snInt != null) 
                        alStrongNames.Add(snInt);
                } 
            }
            if(alStrongNames.Count == 0)
                return null;
            StrongNameIdentityPermission result = new StrongNameIdentityPermission(PermissionState.None); 
            result.m_strongNames = (StrongName2[])alStrongNames.ToArray(typeof(StrongName2));
            return result; 
        } 

        public override IPermission Union(IPermission target) 
        {
            if (target == null)
            {
                if((this.m_strongNames == null || this.m_strongNames.Length == 0) && !this.m_unrestricted) 
                    return null;
                return this.Copy(); 
            } 
            StrongNameIdentityPermission that = target as StrongNameIdentityPermission;
            if(that == null) 
                throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Argument_WrongType"), this.GetType().FullName));
            if(this.m_unrestricted || that.m_unrestricted)
            {
                StrongNameIdentityPermission res = new StrongNameIdentityPermission(PermissionState.None); 
                res.m_unrestricted = true;
                return res; 
            } 
            if (this.m_strongNames == null || this.m_strongNames.Length == 0)
            { 
                if(that.m_strongNames == null || that.m_strongNames.Length == 0)
                    return null;
                return that.Copy();
            } 
            if(that.m_strongNames == null || that.m_strongNames.Length == 0)
                return this.Copy(); 
            ArrayList alStrongNames = new ArrayList(); 
            foreach(StrongName2 snThis in this.m_strongNames)
                alStrongNames.Add(snThis); 
            foreach(StrongName2 snThat in that.m_strongNames)
            {
                bool bDupe = false;
                foreach(StrongName2 sn in alStrongNames) 
                {
                    if(snThat.Equals(sn)) 
                    { 
                        bDupe = true;
                        break; 
                    }
                }
                if(!bDupe)
                    alStrongNames.Add(snThat); 
            }
            StrongNameIdentityPermission result = new StrongNameIdentityPermission(PermissionState.None); 
            result.m_strongNames = (StrongName2[])alStrongNames.ToArray(typeof(StrongName2)); 
            return result;
        } 

        public override void FromXml(SecurityElement e)
        {
            m_unrestricted = false; 
            m_strongNames = null;
            CodeAccessPermission.ValidateElement( e, this ); 
            String unr = e.Attribute( "Unrestricted" ); 
            if(unr != null && String.Compare(unr, "true", StringComparison.OrdinalIgnoreCase) == 0)
            { 
                m_unrestricted = true;
                return;
            }
            String elBlob = e.Attribute("PublicKeyBlob"); 
            String elName = e.Attribute("Name");
            String elVersion = e.Attribute("AssemblyVersion"); 
            StrongName2 sn; 
            ArrayList al = new ArrayList();
            if(elBlob != null || elName != null || elVersion != null) 
            {
                sn = new StrongName2(
                                    (elBlob == null ? null : new StrongNamePublicKeyBlob(elBlob)),
                                    elName, 
                                    (elVersion == null ? null : new Version(elVersion)));
                al.Add(sn); 
            } 
            ArrayList alChildren = e.Children;
            if(alChildren != null) 
            {
                foreach(SecurityElement child in alChildren)
                {
                    elBlob = child.Attribute("PublicKeyBlob"); 
                    elName = child.Attribute("Name");
                    elVersion = child.Attribute("AssemblyVersion"); 
                    if(elBlob != null || elName != null || elVersion != null) 
                    {
                        sn = new StrongName2( 
                                            (elBlob == null ? null : new StrongNamePublicKeyBlob(elBlob)),
                                            elName,
                                            (elVersion == null ? null : new Version(elVersion)));
                        al.Add(sn); 
                    }
                } 
            } 
            if(al.Count != 0)
                m_strongNames = (StrongName2[])al.ToArray(typeof(StrongName2)); 
        }

        public override SecurityElement ToXml()
        { 
            SecurityElement esd = CodeAccessPermission.CreatePermissionElement( this, "System.Security.Permissions.StrongNameIdentityPermission" );
            if (m_unrestricted) 
                esd.AddAttribute( "Unrestricted", "true" ); 
            else if (m_strongNames != null)
            { 
                if (m_strongNames.Length == 1)
                {
                    if (m_strongNames[0].m_publicKeyBlob != null)
                        esd.AddAttribute("PublicKeyBlob", Hex.EncodeHexString(m_strongNames[0].m_publicKeyBlob.PublicKey)); 
                    if (m_strongNames[0].m_name != null)
                        esd.AddAttribute("Name", m_strongNames[0].m_name); 
                    if ((Object)m_strongNames[0].m_version != null) 
                        esd.AddAttribute("AssemblyVersion", m_strongNames[0].m_version.ToString());
                } 
                else
                {
                    int n;
                    for(n = 0; n < m_strongNames.Length; n++) 
                    {
                        SecurityElement child = new SecurityElement("StrongName"); 
                        if (m_strongNames[n].m_publicKeyBlob != null) 
                            child.AddAttribute("PublicKeyBlob", Hex.EncodeHexString(m_strongNames[n].m_publicKeyBlob.PublicKey));
                        if (m_strongNames[n].m_name != null) 
                            child.AddAttribute("Name", m_strongNames[n].m_name);
                        if ((Object)m_strongNames[n].m_version != null)
                            child.AddAttribute("AssemblyVersion", m_strongNames[n].m_version.ToString());
                        esd.AddChild(child); 
                    }
                } 
            } 
            return esd;
        } 

        /// 
        int IBuiltInPermission.GetTokenIndex()
        { 
            return StrongNameIdentityPermission.GetTokenIndex();
        } 
 
        internal static int GetTokenIndex()
        { 
            return BuiltInPermissionIndex.StrongNameIdentityPermissionIndex;
        }

    } 
}


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK