// System.Net.AuthenticationManager.cs
//
// Author:
-// Miguel de Icaza (miguel@ximian.com)
+// Miguel de Icaza (miguel@ximian.com)
+// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
-// (C) Ximian, Inc. http://www.ximian.com
+// (C) 2002,2003 Ximian, Inc. (http://www.ximian.com)
//
-namespace System.Net {
-
- public class AuthenticationManager {
+using System.Collections;
+using System.Configuration;
+namespace System.Net
+{
+ public class AuthenticationManager
+ {
static ArrayList modules;
+ private AuthenticationManager ()
+ {
+ }
+
+ static void EnsureModules ()
+ {
+ if (modules != null)
+ return;
+
+ lock (typeof (AuthenticationManager)) {
+ if (modules != null)
+ return;
+
+ modules = new ArrayList ();
+ ConfigurationSettings.GetConfig ("system.net/authenticationModules");
+ }
+ }
+
public static IEnumerator RegisteredModules {
get {
- if (!modules)
- modules = new ArrayList ();
-
- return modules;
+ EnsureModules ();
+ return modules.GetEnumerator ();
}
}
- public static Authorization PreAuthenticate (WebRequest request,
- ICredentialLookup credentials)
+ internal static void Clear ()
{
- // FIXME: implement
+ EnsureModules ();
+ lock (modules)
+ modules.Clear ();
}
+
+ public static Authorization Authenticate (string challenge, WebRequest request, ICredentials credentials)
+ {
+ if (request == null)
+ throw new ArgumentNullException ("request");
- public static void Register (IAuthenticationModule authenticationModule)
+ if (credentials == null)
+ throw new ArgumentNullException ("credentials");
+
+ if (challenge == null)
+ throw new ArgumentNullException ("challenge");
+
+ return DoAuthenticate (challenge, request, credentials);
+ }
+
+ static Authorization DoAuthenticate (string challenge, WebRequest request, ICredentials credentials)
{
- if (!modules)
- modules = new ArrayList ();
+ EnsureModules ();
+ lock (modules) {
+ foreach (IAuthenticationModule mod in modules) {
+ Authorization auth = mod.Authenticate (challenge, request, credentials);
+ if (auth == null)
+ continue;
+
+ auth.Module = mod;
+ return auth;
+ }
+ }
- modules.Add (authenticationModule);
+ return null;
}
- public static Authorization Respond (WebHeaders ResponseHeaders,
- WebRequest Request,
- ICredentialLookup credentials)
+ public static Authorization PreAuthenticate (WebRequest request, ICredentials credentials)
{
- // FIXME: implement
+ if (request == null)
+ throw new ArgumentNullException ("request");
+
+ if (credentials == null)
+ return null;
+
+ EnsureModules ();
+ lock (modules) {
+ foreach (IAuthenticationModule mod in modules) {
+ Authorization auth = mod.PreAuthenticate (request, credentials);
+ if (auth == null)
+ continue;
+
+ auth.Module = mod;
+ return auth;
+ }
+ }
+
return null;
}
+ public static void Register (IAuthenticationModule authenticationModule)
+ {
+ if (authenticationModule == null)
+ throw new ArgumentNullException ("authenticationModule");
+
+ DoUnregister (authenticationModule.AuthenticationType, false);
+ lock (modules)
+ modules.Add (authenticationModule);
+ }
+
public static void Unregister (IAuthenticationModule authenticationModule)
{
- // FIXME: implement
+ if (authenticationModule == null)
+ throw new ArgumentNullException ("authenticationModule");
+
+ DoUnregister (authenticationModule.AuthenticationType, true);
}
- pubilc static void Unregister (string authenticationScheme)
+ public static void Unregister (string authenticationScheme)
{
- // FIXME: implement
+ if (authenticationScheme == null)
+ throw new ArgumentNullException ("authenticationScheme");
+
+ DoUnregister (authenticationScheme, true);
+ }
+
+ static void DoUnregister (string authenticationScheme, bool throwEx)
+ {
+ EnsureModules ();
+ lock (modules) {
+ IAuthenticationModule module = null;
+ foreach (IAuthenticationModule mod in modules) {
+ string modtype = mod.AuthenticationType;
+ if (String.Compare (modtype, authenticationScheme, true) == 0) {
+ module = mod;
+ break;
+ }
+ }
+
+ if (module == null) {
+ if (throwEx)
+ throw new InvalidOperationException ("Scheme not registered.");
+ } else {
+ modules.Remove (module);
+ }
+ }
}
}
}
+