Fix null sessions in HttpContextWrapper.Session
[mono.git] / mcs / class / corlib / System.Security.Policy / PolicyStatement.cs
index 0d7db6cf5e9bfcdeefda2555a29b1d8bf62c959e..111c25e34a13a9eacc2e0ee4594ec260a0191bd2 100644 (file)
@@ -1,12 +1,12 @@
 //\r
-// System.Security.Policy.PolicyStatement\r
+// System.Security.Policy.PolicyStatement.cs\r
 //\r
 // Authors:\r
 //     Dan Lewis (dihlewis@yahoo.co.uk)\r
 //     Sebastien Pouliot  <sebastien@ximian.com>
 //\r
 // (C) 2002\r
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 \r
+using System.Runtime.InteropServices;
 using System.Security.Permissions;\r
 \r
 namespace System.Security.Policy {\r
 \r
        [Serializable]\r
+       [ComVisible (true)]
        public sealed class PolicyStatement : ISecurityEncodable, ISecurityPolicyEncodable {
 
                private PermissionSet perms;\r
                private PolicyStatementAttribute attrs;\r
 \r
-               public PolicyStatement (PermissionSet perms) :\r
-                       this (perms, PolicyStatementAttribute.Nothing)\r
-               {\r
+               public PolicyStatement (PermissionSet permSet) :
+                       this (permSet, PolicyStatementAttribute.Nothing)\r
+               {
                }\r
 \r
-               public PolicyStatement (PermissionSet perms, PolicyStatementAttribute attrs) {\r
-                       this.perms = perms;\r
-                       this.attrs = attrs;\r
+               public PolicyStatement (PermissionSet permSet, PolicyStatementAttribute attributes) 
+               {\r
+                       if (permSet != null) {\r
+                               this.perms = permSet.Copy ();
+                               this.perms.SetReadOnly (true);
+                       }\r
+                       this.attrs = attributes;\r
                }\r
                \r
                public PermissionSet PermissionSet {\r
-                       get { return perms; }\r
+                       get {
+                               if (perms == null) {
+                                       perms = new PermissionSet (PermissionState.None);
+                                       perms.SetReadOnly (true);
+                               }
+                               return perms;
+                       }\r
                        set { perms = value; }\r
                }\r
                \r
                public PolicyStatementAttribute Attributes {\r
                        get { return attrs; }\r
-                       set { attrs = value; }\r
+                       set {
+                               // note: yes it's a flag but all possible values have a corresponding name
+                               switch (value) {
+                               case PolicyStatementAttribute.Nothing:
+                               case PolicyStatementAttribute.Exclusive:
+                               case PolicyStatementAttribute.LevelFinal:
+                               case PolicyStatementAttribute.All:
+                                       attrs = value;
+                                       break;
+                               default:
+                                       string msg = Locale.GetText ("Invalid value for {0}.");
+                                       throw new ArgumentException (String.Format (msg, "PolicyStatementAttribute"));
+                               }
+                       }\r
                }\r
 \r
                public string AttributeString {\r
-                       get { return attrs.ToString ("F"); }\r
+                       get {
+                               switch (attrs) {
+                               case PolicyStatementAttribute.Exclusive:
+                                       return "Exclusive";
+                               case PolicyStatementAttribute.LevelFinal:
+                                       return "LevelFinal";
+                               case PolicyStatementAttribute.All:
+                                       return "Exclusive LevelFinal";
+                               default:
+                                       return String.Empty;
+                               }
+                       }\r
                }\r
 \r
                public PolicyStatement Copy ()\r
@@ -69,23 +105,27 @@ namespace System.Security.Policy {
 \r
                // ISecurityEncodable\r
 \r
-               public void FromXml (SecurityElement e)\r
+               public void FromXml (SecurityElement et)\r
                {\r
-                       FromXml (e, null);\r
+                       FromXml (et, null);\r
                }\r
 \r
-               public void FromXml (SecurityElement e, PolicyLevel level)\r
-               {\r
-                       SecurityElement permissions = e.SearchForChildByTag ("PermissionSet");\r
+               public void FromXml (SecurityElement et, PolicyLevel level)\r
+               {
+                       if (et == null)
+                               throw new ArgumentNullException ("et");
+                       if (et.Tag != "PolicyStatement")
+                               throw new ArgumentException (Locale.GetText ("Invalid tag."));
 \r
-                       string attributes = e.Attribute ("Attributes");\r
 \r
-                       if (attributes != null)\r
+                       string attributes = et.Attribute ("Attributes");\r
+                       if (attributes != null) {\r
                                attrs = (PolicyStatementAttribute) Enum.Parse (\r
                                        typeof (PolicyStatementAttribute), attributes);\r
-                               \r
-                       perms = new PermissionSet (PermissionState.None);\r
-                       perms.FromXml (permissions);\r
+                       }
+\r
+                       SecurityElement permissions = et.SearchForChildByTag ("PermissionSet");\r
+                       PermissionSet.FromXml (permissions);\r
                }\r
                \r
                public SecurityElement ToXml ()\r
@@ -101,12 +141,12 @@ namespace System.Security.Policy {
                        if (attrs != PolicyStatementAttribute.Nothing)\r
                                element.AddAttribute ("Attributes", attrs.ToString ());\r
                        \r
-                       element.AddChild (perms.ToXml ());\r
+                       element.AddChild (PermissionSet.ToXml ());\r
 \r
                        return element;\r
                }
 
-#if NET_2_0
+               [ComVisible (false)]
                public override bool Equals (object obj)
                {
                        if (obj == null)
@@ -115,14 +155,19 @@ namespace System.Security.Policy {
                        if (ps == null)
                                return false;
 
-                       return (perms.Equals (obj) && (attrs == ps.attrs));
+                       return (PermissionSet.Equals (obj) && (attrs == ps.attrs));
                }
 
+               [ComVisible (false)]
                public override int GetHashCode ()
                {
                        // return same hash code if two PolicyStatement are equals
-                       return (perms.GetHashCode () ^ (int) attrs);
+                       return (PermissionSet.GetHashCode () ^ (int) attrs);
+               }
+
+               internal static PolicyStatement Empty ()
+               {
+                       return new PolicyStatement (new PermissionSet (PermissionState.None));
                }
-#endif\r
        }\r
 }\r