Преглед изворни кода

not yet used by Dns itself

svn path=/trunk/mcs/; revision=4186
Lawrence Pit пре 24 година
родитељ
комит
3ed3cfcf7e

+ 6 - 1
mcs/class/System/System.Net/ChangeLog

@@ -1,6 +1,11 @@
+2002-05-01  Lawrence Pit <[email protected]>
+
+	* DnsPermission.cs: implemented
+	* DnsPermissionAttribute.cs: implemented
+
 2002-04-28  Lawrence Pit <[email protected]>
 
-	* EndpointPermission: implemented
+	* EndpointPermission.cs: implemented
 	* SocketPermission.cs: implemented
 	* SocketPermissionAttribute.cs: implemented
 	* ProtocolViolationException.cs: implemented

+ 149 - 0
mcs/class/System/System.Net/DnsPermission.cs

@@ -0,0 +1,149 @@
+//
+// System.Net.DnsPermission.cs
+//
+// Author:
+//   Lawrence Pit ([email protected])
+//
+
+using System;
+using System.Collections;
+using System.Security;
+using System.Security.Permissions;
+
+namespace System.Net
+{
+	[Serializable]
+	public class DnsPermission : CodeAccessPermission, IUnrestrictedPermission
+	{
+		// Fields
+		bool m_noRestriction;
+		
+		// Constructors
+		public DnsPermission (PermissionState state) : base () 
+		{						
+			m_noRestriction = (state == PermissionState.Unrestricted);
+		}
+		
+		// Methods
+				
+		public override IPermission Copy ()
+		{
+			// this is immutable.
+			return this;		
+		}
+		
+		public override IPermission Intersect (IPermission target)
+		{
+			// LAMESPEC: says to throw an exception when null
+			// but at same time it says to return null. We'll
+			// follow MS behaviour.
+			if (target == null) 
+				return null;
+			
+			DnsPermission perm = target as DnsPermission;
+			
+			if (perm == null)
+				throw new ArgumentException ("Argument not of type DnsPermission");
+				
+			if (this.m_noRestriction && perm.m_noRestriction)
+				return this;
+			
+			return this.m_noRestriction ? perm : this;
+		}
+		
+		public override bool IsSubsetOf (IPermission target) 
+		{
+			if (target == null)
+				return !m_noRestriction;
+			
+			DnsPermission perm = target as DnsPermission;
+			
+			if (perm == null)
+				throw new ArgumentException ("Argument not of type DnsPermission");
+			
+			return !this.m_noRestriction || perm.m_noRestriction;
+		}
+
+		public bool IsUnrestricted () 
+		{
+			return this.m_noRestriction;
+		}
+
+		/*
+		
+		DnsPermission dns1 = new DnsPermission (PermissionState.None);
+		Console.WriteLine (dns1.ToXml ().ToString ());
+
+		DnsPermission dns2 = new DnsPermission (PermissionState.Unrestricted);
+		Console.WriteLine (dns2.ToXml ().ToString ());
+		
+		This is the sample xml output:
+
+		<IPermission class="System.Net.DnsPermission, System, Version=1.0.3300.0, Cultur
+		e=neutral, PublicKeyToken=b77a5c561934e089"
+			     version="1"/>
+
+		<IPermission class="System.Net.DnsPermission, System, Version=1.0.3300.0, Cultur
+		e=neutral, PublicKeyToken=b77a5c561934e089"
+			     version="1"
+			     Unrestricted="true"/>
+		*/
+		public override SecurityElement ToXml ()
+		{
+             
+			SecurityElement root = new SecurityElement ("IPermission");
+
+			root.AddAttribute ("class", this.GetType ().FullName + ", " + 
+			                            "System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
+
+/*			
+GetType ().Module doesn't work yet with Mono.. (2002-05-01)
+We need to do it as below though, because this class can be extended
+
+			root.AddAttribute ("class", this.GetType ().FullName + ", " + 
+			                            this.GetType ().Module.Assembly.FullName);
+*/			                            
+			root.AddAttribute ("version", "1");
+			if (m_noRestriction)
+				root.AddAttribute ("Unrestricted", "true");				
+
+			return root;
+		}
+		
+		public override void FromXml (SecurityElement securityElement)
+		{
+			if (securityElement == null)
+				throw new ArgumentNullException ("securityElement");
+				
+			// LAMESPEC: it says to throw an ArgumentNullException in this case				
+			if (securityElement.Tag != "IPermission")
+				throw new ArgumentException ("securityElement");
+				
+			string classStr = securityElement.Attribute ("class");
+			if (classStr == null || !classStr.StartsWith (this.GetType ().FullName + ","))
+				throw new ArgumentException ("securityElement");
+				
+			string unrestricted = securityElement.Attribute ("Unrestricted");
+			if (unrestricted != null) 
+				this.m_noRestriction = (String.Compare (unrestricted, "true", true) == 0);
+		}		
+		
+		public override IPermission Union (IPermission target) 
+		{
+			// LAMESPEC: according to spec we should throw an 
+			// exception when target is null. We'll follow the
+			// behaviour of MS.Net instead of the spec.
+			if (target == null)
+				return this;
+				// throw new ArgumentNullException ("target");
+				
+			DnsPermission perm = target as DnsPermission;
+			
+			if (perm == null)
+				throw new ArgumentException ("Argument not of type DnsPermission");
+			
+			return this.m_noRestriction ? this : perm;
+		}
+
+	}
+}

+ 38 - 0
mcs/class/System/System.Net/DnsPermissionAttribute.cs

@@ -0,0 +1,38 @@
+//
+// System.Net.DnsPermissionAttribute.cs
+//
+// Author:
+//   Lawrence Pit ([email protected])
+//
+
+using System;
+using System.Security;
+using System.Security.Permissions;
+
+namespace System.Net
+{
+	[AttributeUsage (AttributeTargets.Assembly 
+	               | AttributeTargets.Class 
+	               | AttributeTargets.Struct 
+	               | AttributeTargets.Constructor 
+	               | AttributeTargets.Method)
+	]	
+	[Serializable]
+	public sealed class DnsPermissionAttribute : CodeAccessSecurityAttribute
+	{
+		
+		// Constructors
+		public DnsPermissionAttribute (SecurityAction action) : base (action)
+		{
+		}
+
+		// Methods
+		
+		public override IPermission CreatePermission () {
+			return new DnsPermission (
+				this.Unrestricted ?
+				PermissionState.Unrestricted :
+				PermissionState.None);
+		}		
+	}
+}