Merge pull request #495 from nicolas-raoul/fix-for-issue2907-with-no-formatting-changes
[mono.git] / mcs / class / System / Mono.Http / NtlmClient.cs
index a2c1ec1477a8abe03f8001774ba054479f98ead2..f1b678827f2364df9b50f190738eb3d53bef26d0 100644 (file)
@@ -59,12 +59,24 @@ namespace Mono.Http
                        string password = cred.Password;
                        if (userName == null || userName == "")
                                return null;
-                       domain = domain != null && domain.Length > 0 ? domain : request.Headers ["Host"];
+
+                       if (String.IsNullOrEmpty (domain)) {
+                               int idx = userName.IndexOf ('\\');
+                               if (idx == -1) {
+                                       idx = userName.IndexOf ('/');
+                               }
+                               if (idx >= 0) {
+                                       domain = userName.Substring (0, idx);
+                                       userName = userName.Substring (idx + 1);
+                               }
+                       }
 
                        bool completed = false;
                        if (message == null) {
                                Type1Message type1 = new Type1Message ();
                                type1.Domain = domain;
+                               type1.Host = ""; // MS does not send it
+                               type1.Flags |= NtlmFlags.NegotiateNtlm2Key;
                                message = type1;
                        } else if (message.Type == 1) {
                                // Should I check the credentials?
@@ -77,10 +89,8 @@ namespace Mono.Http
                                if (password == null)
                                        password = "";
 
-                               Type3Message type3 = new Type3Message ();
-                               type3.Domain = domain;
+                               Type3Message type3 = new Type3Message (type2);
                                type3.Username = userName;
-                               type3.Challenge = type2.Nonce;
                                type3.Password = password;
                                message = type3;
                                completed = true;
@@ -90,6 +100,7 @@ namespace Mono.Http
                                if (challenge == null || challenge == String.Empty) {
                                        Type1Message type1 = new Type1Message ();
                                        type1.Domain = domain;
+                                       type1.Host = ""; // MS does not send it
                                        message = type1;
                                } else {
                                        completed = true;
@@ -101,7 +112,7 @@ namespace Mono.Http
                }
        }
 
-       public class NtlmClient : IAuthenticationModule
+       class NtlmClient : IAuthenticationModule
        {
                static Hashtable cache;
 
@@ -134,10 +145,10 @@ namespace Mono.Http
                                return null;
 
                        lock (cache) {
-                               NtlmSession ds = (NtlmSession) cache [request.RequestUri];
+                               NtlmSession ds = (NtlmSession) cache [request];
                                if (ds == null) {
                                        ds = new NtlmSession ();
-                                       cache.Add (request.RequestUri, ds);
+                                       cache.Add (request, ds);
                                }
 
                                return ds.Authenticate (header, webRequest, credentials);