//\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-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
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// 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
+ return new PolicyStatement (perms, attrs);\r
}\r
\r
// ISecurityEncodable\r
\r
- [MonoTODO]\r
- public void FromXml (SecurityElement e) {\r
+ public void FromXml (SecurityElement et)\r
+ {\r
+ FromXml (et, null);\r
}\r
\r
- [MonoTODO]\r
- public void FromXml (SecurityElement e, PolicyLevel level) {\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
+\r
+ string attributes = et.Attribute ("Attributes");\r
+ if (attributes != null) {\r
+ attrs = (PolicyStatementAttribute) Enum.Parse (\r
+ typeof (PolicyStatementAttribute), attributes);\r
+ }
+\r
+ SecurityElement permissions = et.SearchForChildByTag ("PermissionSet");\r
+ PermissionSet.FromXml (permissions);\r
}\r
\r
- [MonoTODO]\r
- public SecurityElement ToXml () {\r
- return null;\r
+ public SecurityElement ToXml ()\r
+ {\r
+ return ToXml (null);\r
}\r
\r
- [MonoTODO]\r
- public SecurityElement ToXml (PolicyLevel level) {\r
- return null;\r
- }\r
+ public SecurityElement ToXml (PolicyLevel level)\r
+ {\r
+ SecurityElement element = new SecurityElement ("PolicyStatement");\r
+ element.AddAttribute ("version", "1");\r
\r
- private PermissionSet perms;\r
- private PolicyStatementAttribute attrs;\r
+ if (attrs != PolicyStatementAttribute.Nothing)\r
+ element.AddAttribute ("Attributes", attrs.ToString ());\r
+ \r
+ element.AddChild (PermissionSet.ToXml ());\r
+\r
+ return element;\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