2 // System.Security.Policy.Url.cs
5 // Duncan Mak (duncan@ximian.com)
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // (C) 2003 Ximian, Inc (http://www.ximian.com)
9 // (C) 2004 Motus Technologies Inc. (http://www.motus.com)
10 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System
.Globalization
;
33 using System
.Runtime
.InteropServices
;
34 using System
.Security
.Permissions
;
38 namespace System
.Security
.Policy
{
42 public sealed class Url
: IIdentityPermissionFactory
, IBuiltInEvidence
{
44 private string origin_url
;
46 public Url (string name
)
51 internal Url (string name
, bool validated
)
53 origin_url
= validated
? name
: Prepare (name
);
60 // dont re-validate the Url
61 return new Url (origin_url
, true);
64 public IPermission
CreateIdentityPermission (Evidence evidence
)
66 return new UrlIdentityPermission (origin_url
);
69 public override bool Equals (object o
)
71 Url u
= (o
as System
.Security
.Policy
.Url
);
75 string url1
= u
.Value
;
76 string url2
= origin_url
;
77 if (url1
.IndexOf (Uri
.SchemeDelimiter
) < 0)
78 url1
= "file://" + url1
;
79 if (url2
.IndexOf (Uri
.SchemeDelimiter
) < 0)
80 url2
= "file://" + url2
;
81 return (String
.Compare (url1
, url2
, true, CultureInfo
.InvariantCulture
) == 0);
84 public override int GetHashCode ()
86 string s
= origin_url
;
87 if (s
.IndexOf (Uri
.SchemeDelimiter
) < 0)
89 return s
.GetHashCode ();
92 public override string ToString ()
94 SecurityElement element
= new SecurityElement ("System.Security.Policy.Url");
95 element
.AddAttribute ("version", "1");
96 element
.AddChild (new SecurityElement ("Url", origin_url
));
97 return element
.ToString ();
100 public string Value
{
101 get { return origin_url; }
104 // interface IBuiltInEvidence
106 int IBuiltInEvidence
.GetRequiredSize (bool verbose
)
108 return (verbose
? 3 : 1) + origin_url
.Length
;
111 [MonoTODO ("IBuiltInEvidence")]
112 int IBuiltInEvidence
.InitFromBuffer (char [] buffer
, int position
)
117 [MonoTODO ("IBuiltInEvidence")]
118 int IBuiltInEvidence
.OutputToBuffer (char [] buffer
, int position
, bool verbose
)
124 private string Prepare (string url
)
127 throw new ArgumentNullException ("Url");
128 if (url
== String
.Empty
)
129 throw new FormatException (Locale
.GetText ("Invalid (empty) Url"));
131 int protocolPos
= url
.IndexOf (Uri
.SchemeDelimiter
); // '://'
132 if (protocolPos
> 0) {
133 if (url
.StartsWith ("file://")) {
134 // convert file url into uppercase
135 url
= "file://" + url
.Substring (7);
137 // don't escape and don't reduce (e.g. '.' and '..')
138 Uri uri
= new Uri (url
, false, false);
139 url
= uri
.ToString ();
142 int lastpos
= url
.Length
- 1;
143 if (url
[lastpos
] == '/')
144 url
= url
.Substring (0, lastpos
);