2004-04-12 David Sheldon <dave-mono@earth.li>
[mono.git] / mcs / class / corlib / System.Security.Policy / SiteMembershipCondition.cs
1 //
2 // SiteMembershipCondition.cs: Site MembershipCondition
3 //
4 // Author:
5 //      Sebastien Pouliot (spouliot@motus.com)
6 //
7 // (C) 2004 Motus Technologies Inc. (http://www.motus.com)
8 //
9
10 using System;
11 using System.Collections;
12 using System.Globalization;
13 using System.Security;
14
15 namespace System.Security.Policy {
16
17         [Serializable]
18         public sealed class SiteMembershipCondition : IMembershipCondition, IConstantMembershipCondition {
19
20                 private string _site;
21
22                 // constructors
23
24                 public SiteMembershipCondition (string site)
25                 {
26                         Site = site;
27                 }
28
29                 // properties
30
31                 public string Site { 
32                         get { return _site; }
33                         set {
34                                 if (value == null)
35                                         throw new ArgumentNullException ("site");
36                                 if (!System.Security.Policy.Site.IsValid (value))
37                                         throw new ArgumentException ("invalid site");
38                                 _site = value;
39                         }
40                 }
41
42                 // methods
43
44                 public bool Check (Evidence evidence) 
45                 {
46                         if (evidence == null)
47                                 return false;
48
49                         IEnumerator e = evidence.GetHostEnumerator ();
50                         while (e.MoveNext ()) {
51                                 if (e.Current is Site) {
52                                         string[] s1 = _site.Split ('.');
53                                         string[] s2 = (e.Current as Site).origin_site.Split ('.');
54                                         for (int i = s1.Length - 1, j = s2.Length - 1; i>=0; i--, j--) {
55                                                 if (i == 0) {
56                                                         // special * case
57                                                         return (String.Compare (s1 [0], "*", true, CultureInfo.InvariantCulture) == 0);
58                                                 }
59                                                 if (String.Compare (s1 [i], s2 [j], true, CultureInfo.InvariantCulture) != 0)
60                                                         return false;
61                                         }
62                                         return true;
63                                 }
64                         }
65                         return false;
66                 }
67                 
68                 public IMembershipCondition Copy () 
69                 {
70                         return new SiteMembershipCondition (_site);
71                 }
72
73                 public override bool Equals (object o) 
74                 {
75                         if (o == null)
76                                 return false;
77                         if (o is SiteMembershipCondition) {
78                                 Site s = new Site ((o as SiteMembershipCondition)._site);
79                                 return s.Equals (new Site (_site));
80                         }
81                         return false;
82                 }
83
84                 public void FromXml (SecurityElement e) 
85                 {
86                         FromXml (e, null);
87                 }
88
89                 public void FromXml (SecurityElement e, PolicyLevel level) 
90                 {
91                         if (e == null)
92                                 throw new ArgumentNullException ("e");
93                         if (e.Tag != "IMembershipCondition")
94                                 throw new ArgumentException (Locale.GetText ("Invalid XML - not a IMembershipCondition tag."));
95                         if (e.Attribute ("class") != GetType ().AssemblyQualifiedName)
96                                 throw new ArgumentException (Locale.GetText ("Invalid class."));
97                         if (e.Attribute ("version") != "1")
98                                 throw new ArgumentException (Locale.GetText ("Invalid version."));
99
100                         _site = e.Attribute ("Site");
101                 }
102
103                 public override int GetHashCode () 
104                 {
105                         return _site.GetHashCode ();
106                 }
107
108                 public override string ToString () 
109                 {
110                         return "Site - " + _site;
111                 }
112
113                 public SecurityElement ToXml () 
114                 {
115                         return ToXml (null);
116                 }
117
118                 public SecurityElement ToXml (PolicyLevel level) 
119                 {
120                         SecurityElement element = new SecurityElement ("IMembershipCondition");
121                         element.AddAttribute ("class", this.GetType ().AssemblyQualifiedName);
122                         element.AddAttribute ("version", "1");
123                         element.AddAttribute ("Site", _site);
124                         return element;
125                 }
126         }
127 }