summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Security/Policy/Zone.cs
blob: c999abe340cc70548c856d42f88f0b903e02e002 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

// 

//
//
//  Zone is an IIdentity representing Internet/Intranet/MyComputer etc.
//

namespace System.Security.Policy {
    using System.Security.Util;
    using ZoneIdentityPermission = System.Security.Permissions.ZoneIdentityPermission;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    using System.Runtime.Versioning;
    using System.Runtime.Serialization;
    using System.Diagnostics.Contracts;

    [Serializable]
    [System.Runtime.InteropServices.ComVisible(true)]
    public sealed class Zone : EvidenceBase, IIdentityPermissionFactory
    {
#if FEATURE_CAS_POLICY
        [OptionalField(VersionAdded = 2)]
        private String m_url;
#endif // FEATURE_CAS_POLICY
        private SecurityZone m_zone;

        private static readonly String[] s_names =
            {"MyComputer", "Intranet", "Trusted", "Internet", "Untrusted", "NoZone"};

        public Zone(SecurityZone zone)
        {
            if (zone < SecurityZone.NoZone || zone > SecurityZone.Untrusted)
                throw new ArgumentException( Environment.GetResourceString( "Argument_IllegalZone" ) );
            Contract.EndContractBlock();

            m_zone = zone;
        }

        private Zone(Zone zone)
        {
            Contract.Assert(zone != null);

#if FEATURE_CAS_POLICY
            m_url = zone.m_url;
#endif // FEATURE_CAS_POLICY
            m_zone = zone.m_zone;
        }

#if FEATURE_CAS_POLICY
        private Zone(String url)
        {
            m_url = url;
            m_zone = SecurityZone.NoZone;
        }

        public static Zone CreateFromUrl( String url )
        {
            if (url == null)
                throw new ArgumentNullException( "url" );
            Contract.EndContractBlock();

            return new Zone( url );
        }

        [System.Security.SecurityCritical]  // auto-generated
        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
        [SuppressUnmanagedCodeSecurity]
        private extern static SecurityZone _CreateFromUrl( String url );
#endif // FEATURE_CAS_POLICY

        public IPermission CreateIdentityPermission( Evidence evidence )
        {
            return new ZoneIdentityPermission( SecurityZone );
        }

        public SecurityZone SecurityZone
        {
            [System.Security.SecuritySafeCritical]  // auto-generated
            get
            {
#if FEATURE_CAS_POLICY
                if (m_url != null)
                    m_zone = _CreateFromUrl( m_url );
#endif // FEATURE_CAS_POLICY

                return m_zone;
            }
        }

        public override bool Equals(Object o)
        {
            Zone other = o as Zone;
            if (other == null)
            {
                return false;
            }

            return SecurityZone == other.SecurityZone;
        }

        public override int GetHashCode()
        {
            return (int)SecurityZone;
        }

        public override EvidenceBase Clone()
        {
            return new Zone(this);
        }

        public Object Copy()
        {
            return Clone();
        }

#if FEATURE_CAS_POLICY
        internal SecurityElement ToXml()
        {
            SecurityElement elem = new SecurityElement( "System.Security.Policy.Zone" );
            // If you hit this assert then most likely you are trying to change the name of this class. 
            // This is ok as long as you change the hard coded string above and change the assert below.
            Contract.Assert( this.GetType().FullName.Equals( "System.Security.Policy.Zone" ), "Class name changed!" );

            elem.AddAttribute( "version", "1" );
            if (SecurityZone != SecurityZone.NoZone)
                elem.AddChild( new SecurityElement( "Zone", s_names[(int)SecurityZone] ) );
            else
                elem.AddChild( new SecurityElement( "Zone", s_names[s_names.Length-1] ) );
            return elem;
        }
#endif // FEATURE_CAS_POLICY

#if FEATURE_CAS_POLICY
        public override String ToString()
        {
            return ToXml().ToString();
        }
#endif // FEATURE_CAS_POLICY

        // INormalizeForIsolatedStorage is not implemented for startup perf
        // equivalent to INormalizeForIsolatedStorage.Normalize()
        internal Object Normalize()
        {
            return s_names[(int)SecurityZone];
        }
    }
}