2 // System.Security.Policy.Url.cs
5 // Duncan Mak (duncan@ximian.com)
6 // Sebastien Pouliot (spouliot@motus.com)
8 // (C) 2003 Ximian, Inc (http://www.ximian.com)
9 // (C) 2004 Motus Technologies Inc. (http://www.motus.com)
13 using System.Globalization;
14 using System.Security.Permissions;
15 using System.Security.Policy;
17 namespace System.Security.Policy {
20 public sealed class Url: IIdentityPermissionFactory, IBuiltInEvidence {
24 public Url (string name)
26 origin_url = Prepare (name);
31 return new Url (origin_url);
34 public IPermission CreateIdentityPermission (Evidence evidence)
36 return new UrlIdentityPermission (origin_url);
39 public override bool Equals (object o)
41 if (o is System.Security.Policy.Url)
42 return (String.Compare (((Url) o).Value, Value, true, CultureInfo.InvariantCulture) == 0);
46 public override int GetHashCode ()
48 return origin_url.GetHashCode ();
51 public override string ToString ()
53 SecurityElement element = new SecurityElement (typeof (System.Security.Policy.Url).FullName);
54 element.AddAttribute ("version", "1");
55 element.AddChild (new SecurityElement ("Url", origin_url));
56 return element.ToString ();
60 get { return origin_url; }
63 // interface IBuiltInEvidence
66 int IBuiltInEvidence.GetRequiredSize (bool verbose)
72 int IBuiltInEvidence.InitFromBuffer (char [] buffer, int position)
78 int IBuiltInEvidence.OutputToBuffer (char [] buffer, int position, bool verbose)
85 [MonoTODO ("missing site validation")]
86 internal static string Prepare (string url)
89 throw new ArgumentNullException ("Url");
90 if (url == String.Empty)
91 throw new FormatException (Locale.GetText ("Invalid (empty) Url"));
93 // is a protocol specified
94 int protocolPos = url.IndexOf ("://");
95 if (protocolPos == -1)
96 return "file://" + url.ToUpper ();
98 if (url.StartsWith ("file://"))
99 return "file://" + url.Substring (7).ToUpper ();
101 // add a trailing slash if none (lonely one) is present
102 if (url.LastIndexOf ("/") == protocolPos + 2)
108 internal static bool Compare (string mask, string url)
110 int wildcard = mask.LastIndexOf ("*");
112 // partial match with a wildcard at the end
113 return (String.Compare (mask, 0, url, 0, wildcard, true, CultureInfo.InvariantCulture) == 0);
117 return (String.Compare (mask, url, true, CultureInfo.InvariantCulture) == 0);