+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
out h_aliases,
out h_addrlist);
if (ret == false) {
- throw new SocketException();
+ throw new SocketException(11001);
}
return(hostent_to_IPHostEntry(h_name, h_aliases,
out h_aliases,
out h_addrlist);
if (ret == false) {
- throw new SocketException();
+ throw new SocketException(11001);
}
return(hostent_to_IPHostEntry(h_name, h_aliases,
--- /dev/null
+//\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
--- /dev/null
+//\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
--- /dev/null
+//\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
--- /dev/null
+//\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
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);
--- /dev/null
+//\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
-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
///<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>
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)
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);
--- /dev/null
+//\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