Socket permission stuff, not yet used by Socket itself.
authorLawrence Pit <lawrence@mono-cvs.ximian.com>
Sun, 28 Apr 2002 09:12:58 +0000 (09:12 -0000)
committerLawrence Pit <lawrence@mono-cvs.ximian.com>
Sun, 28 Apr 2002 09:12:58 +0000 (09:12 -0000)
svn path=/trunk/mcs/; revision=4101

13 files changed:
mcs/class/System/System.Net/ChangeLog
mcs/class/System/System.Net/Dns.cs
mcs/class/System/System.Net/EndpointPermission.cs [new file with mode: 0644]
mcs/class/System/System.Net/ProtocolViolationException.cs [new file with mode: 0644]
mcs/class/System/System.Net/SocketPermission.cs [new file with mode: 0644]
mcs/class/System/System.Net/SocketPermissionAttribute.cs [new file with mode: 0644]
mcs/class/System/Test/System.Net/AllTests.cs
mcs/class/System/Test/System.Net/SocketPermissionTest.cs [new file with mode: 0644]
mcs/class/corlib/System.Security/ChangeLog
mcs/class/corlib/System.Security/CodeAccessPermission.cs
mcs/class/corlib/System.Security/SecurityElement.cs
mcs/class/corlib/Test/System.Net/AllTests.cs
mcs/class/corlib/Test/System.Net/SocketPermissionTest.cs [new file with mode: 0644]

index 3ce65137291fd24021b6f607e79910807236ff65..2cd6c66949541bd18a9dc0ecd75d9de826d22498 100644 (file)
@@ -1,3 +1,11 @@
+2002-04-28  Lawrence Pit <loz@cable.a2000.nl>
+
+       * EndpointPermission: implemented
+       * SocketPermission.cs: implemented
+       * SocketPermissionAttribute.cs: implemented
+       * ProtocolViolationException.cs: implemented
+       * Dns.c: passing w32 error code when no host found
+
 2002-04-27  Lawrence Pit <loz@cable.a2000.nl>
 
        * Cookie.cs: implemented
index 6583ade8de56d27f0b731bd2bfd3959a1785b072..e2d40ee4cf600320adc5d56eaa2b24c7515241a9 100644 (file)
@@ -152,7 +152,7 @@ namespace System.Net {
                                                           out h_aliases,
                                                           out h_addrlist);
                         if (ret == false) {
-                                throw new SocketException();
+                                throw new SocketException(11001);
                         }
                         
                         return(hostent_to_IPHostEntry(h_name, h_aliases,
@@ -171,7 +171,7 @@ namespace System.Net {
                                                           out h_aliases,
                                                           out h_addrlist);
                         if (ret == false) {
-                                throw new SocketException();
+                                throw new SocketException(11001);
                         }
 
                         return(hostent_to_IPHostEntry(h_name, h_aliases,
diff --git a/mcs/class/System/System.Net/EndpointPermission.cs b/mcs/class/System/System.Net/EndpointPermission.cs
new file mode 100644 (file)
index 0000000..ca895c7
--- /dev/null
@@ -0,0 +1,326 @@
+//\r
+// System.Net.EndpointPermission.cs\r
+//\r
+// Author:\r
+//   Lawrence Pit (loz@cable.a2000.nl)\r
+//\r
+\r
+using System;\r
+using System.Collections;\r
+using System.Security;\r
+using System.Security.Permissions;\r
+\r
+namespace System.Net\r
+{\r
+       [Serializable]\r
+       public class EndpointPermission // too bad about the lowercase p, not consistent with IPEndPoint ;)\r
+       {\r
+               private static char [] dot_char = new char [] { '.' };\r
+               \r
+               // Fields\r
+               private string hostname;\r
+               private int port;\r
+               private TransportType transport;\r
+\r
+               private bool resolved;          \r
+               private bool hasWildcard;\r
+               private IPAddress [] addresses;\r
+               \r
+               // Constructors\r
+               internal EndpointPermission (string hostname, \r
+                                            int port, \r
+                                            TransportType transport) : base () \r
+               {                       \r
+                       if (hostname == null)\r
+                               throw new ArgumentNullException ("hostname");\r
+                       this.hostname = hostname;\r
+                       this.port = port;\r
+                       this.transport = transport;\r
+                       this.resolved = false;\r
+                       this.hasWildcard = false;\r
+                       this.addresses = null;\r
+               }               \r
+               \r
+               // Properties\r
+\r
+               public string Hostname {\r
+                       get { return hostname; }\r
+               }\r
+\r
+               public int Port {\r
+                       get { return port; }\r
+               }\r
+               \r
+               public TransportType Transport {\r
+                       get { return transport; }\r
+               }\r
+               \r
+               // Methods\r
+               \r
+               public override bool Equals (object obj) \r
+               {\r
+                       EndpointPermission epp = obj as EndpointPermission;\r
+                       return ((epp != null) &&\r
+                               (this.port == epp.port) &&\r
+                               (this.transport == epp.transport) &&\r
+                               (String.Compare (this.hostname, epp.hostname, true) == 0));\r
+               }\r
+               \r
+               public override int GetHashCode () \r
+               {\r
+                       return ToString ().GetHashCode ();\r
+               }\r
+               \r
+               public override string ToString () \r
+               {\r
+                       return hostname + "#" + port + "#" + (int) transport;\r
+               }\r
+               \r
+               // Internal & Private Methods\r
+               \r
+               internal bool IsSubsetOf (EndpointPermission perm) \r
+               {\r
+                       if (perm == null)\r
+                               return false;\r
+                       \r
+                       if (perm.port != SocketPermission.AllPorts &&\r
+                           this.port != perm.port)\r
+                               return false;\r
+                       \r
+                       if (perm.transport != TransportType.All &&\r
+                           this.transport != perm.transport)\r
+                               return false;\r
+                       \r
+                       this.Resolve ();\r
+                       perm.Resolve ();\r
+                       \r
+                       if (this.hasWildcard) {\r
+                               if (perm.hasWildcard)\r
+                                       return IsSubsetOf (this.hostname, perm.hostname);\r
+                               else \r
+                                       return false;\r
+                       } \r
+                       \r
+                       if (this.addresses == null) \r
+                               return false;\r
+                       \r
+                       if (perm.hasWildcard) \r
+                               // a bit dubious... should they all be a subset or is one \r
+                               // enough in this case?\r
+                               foreach (IPAddress addr in this.addresses)\r
+                                       if (IsSubsetOf (addr.ToString (), perm.hostname))\r
+                                               return true;\r
+                               \r
+                       if (perm.addresses == null) \r
+                               return false;\r
+                               \r
+                       // a bit dubious... should they all be a subset or is one \r
+                       // enough in this case?\r
+                       foreach (IPAddress addr in perm.addresses)\r
+                               if (IsSubsetOf (this.hostname, addr.ToString ())) \r
+                                       return true;    \r
+                                       \r
+                       return false;           \r
+               }               \r
+               \r
+               private bool IsSubsetOf (string addr1, string addr2)\r
+               {\r
+                       string [] h1 = addr1.Split (dot_char);          \r
+                       string [] h2 = addr2.Split (dot_char);\r
+                               \r
+                       for (int i = 0; i < 4; i++) {\r
+                               int part1 = ToNumber (h1 [i]);\r
+                               if (part1 == -1) \r
+                                       return false;                           \r
+\r
+                               int part2 = ToNumber (h2 [i]);\r
+                               if (part2 == -1)\r
+                                       return false;                           \r
+                               if (part1 != part2 && part2 != 256)\r
+                                       return false;\r
+                       }\r
+                       return true;\r
+               }\r
+               \r
+               internal EndpointPermission Intersect (EndpointPermission perm) \r
+               {\r
+                       if (perm == null)\r
+                               return null;\r
+                       \r
+                       int _port;\r
+                       if (this.port == perm.port)\r
+                               _port = this.port;\r
+                       else if (this.port == SocketPermission.AllPorts)\r
+                               _port = perm.port;\r
+                       else if (perm.port == SocketPermission.AllPorts)\r
+                               _port = this.port;\r
+                       else\r
+                               return null;\r
+\r
+                       TransportType _transport;\r
+                       if (this.transport == perm.transport)\r
+                               _transport = this.transport;\r
+                       else if (this.transport == TransportType.All)\r
+                               _transport = perm.transport;\r
+                       else if (perm.transport == TransportType.All)\r
+                               _transport = this.transport;\r
+                       else\r
+                               return null;\r
+\r
+                       string _hostname = IntersectHostname (perm);                                            \r
+                       \r
+                       if (_hostname == null)\r
+                               return null;\r
+\r
+                       if (!this.hasWildcard)\r
+                               return this;\r
+                               \r
+                       if (!perm.hasWildcard)\r
+                               return perm;\r
+                               \r
+                       EndpointPermission newperm = new EndpointPermission (_hostname, _port, _transport);\r
+                       newperm.hasWildcard = true;\r
+                       newperm.resolved = true;\r
+                       return newperm;\r
+               }\r
+               \r
+               private string IntersectHostname (EndpointPermission perm)\r
+               {\r
+                       if (this.hostname == perm.hostname)\r
+                               return this.hostname;\r
+                               \r
+                       this.Resolve ();\r
+                       perm.Resolve ();\r
+                       \r
+                       string _hostname = null;\r
+                       \r
+                       if (this.hasWildcard) {\r
+                               if (perm.hasWildcard) {\r
+                                       _hostname = Intersect (this.hostname, perm.hostname);\r
+                               } else if (perm.addresses != null) {\r
+                                       for (int j = 0; j < perm.addresses.Length; j++) {\r
+                                               _hostname = Intersect (this.hostname, perm.addresses [j].ToString ());\r
+                                               if (_hostname != null) \r
+                                                       break;\r
+                                       }\r
+                               }\r
+                       } else if (this.addresses != null) {\r
+                               for (int i = 0; i < this.addresses.Length; i++) {\r
+                                       string thisaddr = this.addresses [i].ToString ();\r
+                                       if (perm.hasWildcard) {\r
+                                               _hostname = Intersect (thisaddr, perm.hostname);\r
+                                       } else if (perm.addresses != null) {\r
+                                               for (int j = 0; j < perm.addresses.Length; j++) {\r
+                                                       _hostname = Intersect (thisaddr, perm.addresses [j].ToString ());\r
+                                                       if (_hostname != null) \r
+                                                               break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       \r
+                       return _hostname;\r
+               }\r
+               \r
+               // alas, currently we'll only support IPv4 as that's MS.Net behaviour\r
+               // returns null when both host strings do not intersect\r
+               private string Intersect (string addr1, string addr2)\r
+               {\r
+                       string [] h1 = addr1.Split (dot_char);          \r
+                       string [] h2 = addr2.Split (dot_char);\r
+                               \r
+                       string [] s = new string [7];\r
+                       for (int i = 0; i < 4; i++) {\r
+                               int part1 = ToNumber (h1 [i]);\r
+                               if (part1 == -1) \r
+                                       return null;                            \r
+\r
+                               int part2 = ToNumber (h2 [i]);\r
+                               if (part2 == -1)\r
+                                       return null;                            \r
+\r
+                               if (part1 == 256) \r
+                                       s [i << 1] = (part2 == 256) ? "*" : String.Empty + part2;\r
+                               else if (part2 == 256)\r
+                                       s [i << 1] = (part1 == 256) ? "*" : String.Empty + part1;                               \r
+                               else if (part1 == part2)\r
+                                       s [i << 1] = String.Empty + part1;\r
+                               else\r
+                                       return null;\r
+                       }\r
+                       \r
+                       s [1] = s [3] = s [5] = ".";\r
+                       return String.Concat (s);\r
+               }\r
+               \r
+               // returns 256 if value is a '*' character\r
+               // returns -1 if value isn't a number between 0 and 255         \r
+               private int ToNumber (string value)\r
+               {\r
+                       if (value == "*")\r
+                               return 256;\r
+                               \r
+                       int len = value.Length;\r
+                       if (len < 1 || len > 3)\r
+                               return -1;\r
+                               \r
+                       int val = 0;                            \r
+                       for (int i = 0; i < len; i++) {\r
+                               char c = value [i];\r
+                               if ('0' <= c && c <= '9') \r
+                                       val = checked (val * 10 + (c - '0'));\r
+                               else\r
+                                       return -1;\r
+                       }\r
+                       \r
+                       return val <= 255 ? val : -1;\r
+               }\r
+\r
+               internal void Resolve ()\r
+               {\r
+                       if (resolved)   \r
+                               return;\r
+                               \r
+                       bool isHostname = false;                                \r
+                       bool hasWildcard = false;\r
+                       this.addresses = null;\r
+                       \r
+                       string [] s = hostname.Split (dot_char);\r
+\r
+                       if (s.Length != 4) {\r
+                               isHostname = true;\r
+                       } else {\r
+                               for (int i = 0; i < 4; i++) {\r
+                                       int quad = ToNumber (s [i]);\r
+                                       if (quad == -1) {\r
+                                               isHostname = true;\r
+                                               break;\r
+                                       }\r
+                                       if (quad == 256)\r
+                                               hasWildcard = true;\r
+                               }\r
+                       }\r
+                       \r
+                       if (isHostname) {\r
+                               this.hasWildcard = false;\r
+                               try {\r
+                                       this.addresses = Dns.GetHostByName (hostname).AddressList;\r
+                               } catch (System.Net.Sockets.SocketException) {                                  \r
+                               }\r
+                       } else {\r
+                               this.hasWildcard = hasWildcard;\r
+                               if (!hasWildcard) {\r
+                                       addresses = new IPAddress [1];\r
+                                       addresses [0] = IPAddress.Parse (hostname);\r
+                               }\r
+                       }\r
+                       \r
+                       this.resolved = true;                           \r
+               }\r
+               \r
+               internal void UndoResolve ()\r
+               {\r
+                       resolved = false;\r
+               }\r
+       }\r
+}\r
diff --git a/mcs/class/System/System.Net/ProtocolViolationException.cs b/mcs/class/System/System.Net/ProtocolViolationException.cs
new file mode 100644 (file)
index 0000000..cb201ce
--- /dev/null
@@ -0,0 +1,38 @@
+//\r
+// System.Net.ProtocolViolationException.cs\r
+//\r
+// Author:\r
+//   Lawrence Pit (loz@cable.a2000.nl)\r
+//\r
+\r
+using System.Globalization;\r
+using System.Runtime.Serialization;\r
+\r
+namespace System.Net \r
+{\r
+       [Serializable]\r
+       public class ProtocolViolationException : InvalidOperationException, ISerializable\r
+       {\r
+\r
+               // Constructors\r
+               public ProtocolViolationException () : base ()\r
+               {\r
+               }\r
+               \r
+               public ProtocolViolationException (string message) : base (message)\r
+               {\r
+               }\r
+\r
+               protected ProtocolViolationException (SerializationInfo info, StreamingContext context)\r
+                       : base (info, context)\r
+               {                       \r
+               }\r
+\r
+               // Methods\r
+               void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context)\r
+               {\r
+                       base.GetObjectData (info, context);\r
+               }\r
+       }\r
+}\r
+       \r
diff --git a/mcs/class/System/System.Net/SocketPermission.cs b/mcs/class/System/System.Net/SocketPermission.cs
new file mode 100644 (file)
index 0000000..7146223
--- /dev/null
@@ -0,0 +1,348 @@
+//\r
+// System.Net.SocketPermission.cs\r
+//\r
+// Author:\r
+//   Lawrence Pit (loz@cable.a2000.nl)\r
+//\r
+\r
+using System;\r
+using System.Collections;\r
+using System.Security;\r
+using System.Security.Permissions;\r
+\r
+namespace System.Net\r
+{\r
+       [Serializable]\r
+       public class SocketPermission : CodeAccessPermission, IUnrestrictedPermission\r
+       {\r
+               // Fields\r
+               ArrayList m_acceptList = new ArrayList ();\r
+               ArrayList m_connectList = new ArrayList ();\r
+               bool m_noRestriction;\r
+               \r
+               // Constructors\r
+               public SocketPermission (PermissionState state) : base () \r
+               {                                               \r
+                       m_noRestriction = (state == PermissionState.Unrestricted);\r
+               }\r
+               \r
+               public SocketPermission (NetworkAccess access, TransportType transport, \r
+                                        string hostName, int portNumber) : base () \r
+               {\r
+                       m_noRestriction = false;\r
+                       AddPermission (access, transport, hostName, portNumber);\r
+               }       \r
+               \r
+               // Fields\r
+               public const int AllPorts = -1;\r
+               \r
+               // Properties\r
+\r
+               public IEnumerator AcceptList {\r
+                       get { return m_acceptList.GetEnumerator (); }\r
+               }\r
+\r
+               public IEnumerator ConnectList {\r
+                       get { return m_connectList.GetEnumerator (); }\r
+               }\r
+               \r
+               // Methods\r
+               \r
+               public void AddPermission (NetworkAccess access, TransportType transport,\r
+                                          string hostName, int portNumber)\r
+               {\r
+                       if (m_noRestriction)\r
+                               return;\r
+                               \r
+                       EndpointPermission permission = new EndpointPermission (hostName, portNumber, transport);\r
+\r
+                       if (access == NetworkAccess.Accept)\r
+                               m_acceptList.Add (permission);\r
+                       else\r
+                               m_connectList.Add (permission);\r
+               }               \r
+               \r
+               public override IPermission Copy ()\r
+               {\r
+                       SocketPermission permission;\r
+\r
+                       permission = new SocketPermission (m_noRestriction ? \r
+                                               PermissionState.Unrestricted : \r
+                                               PermissionState.None);\r
+\r
+                       // as EndpointPermission's are immutable it's safe to do a shallow copy.                                                \r
+                       permission.m_connectList = (ArrayList) this.m_connectList.Clone ();\r
+                       permission.m_acceptList = (ArrayList) this.m_acceptList.Clone ();\r
+\r
+                       return permission;              \r
+               }\r
+               \r
+               public override IPermission Intersect (IPermission target)\r
+               {\r
+                       if (target == null) \r
+                               return null;\r
+                               \r
+                       SocketPermission perm = target as SocketPermission;\r
+                       if (perm == null) \r
+                               throw new ArgumentException ("Argument not of type SocketPermission");\r
+                       \r
+                       if (m_noRestriction) \r
+                               return IntersectEmpty (perm) ? null : perm.Copy ();\r
+                               \r
+                       if (perm.m_noRestriction)\r
+                               return IntersectEmpty (this) ? null : this.Copy ();\r
+                               \r
+                       SocketPermission newperm = new SocketPermission (PermissionState.None);\r
+                       Intersect (this.m_connectList, perm.m_connectList, newperm.m_connectList);\r
+                       Intersect (this.m_acceptList, perm.m_acceptList, newperm.m_acceptList);\r
+                       return IntersectEmpty (newperm) ? null : newperm;                       \r
+               }\r
+               \r
+               private bool IntersectEmpty (SocketPermission permission)               \r
+               {\r
+                       return !permission.m_noRestriction && \r
+                              (permission.m_connectList.Count == 0) &&\r
+                              (permission.m_acceptList.Count == 0);\r
+               }\r
+               \r
+               private void Intersect (ArrayList list1, ArrayList list2, ArrayList result)\r
+               {\r
+                       foreach (EndpointPermission perm1 in list1) {\r
+                               foreach (EndpointPermission perm2 in list2) {\r
+                                       EndpointPermission perm = perm1.Intersect (perm2);\r
+                                       if (perm != null) {\r
+                                               // instead of the below it's also okay to simply do:\r
+                                               //     result.Add (perm);\r
+                                               // below is only done to avoid double entries                                           \r
+                                               bool replaced = false;\r
+                                               for (int i = 0; i < result.Count; i++) {\r
+                                                       EndpointPermission res = (EndpointPermission) result [i];\r
+                                                       EndpointPermission resperm = perm.Intersect (res);\r
+                                                       if (resperm != null) {\r
+                                                               result [i] = resperm;\r
+                                                               replaced = true;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                               if (!replaced) \r
+                                                       result.Add (perm);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               \r
+               public override bool IsSubsetOf (IPermission target) \r
+               {\r
+                       if (target == null)\r
+                               return (!m_noRestriction && m_connectList.Count == 0 && m_acceptList.Count ==    0);\r
+                       \r
+                       SocketPermission perm = target as SocketPermission;\r
+\r
+                       if (perm == null) \r
+                               throw new ArgumentException ("Parameter target must be of type SocketPermission");\r
+                       \r
+                       if (perm.m_noRestriction) \r
+                               return true;\r
+\r
+                       if (this.m_noRestriction)\r
+                               return false;\r
+\r
+                       if (this.m_acceptList.Count == 0 && this.m_connectList.Count == 0)\r
+                               return true;\r
+\r
+                       if (perm.m_acceptList.Count == 0 && perm.m_connectList.Count == 0)\r
+                               return false;\r
+\r
+                       return IsSubsetOf (this.m_connectList, perm.m_connectList)\r
+                           && IsSubsetOf (this.m_acceptList, perm.m_acceptList);\r
+               }\r
+\r
+               private bool IsSubsetOf (ArrayList list1, ArrayList list2)\r
+               {\r
+                       foreach (EndpointPermission perm1 in list1) {\r
+                               bool issubset = false;\r
+                               foreach (EndpointPermission perm2 in list2) \r
+                                       if (perm1.IsSubsetOf (perm2)) {\r
+                                               issubset = true;\r
+                                               break;\r
+                                       }\r
+                               if (!issubset) \r
+                                       return false;\r
+                       }\r
+                       return true;\r
+               }\r
+               \r
+               public bool IsUnrestricted () \r
+               {\r
+                       return m_noRestriction;\r
+               }\r
+\r
+               /*\r
+               \r
+               SocketPermission s = new SocketPermission (NetworkAccess.Connect, TransportType.Tcp, "www.google.com", 80);\r
+               s.AddPermission (NetworkAccess.Accept, TransportType.All, "localhost", 8080);\r
+               s.AddPermission (NetworkAccess.Accept, TransportType.All, "localhost", SocketPermission.AllPorts);\r
+               // s = new SocketPermission (PermissionState.None);\r
+               SecurityElement sec = s.ToXml ();       \r
+               Console.WriteLine (sec.ToString ());\r
+\r
+               This is sample xml output:\r
+\r
+               <IPermission class="System.Net.SocketPermission, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"\r
+                            version="1">\r
+                  <ConnectAccess>\r
+                     <ENDPOINT host="www.google.com"\r
+                               transport="Tcp"\r
+                               port="80"/>\r
+                  </ConnectAccess>\r
+                  <AcceptAccess>\r
+                     <ENDPOINT host="localhost"\r
+                               transport="All"\r
+                               port="8080"/>\r
+                     <ENDPOINT host="localhost"\r
+                               transport="All"\r
+                               port="All"/>\r
+                  </AcceptAccess>\r
+               </IPermission>\r
+\r
+\r
+\r
+               This is a sample unrestricted socketpermission, no matter how many permissions you add:                 \r
+\r
+               <IPermission class="System.Net.SocketPermission, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"\r
+                            version="1"\r
+                            Unrestricted="true"/>\r
+\r
+\r
+               This is a sample constructed restricted socketpermission with no permissions added:\r
+\r
+               <IPermission class="System.Net.SocketPermission, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"\r
+                            version="1"/>\r
+               */\r
+               public override SecurityElement ToXml ()\r
+               {\r
+             \r
+                       SecurityElement root = new SecurityElement ("IPermission");\r
+\r
+                       root.AddAttribute ("class", this.GetType ().FullName + ", " + \r
+                                                   "System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");\r
+\r
+/*                     \r
+GetType ().Module doesn't work yet with Mono.. (2002-04-27)\r
+We need to do it as below though, because this class can be extended\r
+\r
+                       root.AddAttribute ("class", this.GetType ().FullName + ", " + \r
+                                                   this.GetType ().Module.Assembly.FullName);\r
+*/                                                 \r
+                       root.AddAttribute ("version", "1");\r
+                       if (m_noRestriction) {\r
+                               root.AddAttribute ("Unrestricted", "true");                             \r
+                               return root;\r
+                       }                               \r
+                               \r
+                       if (this.m_connectList.Count > 0)\r
+                               ToXml (root, "ConnectAccess", m_connectList.GetEnumerator ());\r
+                       \r
+                       if (this.m_acceptList.Count > 0) \r
+                               ToXml (root, "AcceptAccess", m_acceptList.GetEnumerator ());                    \r
+                       \r
+                       return root;\r
+               }\r
+               \r
+               private void ToXml (SecurityElement root, string childName, IEnumerator enumerator)\r
+               {\r
+                       SecurityElement child = new SecurityElement (childName);\r
+                       while (enumerator.MoveNext ()) {\r
+                               EndpointPermission perm = enumerator.Current as EndpointPermission;\r
+                               SecurityElement grandchild = new SecurityElement ("ENDPOINT");\r
+                               grandchild.AddAttribute ("host", perm.Hostname);\r
+                               grandchild.AddAttribute ("transport", perm.Transport.ToString ());\r
+                               grandchild.AddAttribute ("port", \r
+                                               perm.Port == AllPorts \r
+                                               ? "All" \r
+                                               : ((Int32) perm.Port).ToString ());\r
+                               child.AddChild (grandchild);\r
+                       }\r
+                       root.AddChild (child);\r
+               }\r
+               \r
+               public override void FromXml (SecurityElement securityElement)\r
+               {\r
+                       if (securityElement == null)\r
+                               throw new ArgumentNullException ("securityElement");\r
+                               \r
+                       // LAMESPEC: it says to throw an ArgumentNullException in this case                             \r
+                       if (securityElement.Tag != "IPermission")\r
+                               throw new ArgumentException ("securityElement");\r
+                               \r
+                       string classStr = securityElement.Attribute ("class");\r
+                       if (classStr == null || !classStr.StartsWith (this.GetType ().FullName + ","))\r
+                               throw new ArgumentException ("securityElement");\r
+                               \r
+                       string unrestricted = securityElement.Attribute ("Unrestricted");\r
+                       if (unrestricted != null) {\r
+                               this.m_noRestriction = (String.Compare (unrestricted, "true", true) == 0);\r
+                               if (this.m_noRestriction)\r
+                                       return;\r
+                       }\r
+                       \r
+                       this.m_noRestriction = false;\r
+                       this.m_connectList = new ArrayList ();\r
+                       this.m_acceptList = new ArrayList ();\r
+                       \r
+                       ArrayList children = securityElement.Children;\r
+                       foreach (SecurityElement child in children) {\r
+                               if (child.Tag == "ConnectAccess") \r
+                                       FromXml (child.Children, NetworkAccess.Connect);\r
+                               else if (child.Tag == "AcceptAccess")\r
+                                       FromXml (child.Children, NetworkAccess.Accept);\r
+                       }\r
+               }               \r
+               \r
+               private void FromXml (ArrayList endpoints, NetworkAccess access)\r
+               {\r
+                       foreach (SecurityElement endpoint in endpoints) {\r
+                               if (endpoint.Tag != "ENDPOINT")\r
+                                       continue;\r
+                               string hostname = endpoint.Attribute ("host");\r
+                               TransportType transport = \r
+                                       (TransportType) Enum.Parse (typeof (TransportType), \r
+                                                                   endpoint.Attribute ("transport"), \r
+                                                                   true);\r
+                               string p = endpoint.Attribute ("port");\r
+                               int port = 0;\r
+                               if (p == "All") \r
+                                       port = SocketPermission.AllPorts;\r
+                               else\r
+                                       port = Int32.Parse (p);\r
+\r
+                               AddPermission (access, transport, hostname, port);\r
+                       }\r
+               }\r
+               \r
+               public override IPermission Union (IPermission target) \r
+               {\r
+                       // LAMESPEC: according to spec we should throw an \r
+                       // exception when target is null. We'll follow the\r
+                       // behaviour of MS.Net instead of the spec, also\r
+                       // because it matches the Intersect behaviour.\r
+                       if (target == null)\r
+                               return null;\r
+                               // throw new ArgumentNullException ("target");\r
+                               \r
+                       SocketPermission perm = target as SocketPermission;\r
+                       if (perm == null)\r
+                               throw new ArgumentException ("Argument not of type SocketPermission");\r
+                       \r
+                       if (this.m_noRestriction || perm.m_noRestriction) \r
+                               return new SocketPermission (PermissionState.Unrestricted);\r
+                               \r
+                       SocketPermission copy = (SocketPermission) perm.Copy ();\r
+                       copy.m_acceptList.InsertRange (copy.m_acceptList.Count, this.m_acceptList);\r
+                       copy.m_connectList.InsertRange (copy.m_connectList.Count, this.m_connectList);                          \r
+                       \r
+                       return copy;\r
+               }\r
+\r
+       }\r
+}\r
diff --git a/mcs/class/System/System.Net/SocketPermissionAttribute.cs b/mcs/class/System/System.Net/SocketPermissionAttribute.cs
new file mode 100644 (file)
index 0000000..80a4a2c
--- /dev/null
@@ -0,0 +1,127 @@
+//\r
+// System.Net.SocketPermissionAttribute.cs\r
+//\r
+// Author:\r
+//   Lawrence Pit (loz@cable.a2000.nl)\r
+//\r
+\r
+using System;\r
+using System.Security;\r
+using System.Security.Permissions;\r
+\r
+namespace System.Net\r
+{\r
+       [AttributeUsage (AttributeTargets.Assembly \r
+                      | AttributeTargets.Class \r
+                      | AttributeTargets.Struct \r
+                      | AttributeTargets.Constructor \r
+                      | AttributeTargets.Method)\r
+       ]       \r
+       [Serializable]\r
+       public sealed class SocketPermissionAttribute : CodeAccessSecurityAttribute\r
+       {\r
+               // Fields\r
+               string m_access;\r
+               string m_host;\r
+               string m_port;\r
+               string m_transport;\r
+               \r
+               // Constructors\r
+               public SocketPermissionAttribute (SecurityAction action) : base (action)\r
+               {\r
+               }\r
+\r
+               // Properties\r
+\r
+               public string Access {\r
+                       get { return m_access; }\r
+                       set { \r
+                               if (m_access != null)\r
+                                       throw new ArgumentException ("The parameter 'Access' can be set only once.");\r
+                               if (value == null) \r
+                                       throw new ArgumentException ("The parameter 'Access' cannot be null.");\r
+                               m_access = value;\r
+                       }\r
+               }\r
+\r
+               public string Host {\r
+                       get { return m_host; }\r
+                       set { \r
+                               if (m_host != null)\r
+                                       throw new ArgumentException ("The parameter 'Host' can be set only once.");\r
+                               if (value == null) \r
+                                       throw new ArgumentException ("The parameter 'Host' cannot be null.");                                   \r
+                               m_host = value;\r
+                       }\r
+               }\r
+\r
+               public string Port {\r
+                       get { return m_port; }\r
+                       set { \r
+                               if (m_port != null)\r
+                                       throw new ArgumentException ("The parameter 'Port' can be set only once.");\r
+                               if (value == null) \r
+                                       throw new ArgumentException ("The parameter 'Port' cannot be null.");                                   \r
+                               m_port = value;\r
+                       }\r
+               }\r
+\r
+               public string Transport {\r
+                       get { return m_transport; }\r
+                       set { \r
+                               if (m_transport != null)\r
+                                       throw new ArgumentException ("The parameter 'Transport' can be set only once.");\r
+                               if (value == null) \r
+                                       throw new ArgumentException ("The parameter 'Transport' cannot be null.");                                      \r
+                               m_transport = value;\r
+                       }\r
+               }\r
+               \r
+               // Methods\r
+               \r
+               public override IPermission CreatePermission () {\r
+                       if (this.Unrestricted)\r
+                               return new SocketPermission (PermissionState.Unrestricted);\r
+\r
+                       if (m_access == null) \r
+                               throw new ArgumentException ("The value for 'Access' must be specified.");\r
+                       if (m_host == null) \r
+                               throw new ArgumentException ("The value for 'Host' must be specified.");\r
+                       if (m_port == null) \r
+                               throw new ArgumentException ("The value for 'Port' must be specified.");\r
+                       if (m_transport == null) \r
+                               throw new ArgumentException ("The value for 'Transport' must be specified.");\r
+\r
+                       NetworkAccess access;\r
+                       TransportType transport;\r
+                       int port = SocketPermission.AllPorts;\r
+\r
+                       if (String.Compare (m_access, "Connect", true) == 0)\r
+                               access = NetworkAccess.Connect;\r
+                       else if (String.Compare (m_access, "Accept", true) == 0)\r
+                               access = NetworkAccess.Accept;\r
+                       else \r
+                               throw new ArgumentException ("The parameter value 'Access=" + m_access + "' is invalid.");\r
+\r
+                       if (String.Compare (m_port, "All", true) != 0) {\r
+                               try {\r
+                                       port = Int32.Parse (m_port);                                    \r
+                               } catch (Exception) {\r
+                                       throw new ArgumentException ("The parameter value 'Port=" + port + "' is invalid.");\r
+                               }\r
+                               // test whether port number is valid..\r
+                               new IPEndPoint (1, port);\r
+                       }\r
+\r
+                       try {\r
+                               transport = (TransportType) Enum.Parse (typeof (TransportType), m_transport, true);\r
+                       } catch (Exception) {\r
+                               throw new ArgumentException ("The parameter value 'Transport=" + m_transport + "' is invalid.");\r
+                       }\r
+                                               \r
+                       SocketPermission perm = new SocketPermission (PermissionState.None);\r
+                       perm.AddPermission (access, transport, m_host, port);\r
+                       return perm;\r
+               }               \r
+       }\r
+}\r
index 2a5e1b4ee4598691bbdfbc915ca10589c9e1b76d..e79b375660f500c51681d6acf71b91e6236aec05 100644 (file)
@@ -22,6 +22,7 @@ namespace MonoTests.System.Net {
                                 TestSuite suite = new TestSuite ();
                                 suite.AddTest (IPAddressTest.Suite);
                                 suite.AddTest (IPEndPointTest.Suite);
+                                suite.AddTest (SocketPermissionTest.Suite);
                                 suite.AddTest (CookieTest.Suite);
                                 suite.AddTest (CookieCollectionTest.Suite);
                                 //suite.AddTest (CookieContainerTest.Suite);
diff --git a/mcs/class/System/Test/System.Net/SocketPermissionTest.cs b/mcs/class/System/Test/System.Net/SocketPermissionTest.cs
new file mode 100644 (file)
index 0000000..5704aad
--- /dev/null
@@ -0,0 +1,113 @@
+//\r
+// SocketPermissionTest.cs - NUnit Test Cases for System.Net.SocketPermission\r
+//\r
+// Author:\r
+//   Lawrence Pit (loz@cable.a2000.nl)\r
+//\r
+\r
+using NUnit.Framework;\r
+using System;\r
+using System.Net;\r
+using System.Collections;\r
+using System.Security;\r
+using System.Security.Permissions;\r
+\r
+namespace MonoTests.System.Net\r
+{\r
+\r
+public class SocketPermissionTest : TestCase\r
+{\r
+       SocketPermission s1;\r
+       SocketPermission s2;\r
+       \r
+        public SocketPermissionTest () :\r
+                base ("[MonoTests.System.Net.SocketPermissionTest]") {}\r
+\r
+        public SocketPermissionTest (string name) : base (name) {}\r
+\r
+        protected override void SetUp () \r
+        {\r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "localhost", 8080);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "123", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "www.ximian.com", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "120.4.3.2", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "www.google.com", 80);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "1.*.10.*.99", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "128.0.0.1", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "0.0.0.0", SocketPermission.AllPorts);\r
+               s1.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.*", SocketPermission.AllPorts);\r
+\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.All, "12.13.14.15", 80);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "localhost", 8080);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "123", 8080);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "www.google.com", SocketPermission.AllPorts);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "213.*.*.*", SocketPermission.AllPorts);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "128.0.0.1", 9090);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "216.239.*.*", SocketPermission.AllPorts);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "128.0.0.1", SocketPermission.AllPorts);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "120.4.3.2", 80);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "196.*.*.*", SocketPermission.AllPorts);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "1.*.*.*.99", SocketPermission.AllPorts);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.*.*", 9090);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.7", SocketPermission.AllPorts);            \r
+       }\r
+\r
+        protected override void TearDown () {}\r
+\r
+        public static ITest Suite\r
+        {\r
+                get {\r
+                        return new TestSuite (typeof (SocketPermissionTest));\r
+                }\r
+        }\r
+        \r
+        public void TestIsSubsetOf ()\r
+        {\r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               s1.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.*", SocketPermission.AllPorts);\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.All, "12.13.14.15", 80);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.*.*", 9090);\r
+               \r
+               Assert ("#1", !s1.IsSubsetOf (s2));\r
+               Assert ("#2", !s2.IsSubsetOf (s1));\r
+\r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               s1.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.*", 9090);\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.All, "12.13.14.15", 80);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.*.*", 9090);\r
+               \r
+               Assert ("#3: bug in MS.Net", s1.IsSubsetOf (s2));\r
+               Assert ("#4", !s2.IsSubsetOf (s1));\r
+               \r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.*.*", 80);\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.All, "12.13.14.*", 80);\r
+               Assert ("#5", !s1.IsSubsetOf (s2));\r
+               Assert ("#6", !s2.IsSubsetOf (s1));\r
+\r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               s1.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "10.11.*.*", 9090);\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.*", SocketPermission.AllPorts);\r
+               Assert ("#7", !s1.IsSubsetOf (s2));\r
+               Assert ("#8", s2.IsSubsetOf (s1));\r
+       }\r
+       \r
+       public void TestIntersect ()\r
+       {\r
+       }\r
+       \r
+       public void TestUnion ()\r
+       {\r
+       }\r
+       \r
+       public void TestXml ()\r
+       {\r
+               SecurityElement elem = s2.ToXml ();\r
+               s1.FromXml (elem);\r
+               Assert ("#1", s2.IsSubsetOf (s1) && s1.IsSubsetOf (s2));\r
+       }\r
+}\r
+\r
+}\r
+\r
index 6e90ebd01649314013061be199202ffd3e05fd44..28c09c32aa82bd32c4632863000ae4adae67ad3c 100755 (executable)
@@ -1,4 +1,8 @@
-2002-04-47  Lawrence Pit <loz@cable.a2000.nl>
+2002-04-28  Lawrence Pit <loz@cable.a2000.nl>
+
+       * CodeAccessPermission.cs : implemented ToString method
+
+2002-04-27  Lawrence Pit <loz@cable.a2000.nl>
 
        * SecurityElement.cs: fixed bugs, implemented several methods
 
index 9fe27e19de1634050e0efb64c0acd1746ef5f1dd..3994f785dcfde785b1d01b1f5792a8757d1c22a8 100755 (executable)
@@ -55,7 +55,8 @@ namespace System.Security {
                ///<returns> A System.String containing the XML  representation of the state of the current instance.</returns>
                public override string ToString()
                {
-                   return null;
+                       SecurityElement elem = ToXml ();
+                       return elem == null ? null : elem.ToString ();
                }
 
                ///<summary> Returns the XML encoding of the current instance.</summary>
index 5fa856b42fb101c20949b4318468c63799065ee0..47bda9d0cc0daa36580b81f91d168661a12923eb 100755 (executable)
@@ -322,9 +322,9 @@ namespace System.Security
                        else {
                                s.Append (">").Append (text);
                                if (children != null) {
-                                       for (int i = 0; i < children.Count; i++) {
+                                       foreach (SecurityElement child in children) {
                                                s.Append (Environment.NewLine);
-                                               ((SecurityElement) children [i]).ToXml (ref s, level + 1);
+                                               child.ToXml (ref s, level + 1);
                                        }
                                }
                                s.Append (Environment.NewLine)
index 2a5e1b4ee4598691bbdfbc915ca10589c9e1b76d..e79b375660f500c51681d6acf71b91e6236aec05 100644 (file)
@@ -22,6 +22,7 @@ namespace MonoTests.System.Net {
                                 TestSuite suite = new TestSuite ();
                                 suite.AddTest (IPAddressTest.Suite);
                                 suite.AddTest (IPEndPointTest.Suite);
+                                suite.AddTest (SocketPermissionTest.Suite);
                                 suite.AddTest (CookieTest.Suite);
                                 suite.AddTest (CookieCollectionTest.Suite);
                                 //suite.AddTest (CookieContainerTest.Suite);
diff --git a/mcs/class/corlib/Test/System.Net/SocketPermissionTest.cs b/mcs/class/corlib/Test/System.Net/SocketPermissionTest.cs
new file mode 100644 (file)
index 0000000..5704aad
--- /dev/null
@@ -0,0 +1,113 @@
+//\r
+// SocketPermissionTest.cs - NUnit Test Cases for System.Net.SocketPermission\r
+//\r
+// Author:\r
+//   Lawrence Pit (loz@cable.a2000.nl)\r
+//\r
+\r
+using NUnit.Framework;\r
+using System;\r
+using System.Net;\r
+using System.Collections;\r
+using System.Security;\r
+using System.Security.Permissions;\r
+\r
+namespace MonoTests.System.Net\r
+{\r
+\r
+public class SocketPermissionTest : TestCase\r
+{\r
+       SocketPermission s1;\r
+       SocketPermission s2;\r
+       \r
+        public SocketPermissionTest () :\r
+                base ("[MonoTests.System.Net.SocketPermissionTest]") {}\r
+\r
+        public SocketPermissionTest (string name) : base (name) {}\r
+\r
+        protected override void SetUp () \r
+        {\r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "localhost", 8080);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "123", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "www.ximian.com", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "120.4.3.2", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "www.google.com", 80);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "1.*.10.*.99", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "128.0.0.1", SocketPermission.AllPorts);\r
+               //s1.AddPermission(NetworkAccess.Accept, TransportType.All, "0.0.0.0", SocketPermission.AllPorts);\r
+               s1.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.*", SocketPermission.AllPorts);\r
+\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.All, "12.13.14.15", 80);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "localhost", 8080);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "123", 8080);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "www.google.com", SocketPermission.AllPorts);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "213.*.*.*", SocketPermission.AllPorts);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "128.0.0.1", 9090);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "216.239.*.*", SocketPermission.AllPorts);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "128.0.0.1", SocketPermission.AllPorts);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "120.4.3.2", 80);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "196.*.*.*", SocketPermission.AllPorts);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "1.*.*.*.99", SocketPermission.AllPorts);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.*.*", 9090);\r
+               //s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.7", SocketPermission.AllPorts);            \r
+       }\r
+\r
+        protected override void TearDown () {}\r
+\r
+        public static ITest Suite\r
+        {\r
+                get {\r
+                        return new TestSuite (typeof (SocketPermissionTest));\r
+                }\r
+        }\r
+        \r
+        public void TestIsSubsetOf ()\r
+        {\r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               s1.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.*", SocketPermission.AllPorts);\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.All, "12.13.14.15", 80);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.*.*", 9090);\r
+               \r
+               Assert ("#1", !s1.IsSubsetOf (s2));\r
+               Assert ("#2", !s2.IsSubsetOf (s1));\r
+\r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               s1.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.*", 9090);\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.All, "12.13.14.15", 80);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.*.*", 9090);\r
+               \r
+               Assert ("#3: bug in MS.Net", s1.IsSubsetOf (s2));\r
+               Assert ("#4", !s2.IsSubsetOf (s1));\r
+               \r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.*.*", 80);\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.All, "12.13.14.*", 80);\r
+               Assert ("#5", !s1.IsSubsetOf (s2));\r
+               Assert ("#6", !s2.IsSubsetOf (s1));\r
+\r
+               s1 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               s1.AddPermission(NetworkAccess.Accept, TransportType.Tcp, "10.11.*.*", 9090);\r
+               s2 = new SocketPermission(NetworkAccess.Connect, TransportType.Tcp, "12.13.14.15", 80);\r
+               s2.AddPermission(NetworkAccess.Accept, TransportType.All, "10.11.4.*", SocketPermission.AllPorts);\r
+               Assert ("#7", !s1.IsSubsetOf (s2));\r
+               Assert ("#8", s2.IsSubsetOf (s1));\r
+       }\r
+       \r
+       public void TestIntersect ()\r
+       {\r
+       }\r
+       \r
+       public void TestUnion ()\r
+       {\r
+       }\r
+       \r
+       public void TestXml ()\r
+       {\r
+               SecurityElement elem = s2.ToXml ();\r
+               s1.FromXml (elem);\r
+               Assert ("#1", s2.IsSubsetOf (s1) && s1.IsSubsetOf (s2));\r
+       }\r
+}\r
+\r
+}\r
+\r