Removed Consoles and ^Ms
[mono.git] / mcs / class / System / System.Net / AuthenticationManager.cs
index d1c3e48b2910c45a79118d364f974636b78e4233..ce35264f4e8cc65927c6f6f53b65fc6afed3802d 100755 (executable)
 // 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);
+                               }
+                       }
                }
        }
 }
+