2004-01-14 Sebastien Pouliot <spouliot@videotron.ca>
authorSebastien Pouliot <sebastien@ximian.com>
Thu, 15 Jan 2004 04:21:37 +0000 (04:21 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Thu, 15 Jan 2004 04:21:37 +0000 (04:21 -0000)
* Url.cs: Added IBuiltInEvidence (corcompare) and new static methods
to prepare and compare urls.
* UrlMembershipCondition.cs: Added missing [Serializable] attribute
and set_Url property. Implemented Check. Fixed Equals and To/FromXml.

svn path=/trunk/mcs/; revision=22092

mcs/class/corlib/System.Security.Policy/ChangeLog
mcs/class/corlib/System.Security.Policy/Url.cs
mcs/class/corlib/System.Security.Policy/UrlMembershipCondition.cs

index 82bed400eb8d5608264ef404897aa793aae75cb6..723fbb91e2b56f142c1a2378489f1c73ec0832c6 100644 (file)
@@ -1,3 +1,10 @@
+2004-01-14  Sebastien Pouliot  <spouliot@videotron.ca>
+
+       * Url.cs: Added IBuiltInEvidence (corcompare) and new static methods 
+       to prepare and compare urls.
+       * UrlMembershipCondition.cs: Added missing [Serializable] attribute 
+       and set_Url property. Implemented Check. Fixed Equals and To/FromXml.
+
 2004-01-05  Sebastien Pouliot  <spouliot@videotron.ca>
 
        * CodeGroup.cs: Added internal constructor for PolicyLevel. Complete
index 32dba34d1d3c52ab944586a916a9454ed6188b02..c86d524b41dec5cbe044a3743c7a623ab32632c4 100644 (file)
@@ -3,8 +3,10 @@
 //
 // Author
 //     Duncan Mak (duncan@ximian.com)
+//     Sebastien Pouliot (spouliot@motus.com)
 //
 // (C) 2003 Ximian, Inc (http://www.ximian.com)
+// (C) 2004 Motus Technologies Inc. (http://www.motus.com)
 //
 
 using System;
@@ -15,33 +17,18 @@ using System.Security.Policy;
 namespace System.Security.Policy {
 
         [Serializable]
-        public sealed class Url: IIdentityPermissionFactory {
+        public sealed class Url: IIdentityPermissionFactory, IBuiltInEvidence {
 
                 string origin_url;
-                SecurityElement element;
                 
                 public Url (string name)
                 {
-                        if (name == null)
-                                throw new ArgumentNullException (Locale.GetText ("name is null"));
-
-                        origin_url = name;
-                        element = new SecurityElement (
-                                typeof (System.Security.Policy.Url).FullName);
-
-                        element.AddAttribute ("version", "1");
-                        element.AddChild (new SecurityElement ("Url", name));
-                }
-
-                private Url (string name, SecurityElement security_element)
-                {
-                        origin_url = name;
-                        element = security_element;
+                       origin_url = Prepare (name);
                 }
 
                 public object Copy ()
                 {
-                        return new Url (origin_url, element);
+                        return new Url (origin_url);
                 }
 
                 public IPermission CreateIdentityPermission (Evidence evidence)
@@ -51,7 +38,9 @@ namespace System.Security.Policy {
 
                 public override bool Equals (object o)
                 {
-                        return (o is System.Security.Policy.Url && ((Url) o).Value == Value);
+                       if (o is System.Security.Policy.Url)
+                               return (String.Compare (((Url) o).Value, Value, true, CultureInfo.InvariantCulture) == 0);
+                       return false;
                 }
 
                 public override int GetHashCode ()
@@ -61,13 +50,72 @@ namespace System.Security.Policy {
 
                 public override string ToString ()
                 {
-                        return element.ToString ();
+                       SecurityElement element = new SecurityElement (typeof (System.Security.Policy.Url).FullName);
+                       element.AddAttribute ("version", "1");
+                       element.AddChild (new SecurityElement ("Url", origin_url));
+                       return element.ToString ();
                 }
 
                 public string Value {
-                        get {
-                                return origin_url;
-                        }
+                       get { return origin_url; }
                 }
+
+               // interface IBuiltInEvidence
+
+               [MonoTODO]
+               int IBuiltInEvidence.GetRequiredSize (bool verbose) 
+               {
+                       return 0;
+               }
+
+               [MonoTODO]
+               int IBuiltInEvidence.InitFromBuffer (char [] buffer, int position) 
+               {
+                       return 0;
+               }
+
+               [MonoTODO]
+               int IBuiltInEvidence.OutputToBuffer (char [] buffer, int position, bool verbose) 
+               {
+                       return 0;
+               }
+
+               // internal
+
+               [MonoTODO ("missing site validation")]
+               internal static string Prepare (string url) 
+               {
+                       if (url == null)
+                               throw new ArgumentNullException ("Url");
+                       if (url == String.Empty)
+                               throw new FormatException (Locale.GetText ("Invalid (empty) Url"));
+
+                       // is a protocol specified
+                       int protocolPos = url.IndexOf ("://");
+                       if (protocolPos == -1)
+                               return "file://" + url.ToUpper ();
+                       
+                       if (url.StartsWith ("file://"))
+                               return "file://" + url.Substring (7).ToUpper ();
+
+                       // add a trailing slash if none (lonely one) is present
+                       if (url.LastIndexOf ("/") == protocolPos + 2)
+                               return url + "/";
+                       else
+                               return url;
+               }
+
+               internal static bool Compare (string mask, string url) 
+               {
+                       int wildcard = mask.LastIndexOf ("*");
+                       if (wildcard > 0) {
+                               // partial match with a wildcard at the end
+                               return (String.Compare (mask, 0, url, 0, wildcard, true, CultureInfo.InvariantCulture) == 0);
+                       }
+                       else {
+                               // exact match
+                               return (String.Compare (mask, url, true, CultureInfo.InvariantCulture) == 0);
+                       }
+               }
         }
 }
index e211a65f9bd7f6c9c995d5994d51f1dc0a78c85c..4a78acb318f45e27c6fd6d00f555ab8adc3841ad 100644 (file)
@@ -1,10 +1,12 @@
 //
 // System.Security.Policy.UrlMembershipCondition.cs
 //
-// Author:
-//   Duncan Mak (duncan@ximian.com)
+// Authors:
+//     Duncan Mak (duncan@ximian.com)
+//     Sebastien Pouliot (spouliot@motus.com)
 //
 // (C) 2003, Ximian Inc.
+// (C) 2004 Motus Technologies Inc. (http://www.motus.com)
 //
 
 using System;
@@ -12,6 +14,7 @@ using System.Globalization;
 
 namespace System.Security.Policy {
 
+       [Serializable]
         public sealed class UrlMembershipCondition
                 : IMembershipCondition, ISecurityEncodable, ISecurityPolicyEncodable, IConstantMembershipCondition
         {
@@ -19,20 +22,27 @@ namespace System.Security.Policy {
                 
                 public UrlMembershipCondition (string url)
                 {
-                        if (url == null)
-                                throw new ArgumentNullException (
-                                        Locale.GetText ("The argument is null."));
-
-                        this.url = url;
+                        this.url = System.Security.Policy.Url.Prepare (url);
                 }
 
                 public string Url {
                         get { return url; }
+                       set { url = System.Security.Policy.Url.Prepare (value); }
                 }
 
-                [MonoTODO]
                 public bool Check (Evidence evidence)
                 {
+                       if (evidence == null)
+                               return false;
+
+                       foreach (object o in evidence) {
+                               Url u = (o as Url);
+                               if (u != null) {
+                                       // note: there shouldn't be more than one Url evidence
+                                       if (System.Security.Policy.Url.Compare (url, u.Value))
+                                               return true;
+                               }
+                       }
                         return false;
                 }
 
@@ -43,10 +53,10 @@ namespace System.Security.Policy {
 
                 public override bool Equals (Object o)
                 {
-                        if (o is UrlMembershipCondition == false)
-                                return false;
-                        else
-                                return ((UrlMembershipCondition) o).Url == url;
+                       if (o is UrlMembershipCondition) {
+                               return System.Security.Policy.Url.Compare (url, ((UrlMembershipCondition) o).Url);
+                       }
+                       return false;
                 }
 
                 public void FromXml (SecurityElement element)
@@ -57,16 +67,19 @@ namespace System.Security.Policy {
                public void FromXml (SecurityElement element, PolicyLevel level)
                {
                        if (element == null)
-                               throw new ArgumentNullException (
-                                       Locale.GetText ("The argument is null."));
+                               throw new ArgumentNullException ("element");
+                       
+                       if (element.Tag != "IMembershipCondition")
+                               throw new ArgumentException (
+                                       Locale.GetText ("Invalid tag - expected IMembershipCondition"));
 
                        if (element.Attribute ("class") != GetType ().AssemblyQualifiedName)
                                throw new ArgumentException (
-                                       Locale.GetText ("The argument is invalid."));
+                                       Locale.GetText ("Invalid class attribute"));
 
                        if (element.Attribute ("version") != "1")
                                throw new ArgumentException (
-                                       Locale.GetText ("The argument is invalid."));
+                                       Locale.GetText ("Invalid version"));
                        
                        url = element.Attribute ("Url");
                }
@@ -89,10 +102,9 @@ namespace System.Security.Policy {
                 public SecurityElement ToXml (PolicyLevel level)
                 {
                         SecurityElement element = new SecurityElement ("IMembershipCondition");
-                        element.AddAttribute ("version", "1");
-
+                       element.AddAttribute ("class", this.GetType ().AssemblyQualifiedName);
+                       element.AddAttribute ("version", "1");
                         element.AddAttribute ("Url", url);
-
                         return element;
                 }
         }