3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 // <OWNER>Microsoft</OWNER>
10 // UrlMembershipCondition.cs
12 // Implementation of membership condition for urls
15 namespace System.Security.Policy {
17 using System.Collections;
18 using System.Globalization;
19 using System.Security;
20 using System.Security.Util;
21 using System.Diagnostics.Contracts;
24 [System.Runtime.InteropServices.ComVisible(true)]
25 sealed public class UrlMembershipCondition : IMembershipCondition, IConstantMembershipCondition, IReportMatchMembershipCondition
27 //------------------------------------------------------
31 //------------------------------------------------------
33 private URLString m_url;
34 private SecurityElement m_element;
36 //------------------------------------------------------
38 // PUBLIC CONSTRUCTORS
40 //------------------------------------------------------
42 internal UrlMembershipCondition()
47 public UrlMembershipCondition( String url )
50 throw new ArgumentNullException( "url" );
51 Contract.EndContractBlock();
53 // Parse the Url to check that it's valid.
54 m_url = new URLString(url, false /* not parsed */, true /* parse eagerly */);
56 if (m_url.IsRelativeFileUrl)
57 throw new ArgumentException(Environment.GetResourceString("Argument_RelativeUrlMembershipCondition"), "url");
60 //------------------------------------------------------
62 // PUBLIC ACCESSOR METHODS
64 //------------------------------------------------------
71 throw new ArgumentNullException("value");
72 Contract.EndContractBlock();
74 URLString url = new URLString(value);
75 if (url.IsRelativeFileUrl)
76 throw new ArgumentException(Environment.GetResourceString("Argument_RelativeUrlMembershipCondition"), "value");
83 if (m_url == null && m_element != null)
86 return m_url.ToString();
90 //------------------------------------------------------
92 // IMEMBERSHIPCONDITION IMPLEMENTATION
94 //------------------------------------------------------
96 public bool Check( Evidence evidence )
98 object usedEvidence = null;
99 return (this as IReportMatchMembershipCondition).Check(evidence, out usedEvidence);
102 bool IReportMatchMembershipCondition.Check(Evidence evidence, out object usedEvidence)
106 if (evidence == null)
109 Url url = evidence.GetHostEvidence<Url>();
112 if (m_url == null && m_element != null)
117 if (url.GetURLString().IsSubsetOf(m_url))
127 public IMembershipCondition Copy()
129 if (m_url == null && m_element != null)
132 UrlMembershipCondition mc = new UrlMembershipCondition();
133 mc.m_url = new URLString( m_url.ToString() );
137 public SecurityElement ToXml()
139 return ToXml( null );
142 public void FromXml( SecurityElement e )
147 public SecurityElement ToXml( PolicyLevel level )
149 if (m_url == null && m_element != null)
152 SecurityElement root = new SecurityElement( "IMembershipCondition" );
153 System.Security.Util.XMLUtil.AddClassAttribute( root, this.GetType(), "System.Security.Policy.UrlMembershipCondition" );
154 // If you hit this assert then most likely you are trying to change the name of this class.
155 // This is ok as long as you change the hard coded string above and change the assert below.
156 Contract.Assert( this.GetType().FullName.Equals( "System.Security.Policy.UrlMembershipCondition" ), "Class name changed!" );
158 root.AddAttribute( "version", "1" );
160 root.AddAttribute( "Url", m_url.ToString() );
165 public void FromXml( SecurityElement e, PolicyLevel level )
168 throw new ArgumentNullException("e");
170 if (!e.Tag.Equals( "IMembershipCondition" ))
172 throw new ArgumentException( Environment.GetResourceString( "Argument_MembershipConditionElement" ) );
174 Contract.EndContractBlock();
183 private void ParseURL()
187 if (m_element == null)
190 String elurl = m_element.Attribute( "Url" );
193 throw new ArgumentException(Environment.GetResourceString("Argument_UrlCannotBeNull"));
197 URLString url = new URLString(elurl);
198 if (url.IsRelativeFileUrl)
199 throw new ArgumentException(Environment.GetResourceString("Argument_RelativeUrlMembershipCondition"));
208 public override bool Equals( Object o )
210 UrlMembershipCondition that = (o as UrlMembershipCondition);
214 if (this.m_url == null && this.m_element != null)
216 if (that.m_url == null && that.m_element != null)
219 if (Equals( this.m_url, that.m_url ))
227 public override int GetHashCode()
229 if (m_url == null && m_element != null)
234 return m_url.GetHashCode();
238 return typeof( UrlMembershipCondition ).GetHashCode();
242 public override String ToString()
244 if (m_url == null && m_element != null)
248 return String.Format( CultureInfo.CurrentCulture, Environment.GetResourceString( "Url_ToStringArg" ), m_url.ToString() );
250 return Environment.GetResourceString( "Url_ToString" );