Author: gnorton
Date: 2007-07-12 14:04:35 -0400 (Thu, 12 Jul 2007)
New Revision: 81889
Modified:
trunk/mcs/class/System/System.Net/ChangeLog
trunk/mcs/class/System/System.Net/HttpListener.cs
trunk/mcs/class/System/System.Net/HttpListenerContext.cs
Log:
2007-07-12 Geoff Norton <[EMAIL PROTECTED]>
* HttpListenerContext.cs:
* HttpListener.cs: Handle HttpListener AuthenticationSchemes
Only Basic authentication is included for now.
Modified: trunk/mcs/class/System/System.Net/ChangeLog
===================================================================
--- trunk/mcs/class/System/System.Net/ChangeLog 2007-07-12 17:50:39 UTC (rev
81888)
+++ trunk/mcs/class/System/System.Net/ChangeLog 2007-07-12 18:04:35 UTC (rev
81889)
@@ -1,3 +1,9 @@
+2007-07-12 Geoff Norton <[EMAIL PROTECTED]>
+
+ * HttpListenerContext.cs:
+ * HttpListener.cs: Handle HttpListener AuthenticationSchemes
+ Only Basic authentication is included for now.
+
2007-06-30 Gert Driesen <[EMAIL PROTECTED]>
* NetworkAccess.cs: Only mark as flags enum on 2.0.
Modified: trunk/mcs/class/System/System.Net/HttpListener.cs
===================================================================
--- trunk/mcs/class/System/System.Net/HttpListener.cs 2007-07-12 17:50:39 UTC
(rev 81888)
+++ trunk/mcs/class/System/System.Net/HttpListener.cs 2007-07-12 18:04:35 UTC
(rev 81889)
@@ -217,7 +217,11 @@
wait_queue.RemoveAt (idx);
}
- return ares.GetContext (); // This will throw on error.
+ HttpListenerContext context = ares.GetContext ();
+ if (auth_schemes != AuthenticationSchemes.Anonymous) {
+ context.ParseAuthentication ();
+ }
+ return context; // This will throw on error.
}
public HttpListenerContext GetContext ()
Modified: trunk/mcs/class/System/System.Net/HttpListenerContext.cs
===================================================================
--- trunk/mcs/class/System/System.Net/HttpListenerContext.cs 2007-07-12
17:50:39 UTC (rev 81888)
+++ trunk/mcs/class/System/System.Net/HttpListenerContext.cs 2007-07-12
18:04:35 UTC (rev 81889)
@@ -78,6 +78,59 @@
public IPrincipal User {
get { return user; }
}
+
+ internal void ParseAuthentication () {
+ // TODO: Handle NTLM/Digest modes
+ string header = request.Headers ["Authorization"];
+
+ if (header == null || header.Length < 2)
+ return;
+
+ string [] authenticationData = header.Substring
(header.IndexOf (":")+1).Split (new char [] {' '});
+
+ if (string.Compare (authenticationData [0], "basic",
true) == 0) {
+ user = ParseBasicAuthentication
(authenticationData [1]);
+ }
+ }
+
+ internal IPrincipal ParseBasicAuthentication (string authData) {
+ try {
+ // Basic AUTH Data is a formatted Base64 String
+ string domain = null;
+ string user = null;
+ string password = null;
+ int pos = -1;
+ string authString =
System.Text.Encoding.Default.GetString (Convert.FromBase64String (authData));
+
+ // The format is DOMAIN\username:password
+ // Domain is optional
+
+ pos = authString.IndexOf (":");
+
+ // parse the password off the end
+ password = authString.Substring (pos+1);
+
+ // discard the password
+ authString = authString.Substring (0, pos);
+
+ // check if there is a domain
+ pos = authString.IndexOf ("\\");
+
+ if (pos > 0) {
+ domain = authString.Substring (0, pos);
+ user = authString.Substring (pos);
+ } else {
+ user = authString;
+ }
+
+ HttpListenerBasicIdentity identity = new
HttpListenerBasicIdentity (user, password);
+ // TODO: What are the roles MS sets
+ return new GenericPrincipal (identity, new
string [0]);
+ } catch (Exception) {
+ // Invalid auth data is swallowed silently
+ return null;
+ }
+ }
}
}
#endif
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches