[Mono.Security]: Minor 'Mono.Security.Interface' API improvements.
authorMartin Baulig <martin.baulig@xamarin.com>
Fri, 20 Nov 2015 18:27:55 +0000 (13:27 -0500)
committerMartin Baulig <martin.baulig@xamarin.com>
Tue, 24 Nov 2015 20:15:28 +0000 (15:15 -0500)
* MonoTlsSettings: Add static 'DefaultSettings' and CopyDefaultSettings().

* MonoTlsProvider: Add 'ID' and 'Name' properties.

(cherry picked from commit 51226c86f9f402e7bf09aefeeac7c24ca52bfdbd)

mcs/class/Mono.Security.Providers.DotNet/Mono.Security.Providers.DotNet/DotNetTlsProvider.cs
mcs/class/Mono.Security.Providers.OldTls/Mono.Security.Providers.OldTls/OldTlsProvider.cs
mcs/class/Mono.Security/Mono.Security.Interface/MonoTlsProvider.cs
mcs/class/Mono.Security/Mono.Security.Interface/MonoTlsSettings.cs
mcs/class/System/Mono.Net.Security/ChainValidationHelper.cs
mcs/class/System/Mono.Net.Security/MonoDefaultTlsProvider.cs
mcs/class/System/Mono.Net.Security/MonoTlsStream.cs
mcs/class/System/System.Net.Mail/SmtpClient.cs
mcs/class/System/System.Net.Security/SslStream.cs
mcs/class/System/System.Net/FtpWebRequest.cs
mcs/class/System/System.Net/HttpListener.cs

index 855edfee8921ec63ff431326216166dcd3a817bf..c5a3fdff3598fa51a5bbf25e5f6656820625457f 100644 (file)
@@ -40,6 +40,16 @@ namespace Mono.Security.Providers.DotNet
         */
        public class DotNetTlsProvider : MonoTlsProvider
        {
+               static readonly Guid id = new Guid ("3a7b3a26-0dbd-4572-a5b8-fdce766bf0dd");
+
+               public override Guid ID {
+                       get { return id; }
+               }
+
+               public override string Name {
+                       get { return "dotnet"; }
+               }
+
                public override bool SupportsSslStream {
                        get { return true; }
                }
index 5754f4fd87d8b876f18b5a6efe9948de8a20d8c3..60568caea5ffb1001024507d26a76d86cccfed5a 100644 (file)
@@ -36,6 +36,16 @@ namespace Mono.Security.Providers.OldTls
 {
        public class OldTlsProvider : MonoTlsProvider
        {
+               static readonly Guid id = new Guid ("cf8baa0d-c6ed-40ae-b512-dec8d097e9af");
+
+               public override Guid ID {
+                       get { return id; }
+               }
+
+               public override string Name {
+                       get { return "old"; }
+               }
+
                public override bool SupportsSslStream {
                        get { return true; }
                }
index dc81e862f2f07690e90e5cc01af83cbf38bc2f27..e7418a5875049de7fae2bfb9232d0477c6a5ad09 100644 (file)
@@ -72,6 +72,14 @@ namespace Mono.Security.Interface
 
        public abstract class MonoTlsProvider
        {
+               public abstract Guid ID {
+                       get;
+               }
+
+               public abstract string Name {
+                       get;
+               }
+
 #region SslStream
 
                /*
index 802f78f0aa13f7234187b62875f61f8f88713c1c..afa21ff1debc4216ecd6357afe1c71e72e9706cf 100644 (file)
@@ -24,6 +24,7 @@
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 // THE SOFTWARE.
 using System;
+using System.Threading;
 using System.Security.Cryptography.X509Certificates;
 
 namespace Mono.Security.Interface
@@ -93,6 +94,24 @@ namespace Mono.Security.Interface
                {
                }
 
+               volatile static MonoTlsSettings defaultSettings;
+
+               public static MonoTlsSettings DefaultSettings {
+                       get {
+                               if (defaultSettings == null)
+                                       Interlocked.CompareExchange (ref defaultSettings, new MonoTlsSettings (), null);
+                               return defaultSettings;
+                       }
+                       set {
+                               defaultSettings = value ?? new MonoTlsSettings ();
+                       }
+               }
+
+               public static MonoTlsSettings CopyDefaultSettings ()
+               {
+                       return DefaultSettings.Clone ();
+               }
+
                #region Private APIs
 
                /*
@@ -120,6 +139,11 @@ namespace Mono.Security.Interface
                        return copy;
                }
 
+               public MonoTlsSettings Clone ()
+               {
+                       return new MonoTlsSettings (this);
+               }
+
                MonoTlsSettings (MonoTlsSettings other)
                {
                        RemoteCertificateValidationCallback = other.RemoteCertificateValidationCallback;
index 07ae6816a4c41ab0c6ee866b178f3cabcff4bb3b..1f37bc47589c7cebf77d7b621cd499d095f0c3db 100644 (file)
@@ -156,8 +156,11 @@ namespace Mono.Net.Security
                        tlsStream = other.tlsStream;
                        request = other.request;
 
+                       if (settings == null)
+                               settings = MonoTlsSettings.DefaultSettings;
+
                        this.provider = provider;
-                       this.settings = settings = settings.CloneWithValidator (this);
+                       this.settings = settings.CloneWithValidator (this);
                        this.callbackWrapper = callbackWrapper;
                }
 
index 8fd50fd1a3e6378edefcb01fe93453e1e638f4f5..4051b1502dcf6bf0dfa8211614a82652040ee588 100644 (file)
@@ -60,6 +60,16 @@ namespace Mono.Net.Security.Private
         */
        class MonoDefaultTlsProvider : MonoTlsProviderImpl
        {
+               static readonly Guid id = new Guid ("809e77d5-56cc-4da8-b9f0-45e65ba9cceb");
+
+               public override Guid ID {
+                       get { return id; }
+               }
+
+               public override string Name {
+                       get { return "legacy"; }
+               }
+
                public MonoTlsProvider Provider {
                        get { return this; }
                }
index f10f99f5176366a0080eadf401426b9f3171b335..db6e66ca283313a5d06000cd4e2c0a6039f5c1b7 100644 (file)
@@ -95,9 +95,6 @@ namespace Mono.Net.Security
                        provider = request.TlsProvider ?? MonoTlsProviderFactory.GetProviderInternal ();
                        status = WebExceptionStatus.SecureChannelFailure;
 
-                       if (settings == null)
-                               settings = new MonoTlsSettings ();
-
                        validationHelper = ChainValidationHelper.Create (provider.Provider, ref settings, this);
                }
 
index f4376a2ac3cdf260f2134024cdbffe30965516ec..69fd3480999bf05ccbbc20a14f5290043c7626d6 100644 (file)
@@ -1161,7 +1161,7 @@ try {
 
 #if SECURITY_DEP
                        var tlsProvider = MonoTlsProviderFactory.GetProviderInternal ();
-                       var settings = new MSI.MonoTlsSettings ();
+                       var settings = MSI.MonoTlsSettings.CopyDefaultSettings ();
                        settings.UseServicePointManagerCallback = true;
                        var sslStream = tlsProvider.CreateSslStream (stream, false, settings);
                        CheckCancellation ();
index 67266618aaee535695f55b1b66d48d954d725a80..e897044f2d42a2fae0a0c20517922486920e9bb9 100644 (file)
@@ -85,6 +85,7 @@ namespace System.Net.Security
 
        public class SslStream : AuthenticatedStream, MNS.IMonoSslStream
        {
+               MonoTlsProvider provider;
                MonoSslStream impl;
 
                internal MonoSslStream Impl {
@@ -94,6 +95,13 @@ namespace System.Net.Security
                        }
                }
 
+               internal MonoTlsProvider Provider {
+                       get {
+                               CheckDisposed ();
+                               return provider;
+                       }
+               }
+
                static MonoTlsProvider GetProvider ()
                {
                        return MonoTlsProviderFactory.GetDefaultProvider ();
@@ -107,7 +115,7 @@ namespace System.Net.Security
                public SslStream (Stream innerStream, bool leaveInnerStreamOpen)
                        : base (innerStream, leaveInnerStreamOpen)
                {
-                       var provider = GetProvider ();
+                       provider = GetProvider ();
                        impl = provider.CreateSslStream (innerStream, leaveInnerStreamOpen);
                }
 
@@ -119,8 +127,8 @@ namespace System.Net.Security
                public SslStream (Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback, LocalCertificateSelectionCallback userCertificateSelectionCallback)
                        : base (innerStream, leaveInnerStreamOpen)
                {
-                       var provider = GetProvider ();
-                       var settings = new MonoTlsSettings ();
+                       provider = GetProvider ();
+                       var settings = MonoTlsSettings.CopyDefaultSettings ();
                        settings.RemoteCertificateValidationCallback = MNS.Private.CallbackHelpers.PublicToMono (userCertificateValidationCallback);
                        settings.ClientCertificateSelectionCallback = MNS.Private.CallbackHelpers.PublicToMono (userCertificateSelectionCallback);
                        impl = provider.CreateSslStream (innerStream, leaveInnerStreamOpen, settings);
index bb900979a48ff614732e30717f06f15925b1981f..1fbf80dc7ce4473a80518b3a7d07a146a956a538 100644 (file)
@@ -1168,7 +1168,7 @@ namespace System.Net
                internal bool ChangeToSSLSocket (ref Stream stream) {
 #if SECURITY_DEP
                        var provider = MonoTlsProviderFactory.GetProviderInternal ();
-                       var settings = new MSI.MonoTlsSettings ();
+                       var settings = MSI.MonoTlsSettings.CopyDefaultSettings ();
                        settings.UseServicePointManagerCallback = true;
                        var sslStream = provider.CreateSslStream (stream, true, settings);
                        sslStream.AuthenticateAsClient (requestUri.Host, null, SslProtocols.Default, false);
index 15580d3b70514fb650dff0c92f64886a4379a72a..29afc0fd84b78ceca4e33b0dfe9efa2b4f9767fd 100644 (file)
@@ -122,7 +122,7 @@ namespace System.Net {
                                if (tlsProvider == null)
                                        tlsProvider = MonoTlsProviderFactory.GetProviderInternal ();
                                if (tlsSettings == null)
-                                       tlsSettings = new MSI.MonoTlsSettings ();
+                                       tlsSettings = MSI.MonoTlsSettings.CopyDefaultSettings ();
                                if (tlsSettings.RemoteCertificateValidationCallback == null)
                                        tlsSettings.RemoteCertificateValidationCallback = callback;
                                return tlsProvider.CreateSslStream (innerStream, ownsStream, tlsSettings);