//\r
-// System.Security.Policy.PolicyStatement\r
+// System.Security.Policy.PolicyStatement.cs\r
//\r
-// Author:\r
-// Dan Lewis (dihlewis@yahoo.co.uk)\r
+// Authors:\r
+// Dan Lewis (dihlewis@yahoo.co.uk)\r
+// Sebastien Pouliot <sebastien@ximian.com>
//\r
// (C) 2002\r
-//\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
- public sealed class PolicyStatement : ISecurityEncodable, ISecurityPolicyEncodable {\r
- public PolicyStatement (PermissionSet perms) :\r
- this (perms, PolicyStatementAttribute.Nothing)\r
- {\r
+ [ComVisible (true)]
+ public sealed class PolicyStatement : ISecurityEncodable, ISecurityPolicyEncodable {
+
+ private PermissionSet perms;\r
+ private PolicyStatementAttribute attrs;\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
\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
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
- }\r
-\r
- private PermissionSet perms;\r
- private PolicyStatementAttribute attrs;\r
+ }
+
+ [ComVisible (false)]
+ public override bool Equals (object obj)
+ {
+ if (obj == null)
+ return false;
+ PolicyStatement ps = (obj as PolicyStatement);
+ if (ps == null)
+ return false;
+
+ return (PermissionSet.Equals (obj) && (attrs == ps.attrs));
+ }
+
+ [ComVisible (false)]
+ public override int GetHashCode ()
+ {
+ // return same hash code if two PolicyStatement are equals
+ return (PermissionSet.GetHashCode () ^ (int) attrs);
+ }
+
+ internal static PolicyStatement Empty ()
+ {
+ return new PolicyStatement (new PermissionSet (PermissionState.None));
+ }
}\r
}\r