2 // System.Net.CredentialCache.cs
5 // Lawrence Pit (loz@cable.a2000.nl)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections;
31 using System.Runtime.Serialization;
33 namespace System.Net {
34 public class CredentialCache : ICredentials, IEnumerable
39 static NetworkCredential empty = new NetworkCredential (String.Empty, String.Empty, String.Empty);
42 public CredentialCache ()
44 cache = new Hashtable ();
47 [MonoTODO ("Need EnvironmentPermission implementation first")]
48 public static ICredentials DefaultCredentials {
50 // This is used for NTLM, Kerberos and Negotiate under MS
56 // MS does might return a special ICredentials which does not allow getting the
57 // username/password information out of it for non-internal classes.
58 public static NetworkCredential DefaultNetworkCredentials {
63 public NetworkCredential GetCredential (Uri uriPrefix, string authType)
65 int longestPrefix = -1;
66 NetworkCredential result = null;
68 if (uriPrefix == null || authType == null)
71 string absPath = uriPrefix.AbsolutePath;
72 absPath = absPath.Substring (0, absPath.LastIndexOf ('/'));
74 IDictionaryEnumerator e = cache.GetEnumerator ();
75 while (e.MoveNext ()) {
76 CredentialCacheKey key = e.Key as CredentialCacheKey;
78 if (key.Length <= longestPrefix)
81 if (String.Compare (key.AuthType, authType, true) != 0)
84 Uri cachedUri = key.UriPrefix;
86 if (cachedUri.Scheme != uriPrefix.Scheme)
89 if (cachedUri.Port != uriPrefix.Port)
92 if (cachedUri.Host != uriPrefix.Host)
95 if (!absPath.StartsWith (key.AbsPath))
98 longestPrefix = key.Length;
99 result = (NetworkCredential) e.Value;
105 public IEnumerator GetEnumerator ()
107 return cache.Values.GetEnumerator ();
110 public void Add (Uri uriPrefix, string authType, NetworkCredential cred)
112 if (uriPrefix == null)
113 throw new ArgumentNullException ("uriPrefix");
115 if (authType == null)
116 throw new ArgumentNullException ("authType");
118 // throws ArgumentException when same key already exists.
119 cache.Add (new CredentialCacheKey (uriPrefix, authType), cred);
122 public void Remove (Uri uriPrefix, string authType)
124 if (uriPrefix == null)
125 throw new ArgumentNullException ("uriPrefix");
127 if (authType == null)
128 throw new ArgumentNullException ("authType");
130 cache.Remove (new CredentialCacheKey (uriPrefix, authType));
134 [MonoNotSupported ("")]
135 public void Add (string host, int port, string authenticationType, NetworkCredential credential)
137 throw new NotImplementedException ();
140 [MonoNotSupported ("")]
141 public NetworkCredential GetCredential (string host, int port, string authenticationType)
143 throw new NotImplementedException ();
146 [MonoNotSupported ("")]
147 public void Remove (string host, int port, string authenticationType)
149 throw new NotImplementedException ();
153 class CredentialCacheKey {
160 internal CredentialCacheKey (Uri uriPrefix, string authType)
162 this.uriPrefix = uriPrefix;
163 this.authType = authType;
165 this.absPath = uriPrefix.AbsolutePath;
166 this.absPath = absPath.Substring (0, absPath.LastIndexOf ('/'));
168 this.len = uriPrefix.AbsoluteUri.Length;
169 this.hash = uriPrefix.GetHashCode ()
170 + authType.GetHashCode ();
177 public string AbsPath {
178 get { return absPath; }
181 public Uri UriPrefix {
182 get { return uriPrefix; }
185 public string AuthType {
186 get { return authType; }
189 public override int GetHashCode ()
194 public override bool Equals (object obj)
196 CredentialCacheKey key = obj as CredentialCacheKey;
197 return ((key != null) && (this.hash == key.hash));
200 public override string ToString ()
202 return absPath + " : " + authType + " : len=" + len;