Merge pull request #747 from spicypixel/hotfix/object-disable-com
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel / BasicHttpBinding.cs
index 88976fc100454ca422fe0a6e5d5f29b018a9787e..4feebc7a115d7a98ceb6ef70cefc67d83f62c679 100644 (file)
@@ -1,10 +1,14 @@
 //
 // BasicHttpBinding.cs
 //
+// See BasicHttpBinding_4_5.cs and HttpBindingBase.cs for the .NET 4.5
+// version of this class.
+//
 // Author:
 //     Atsushi Enomoto <atsushi@ximian.com>
 //
 // Copyright (C) 2005-2006 Novell, Inc.  http://www.novell.com
+// Copyright 2011 Xamarin Inc (http://www.xamarin.com).
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
+#if !NET_4_5 && !MOBILE
 using System;
 using System.Collections.Generic;
+using System.Net;
 using System.Net.Security;
 using System.ServiceModel.Channels;
 using System.ServiceModel.Description;
@@ -51,7 +57,8 @@ namespace System.ServiceModel
                XmlDictionaryReaderQuotas reader_quotas
                        = new XmlDictionaryReaderQuotas ();
                EnvelopeVersion env_version = EnvelopeVersion.Soap11;
-               Encoding text_encoding = new UTF8Encoding ();
+               static readonly Encoding default_text_encoding = new UTF8Encoding ();
+               Encoding text_encoding = default_text_encoding;
                TransferMode transfer_mode
                         = TransferMode.Buffered;
                bool use_default_web_proxy = true;
@@ -90,6 +97,18 @@ namespace System.ServiceModel
                        set { bypass_proxy_on_local = value; }
                }
 
+#if NET_2_1
+               public bool EnableHttpCookieContainer {
+                       get; set;
+               }
+#elif NET_4_5
+               [Obsolete ("Use AllowCookies.")]
+               public bool EnableHttpCookieContainer {
+                       get { return AllowCookies; }
+                       set { AllowCookies = value; }
+               }
+#endif
+
                public HostNameComparisonMode HostNameComparisonMode {
                        get { return host_name_comparison_mode; }
                        set { host_name_comparison_mode = value; }
@@ -157,6 +176,10 @@ namespace System.ServiceModel
                        get { return env_version; }
                }
 
+               internal static Encoding DefaultTextEncoding {
+                       get { return default_text_encoding; }
+               }
+               
                public Encoding TextEncoding {
                        get { return text_encoding; }
                        set { text_encoding = value; }
@@ -175,24 +198,52 @@ namespace System.ServiceModel
                public override BindingElementCollection
                        CreateBindingElements ()
                {
+                       var list = new List<BindingElement> ();
+                       
+                       var security = CreateSecurityBindingElement ();
+                       if (security != null)
+                               list.Add (security);
+
+#if NET_2_1
+                       if (EnableHttpCookieContainer)
+                               list.Add (new HttpCookieContainerBindingElement ());
+#endif
+
+                       list.Add (BuildMessageEncodingBindingElement ());
+                       list.Add (GetTransport ());
+
+                       return new BindingElementCollection (list.ToArray ());
+               }
+               
+               SecurityBindingElement CreateSecurityBindingElement () 
+               {
+            SecurityBindingElement element;
                        switch (Security.Mode) {
 #if !NET_2_1
                        case BasicHttpSecurityMode.Message:
-                       case BasicHttpSecurityMode.TransportWithMessageCredential:
                                if (Security.Message.ClientCredentialType != BasicHttpMessageCredentialType.Certificate)
                                        throw new InvalidOperationException ("When Message security is enabled in a BasicHttpBinding, the message security credential type must be BasicHttpMessageCredentialType.Certificate.");
-                               return new BindingElementCollection (new BindingElement [] {
+                               element = SecurityBindingElement.CreateMutualCertificateBindingElement (
+                                   MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10);
+                               break;
+
+                       case BasicHttpSecurityMode.TransportWithMessageCredential:
+                               if (Security.Message.ClientCredentialType != BasicHttpMessageCredentialType.Certificate)
                                        // FIXME: pass proper security token parameters.
-                                       new AsymmetricSecurityBindingElement (),
-                                       BuildMessageEncodingBindingElement (),
-                                       GetTransport ()});
+                                       element = SecurityBindingElement.CreateCertificateOverTransportBindingElement ();
+                               else
+                                       element = new AsymmetricSecurityBindingElement ();
+                               break;
 #endif
-                       default:
-                               return new BindingElementCollection (new BindingElement [] {
-                                       BuildMessageEncodingBindingElement (),
-                                       GetTransport ()});
+                       default: 
+                               return null;
                        }
 
+#if !NET_2_1
+                       element.SetKeyDerivation (false);
+                       element.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
+#endif
+                       return element;
                }
 
                MessageEncodingBindingElement BuildMessageEncodingBindingElement ()
@@ -200,7 +251,9 @@ namespace System.ServiceModel
                        if (MessageEncoding == WSMessageEncoding.Text) {
                                TextMessageEncodingBindingElement tm = new TextMessageEncodingBindingElement (
                                        MessageVersion.CreateVersion (EnvelopeVersion, AddressingVersion.None), TextEncoding);
+#if !NET_2_1
                                ReaderQuotas.CopyTo (tm.ReaderQuotas);
+#endif
                                return tm;
                        }
                        else
@@ -214,30 +267,57 @@ namespace System.ServiceModel
 
                TransportBindingElement GetTransport ()
                {
-                       HttpTransportBindingElement transportBindingElement;
+                       HttpTransportBindingElement h;
                        switch (Security.Mode) {
                        case BasicHttpSecurityMode.Transport:
                        case BasicHttpSecurityMode.TransportWithMessageCredential:
-                               transportBindingElement
-                                       = new HttpsTransportBindingElement ();
+                               h = new HttpsTransportBindingElement ();
                                break;
                        default:
-                               transportBindingElement
-                                       = new HttpTransportBindingElement ();
+                               h = new HttpTransportBindingElement ();
                                break;
                        }
 
-                       transportBindingElement.AllowCookies = AllowCookies;
-                       transportBindingElement.BypassProxyOnLocal = BypassProxyOnLocal;
-                       transportBindingElement.HostNameComparisonMode = HostNameComparisonMode;
-                       transportBindingElement.MaxBufferPoolSize = MaxBufferPoolSize;
-                       transportBindingElement.MaxBufferSize = MaxBufferSize;
-                       transportBindingElement.MaxReceivedMessageSize = MaxReceivedMessageSize;
-                       transportBindingElement.ProxyAddress = ProxyAddress;
-                       transportBindingElement.UseDefaultWebProxy = UseDefaultWebProxy;
-                       transportBindingElement.TransferMode = TransferMode;
+                       h.AllowCookies = AllowCookies;
+                       h.BypassProxyOnLocal = BypassProxyOnLocal;
+                       h.HostNameComparisonMode = HostNameComparisonMode;
+                       h.MaxBufferPoolSize = MaxBufferPoolSize;
+                       h.MaxBufferSize = MaxBufferSize;
+                       h.MaxReceivedMessageSize = MaxReceivedMessageSize;
+                       h.ProxyAddress = ProxyAddress;
+                       h.UseDefaultWebProxy = UseDefaultWebProxy;
+                       h.TransferMode = TransferMode;
+#if NET_4_0
+                       h.ExtendedProtectionPolicy = Security.Transport.ExtendedProtectionPolicy;
+#endif
 
-                       return transportBindingElement;
+#if !NET_2_1 || MOBILE
+                       switch (Security.Transport.ClientCredentialType) {
+                       case HttpClientCredentialType.Basic:
+                               h.AuthenticationScheme = AuthenticationSchemes.Basic;
+                               break;
+                       case HttpClientCredentialType.Ntlm:
+                               h.AuthenticationScheme = AuthenticationSchemes.Ntlm;
+                               break;
+                       case HttpClientCredentialType.Windows:
+                               h.AuthenticationScheme = AuthenticationSchemes.Negotiate;
+                               break;
+                       case HttpClientCredentialType.Digest:
+                               h.AuthenticationScheme = AuthenticationSchemes.Digest;
+                               break;
+                       case HttpClientCredentialType.Certificate:
+                               switch (Security.Mode) {
+                               case BasicHttpSecurityMode.Transport:
+                                       (h as HttpsTransportBindingElement).RequireClientCertificate = true;
+                                       break;
+                               case BasicHttpSecurityMode.TransportCredentialOnly:
+                                       throw new InvalidOperationException ("Certificate-based client authentication is not supported by 'TransportCredentialOnly' mode.");
+                               }
+                               break;
+                       }
+#endif
+
+                       return h;
                }
 
                // explicit interface implementations
@@ -247,3 +327,4 @@ namespace System.ServiceModel
                }
        }
 }
+#endif