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

Reply via email to