25093b2cc9a2d20d33cf5e39e48efeb061783c65
[mono.git] / mcs / class / System / System.Net / AuthenticationManager.cs
1 //
2 // System.Net.AuthenticationManager.cs
3 //
4 // Author:
5 //      Miguel de Icaza (miguel@ximian.com)
6 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 //
8 // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com)
9 //
10
11 using System.Collections;
12
13 namespace System.Net
14 {
15         public class AuthenticationManager
16         {
17                 static ArrayList modules;
18
19                 static void EnsureModules ()
20                 {
21                         if (modules != null)
22                                 return;
23
24                         lock (typeof (AuthenticationManager)) {
25                                 if (modules != null)
26                                         return;
27                                 
28                                 modules = new ArrayList ();
29                         }
30                 }
31                 
32                 public static IEnumerator RegisteredModules {
33                         get {
34                                 EnsureModules ();
35                                 return modules.GetEnumerator ();
36                         }
37                 }
38
39                 public static Authorization Authenticate (string challenge, WebRequest request, ICredentials credentials)
40                 {
41                         if (request == null)
42                                 throw new ArgumentNullException ("request");
43
44                         if (credentials == null)
45                                 throw new ArgumentNullException ("credentials");
46
47                         if (challenge == null)
48                                 throw new ArgumentNullException ("challenge");
49
50                         return DoAuthenticate (challenge, request, credentials);
51                 }
52
53                 static Authorization DoAuthenticate (string challenge, WebRequest request, ICredentials credentials)
54                 {
55                         EnsureModules ();
56                         lock (modules) {
57                                 foreach (IAuthenticationModule mod in modules) {
58                                         Authorization auth = mod.Authenticate (challenge, request, credentials);
59                                         if (auth == null)
60                                                 continue;
61
62                                         auth.Module = mod;
63                                         return auth;
64                                 }
65                         }
66
67                         return null;
68                 }
69
70                 [MonoTODO]
71                 public static Authorization PreAuthenticate (WebRequest request, ICredentials credentials)
72                 {
73                         if (request == null)
74                                 throw new ArgumentNullException ("request");
75
76                         if (credentials == null)
77                                 return null;
78                         return null;
79                 }
80
81                 public static void Register (IAuthenticationModule authenticationModule)
82                 {
83                         if (authenticationModule == null)
84                                 throw new ArgumentNullException ("authenticationModule");
85
86                         DoUnregister (authenticationModule.AuthenticationType, false);
87                         lock (modules)
88                                 modules.Add (authenticationModule);
89                 }
90
91                 public static void Unregister (IAuthenticationModule authenticationModule)
92                 {
93                         if (authenticationModule == null)
94                                 throw new ArgumentNullException ("authenticationModule");
95
96                         EnsureModules ();
97                         lock (modules) {
98                                 if (modules.Contains (authenticationModule))
99                                         modules.Remove (authenticationModule);
100                                 else
101                                         throw new InvalidOperationException ("No such module registered.");
102                         }
103                 }
104
105                 public static void Unregister (string authenticationScheme)
106                 {
107                         if (authenticationScheme == null)
108                                 throw new ArgumentNullException ("authenticationScheme");
109                         
110                         DoUnregister (authenticationScheme, true);
111                 }
112
113                 static void DoUnregister (string authenticationScheme, bool throwEx)
114                 {
115                         EnsureModules ();
116                         lock (modules) {
117                                 IAuthenticationModule module = null;
118                                 foreach (IAuthenticationModule mod in modules) {
119                                         string modtype = mod.AuthenticationType;
120                                         if (String.Compare (modtype, authenticationScheme, true) == 0) {
121                                                 module = mod;
122                                                 break;
123                                         }
124                                 }
125
126                                 if (module == null) {
127                                         if (throwEx)
128                                                 throw new InvalidOperationException ("Scheme not registered.");
129                                 } else {
130                                         modules.Remove (module);
131                                 }
132                         }
133                 }
134         }
135 }
136