private AmqpTransportListener CreateTransportListener()
        {
            TransportListener    transportListener;
            TcpTransportSettings tcpTransportSetting = new TcpTransportSettings();
            int port = this.ListenUri.Port;

            if (port <= 0)
            {
                port = 5672;
            }
            tcpTransportSetting.Host = this.ListenUri.Host;
            tcpTransportSetting.Port = port;
            if (!this.ListenUri.Scheme.Equals("amqps", StringComparison.OrdinalIgnoreCase))
            {
                transportListener = tcpTransportSetting.CreateListener();
            }
            else
            {
                TlsTransportProvider transportProvider = this.amqpSettings.GetTransportProvider <TlsTransportProvider>();
                if (transportProvider == null)
                {
                    throw Fx.Exception.Argument("TlsSecurityProvider", "Tls provider must be set.");
                }
                TlsTransportSettings tlsTransportSetting = new TlsTransportSettings(tcpTransportSetting, false)
                {
                    Certificate = transportProvider.Settings.Certificate
                };
                transportListener = tlsTransportSetting.CreateListener();
            }
            return(new AmqpTransportListener(new TransportListener[] { transportListener }, this.amqpSettings));
        }
Exemple #2
0
        public static AmqpSettings CreateAmqpSettings(
            Version amqpVersion,
            bool useSslStreamSecurity,
            bool hasTokenProvider,
            string sslHostName    = null,
            bool useWebSockets    = false,
            bool sslStreamUpgrade = false,
            System.Net.NetworkCredential networkCredential = null,
            System.Net.Security.RemoteCertificateValidationCallback certificateValidationCallback = null,
            bool forceTokenProvider = true)
        {
            AmqpSettings settings = new AmqpSettings();

            if (useSslStreamSecurity && !useWebSockets && sslStreamUpgrade)
            {
                var tlsSettings = new TlsTransportSettings
                {
                    CertificateValidationCallback = certificateValidationCallback,
                    TargetHost = sslHostName
                };

                var tlsProvider = new TlsTransportProvider(tlsSettings);
                tlsProvider.Versions.Add(new AmqpVersion(amqpVersion));
                settings.TransportProviders.Add(tlsProvider);
            }

            if (hasTokenProvider || networkCredential != null)
            {
                SaslTransportProvider saslProvider = new SaslTransportProvider();
                saslProvider.Versions.Add(new AmqpVersion(amqpVersion));
                settings.TransportProviders.Add(saslProvider);

                if (forceTokenProvider)
                {
                    saslProvider.AddHandler(new SaslAnonymousHandler(CbsSaslMechanismName));
                }
                else if (networkCredential != null)
                {
                    var plainHandler = new SaslPlainHandler
                    {
                        AuthenticationIdentity = networkCredential.UserName,
                        Password = networkCredential.Password
                    };
                    saslProvider.AddHandler(plainHandler);
                }
                else
                {
                    // old client behavior: keep it for validation only
                    saslProvider.AddHandler(new SaslExternalHandler());
                }
            }

            AmqpTransportProvider amqpProvider = new AmqpTransportProvider();

            amqpProvider.Versions.Add(new AmqpVersion(amqpVersion));
            settings.TransportProviders.Add(amqpProvider);

            return(settings);
        }
        public static AmqpSettings CreateAmqpSettings(
            Version amqpVersion,
            bool useSslStreamSecurity,
            string sslHostName    = null,
            bool useWebSockets    = false,
            bool sslStreamUpgrade = false,
            System.Net.NetworkCredential networkCredential = null)
        {
            var amqpSettings = new AmqpSettings();

            if (useSslStreamSecurity && !useWebSockets && sslStreamUpgrade)
            {
                var tlsSettings = new TlsTransportSettings
                {
                    TargetHost = sslHostName
                };

                var tlsProvider = new TlsTransportProvider(tlsSettings);
                tlsProvider.Versions.Add(new AmqpVersion(amqpVersion));
                amqpSettings.TransportProviders.Add(tlsProvider);
            }

            if (networkCredential != null)
            {
                var saslTransportProvider = new SaslTransportProvider();
                saslTransportProvider.Versions.Add(new AmqpVersion(amqpVersion));
                amqpSettings.TransportProviders.Add(saslTransportProvider);

                if (networkCredential != null)
                {
                    var plainHandler = new SaslPlainHandler
                    {
                        AuthenticationIdentity = networkCredential.UserName,
                        Password = networkCredential.Password
                    };
                    saslTransportProvider.AddHandler(plainHandler);
                }
            }

            var amqpTransportProvider = new AmqpTransportProvider();

            amqpTransportProvider.Versions.Add(new AmqpVersion(amqpVersion));
            amqpSettings.TransportProviders.Add(amqpTransportProvider);

            return(amqpSettings);
        }
Exemple #4
0
        public static AmqpSettings GetAmqpSettings(bool client, string sslValue, bool doSslUpgrade, params SaslHandler[] saslHandlers)
        {
            AmqpSettings settings = new AmqpSettings();

#if !WINDOWS_UWP
            if ((client && doSslUpgrade) || (!client && sslValue != null))
            {
                TlsTransportSettings tlsSettings = new TlsTransportSettings();
                if (client)
                {
                    tlsSettings.TargetHost = sslValue;
                    tlsSettings.CertificateValidationCallback = (s, c, h, e) => { return(true); };
                }
                else
                {
                    tlsSettings.IsInitiator = false;
                    tlsSettings.Certificate = GetCertificate(sslValue);;
                }

                TlsTransportProvider tlsProvider = new TlsTransportProvider(tlsSettings);
                tlsProvider.Versions.Add(new AmqpVersion(1, 0, 0));
                settings.TransportProviders.Add(tlsProvider);
            }
#endif

            if (saslHandlers != null && saslHandlers.Length >= 1 && saslHandlers[0] != null)
            {
                SaslTransportProvider saslProvider = new SaslTransportProvider();
                saslProvider.Versions.Add(new AmqpVersion(1, 0, 0));
                foreach (SaslHandler handler in saslHandlers)
                {
                    saslProvider.AddHandler(handler);
                }

                settings.TransportProviders.Add(saslProvider);
            }

            AmqpTransportProvider amqpProvider = new AmqpTransportProvider();
            amqpProvider.Versions.Add(new AmqpVersion(1, 0, 0));
            settings.TransportProviders.Add(amqpProvider);

            return(settings);
        }
Exemple #5
0
        public static AmqpSettings GetAmqpSettings(bool client, string sslValue, bool doSslUpgrade, params SaslHandler[] saslHandlers)
        {
            AmqpSettings settings = new AmqpSettings();
            if ((client && doSslUpgrade) || (!client && sslValue != null))
            {
                TlsTransportSettings tlsSettings = new TlsTransportSettings();
                if (client)
                {
                    tlsSettings.TargetHost = sslValue;
                    tlsSettings.CertificateValidationCallback = (s, c, h, e) => { return true; };
                }
                else
                {
                    tlsSettings.IsInitiator = false;
                    tlsSettings.Certificate = GetCertificate(sslValue); ;
                }

                TlsTransportProvider tlsProvider = new TlsTransportProvider(tlsSettings);
                tlsProvider.Versions.Add(new AmqpVersion(1, 0, 0));
                settings.TransportProviders.Add(tlsProvider);
            }

            if (saslHandlers != null && saslHandlers.Length >= 1 && saslHandlers[0] != null)
            {
                SaslTransportProvider saslProvider = new SaslTransportProvider();
                saslProvider.Versions.Add(new AmqpVersion(1, 0, 0));
                foreach (SaslHandler handler in saslHandlers)
                {
                    saslProvider.AddHandler(handler);
                }

                settings.TransportProviders.Add(saslProvider);
            }

            AmqpTransportProvider amqpProvider = new AmqpTransportProvider();
            amqpProvider.Versions.Add(new AmqpVersion(1, 0, 0));
            settings.TransportProviders.Add(amqpProvider);

            return settings;
        }
        internal AmqpSettings CreateAmqpSettings(string sslHostName)
        {
            AmqpSettings amqpSetting = new AmqpSettings();

            if (this.SslStreamUpgrade)
            {
                TlsTransportSettings tlsTransportSetting = new TlsTransportSettings()
                {
                    CertificateValidationCallback = this.CertificateValidationCallback,
                    TargetHost = sslHostName
                };
                TlsTransportProvider tlsTransportProvider = new TlsTransportProvider(tlsTransportSetting);
                tlsTransportProvider.Versions.Add(new Microsoft.ServiceBus.Messaging.Amqp.AmqpVersion(1, 0, 0));
                amqpSetting.TransportProviders.Add(tlsTransportProvider);
            }
            if (this.TokenProvider != null || this.NetworkCredential != null)
            {
                SaslTransportProvider saslTransportProvider = new SaslTransportProvider();
                saslTransportProvider.Versions.Add(new Microsoft.ServiceBus.Messaging.Amqp.AmqpVersion(1, 0, 0));
                amqpSetting.TransportProviders.Add(saslTransportProvider);
                if (this.NetworkCredential == null)
                {
                    saslTransportProvider.AddHandler(new SaslExternalHandler());
                }
                else
                {
                    SaslPlainHandler saslPlainHandler = new SaslPlainHandler()
                    {
                        AuthenticationIdentity = this.NetworkCredential.UserName,
                        Password = this.NetworkCredential.Password
                    };
                    saslTransportProvider.AddHandler(saslPlainHandler);
                }
            }
            AmqpTransportProvider amqpTransportProvider = new AmqpTransportProvider();

            amqpTransportProvider.Versions.Add(new Microsoft.ServiceBus.Messaging.Amqp.AmqpVersion(this.AmqpVersion));
            amqpSetting.TransportProviders.Add(amqpTransportProvider);
            return(amqpSetting);
        }
        protected ConnectionListener(
            Uri addressUri,
            AmqpSettings amqpSettings,
            AmqpConnectionSettings connectionSettings)
        {
            amqpSettings.ValidateListenerSettings();
            this.listenAddress      = addressUri;
            this.amqpSettings       = amqpSettings;
            this.connectionSettings = connectionSettings;
            this.onAcceptTransport  = this.OnAcceptTransport;

            TcpTransportSettings tcpSettings = new TcpTransportSettings();

            tcpSettings.SetEndPoint(addressUri.Host, addressUri.Port, true);
            TransportListener tpListener = null;

            if (addressUri.Scheme.Equals(AmqpConstants.SchemeAmqps, StringComparison.OrdinalIgnoreCase))
            {
                TlsTransportProvider tlsProvider = this.amqpSettings.GetTransportProvider <TlsTransportProvider>();
                if (tlsProvider == null)
                {
                    throw Fx.Exception.ArgumentNull("TlsSecurityProvider");
                }

                Fx.Assert(tlsProvider.Settings.Certificate != null, "Must have a valid certificate.");
                TlsTransportSettings tlsSettings = new TlsTransportSettings(tcpSettings, false);
                tlsSettings.Certificate = tlsProvider.Settings.Certificate;
                tpListener = tlsSettings.CreateListener();
            }
            else
            {
                tpListener = tcpSettings.CreateListener();
            }

            this.transportListener        = new AmqpTransportListener(new TransportListener[] { tpListener }, this.amqpSettings);
            this.onConnectionOpenComplete = new AsyncCallback(this.OnConnectionOpenComplete);
        }
Exemple #8
0
        /// <summary>
        /// Opens a connection to the specified address.
        /// </summary>
        /// <param name="addressUri">The address Uri. User info is ignored.</param>
        /// <param name="saslHandler">The SASL handler which determines the SASL mechanism. Null means no SASL handshake.</param>
        /// <param name="timeout">The operation timeout.</param>
        /// <returns>An AMQP connection.</returns>
        public async Task <AmqpConnection> OpenConnectionAsync(Uri addressUri, SaslHandler saslHandler, TimeSpan timeout)
        {
            TransportSettings transportSettings;

            if (addressUri.Scheme.Equals(AmqpConstants.SchemeAmqp, StringComparison.OrdinalIgnoreCase))
            {
                transportSettings = new TcpTransportSettings()
                {
                    Host = addressUri.Host,
                    Port = addressUri.Port > -1 ? addressUri.Port : AmqpConstants.DefaultPort
                };
            }
            else if (addressUri.Scheme.Equals(AmqpConstants.SchemeAmqps, StringComparison.OrdinalIgnoreCase))
            {
                TcpTransportSettings tcpSettings = new TcpTransportSettings()
                {
                    Host = addressUri.Host,
                    Port = addressUri.Port > -1 ? addressUri.Port : AmqpConstants.DefaultSecurePort
                };

                var tls = new TlsTransportSettings(tcpSettings)
                {
                    TargetHost = addressUri.Host
                };
                TlsTransportProvider tlsProvider = this.settings.GetTransportProvider <TlsTransportProvider>();
                if (tlsProvider != null)
                {
                    tls.CertificateValidationCallback = tlsProvider.Settings.CertificateValidationCallback;
                    tls.CheckCertificateRevocation    = tlsProvider.Settings.CheckCertificateRevocation;
                    tls.Certificate = tlsProvider.Settings.Certificate;
                    tls.Protocols   = tlsProvider.Settings.Protocols;
                }

                transportSettings = tls;
            }
            else if (addressUri.Scheme.Equals(WebSocketTransportSettings.WebSockets, StringComparison.OrdinalIgnoreCase) ||
                     addressUri.Scheme.Equals(WebSocketTransportSettings.SecureWebSockets, StringComparison.OrdinalIgnoreCase))
            {
                transportSettings = new WebSocketTransportSettings()
                {
                    Uri = addressUri
                };
            }
            else
            {
                throw new NotSupportedException(addressUri.Scheme);
            }

            AmqpSettings settings = this.settings.Clone();

            settings.TransportProviders.Clear();

            if (saslHandler != null)
            {
                // Provider for "AMQP3100"
                SaslTransportProvider saslProvider = new SaslTransportProvider(AmqpVersion.V100);
                saslProvider.AddHandler(saslHandler);
                settings.TransportProviders.Add(saslProvider);
            }

            // Provider for "AMQP0100"
            AmqpTransportProvider amqpProvider = new AmqpTransportProvider(AmqpVersion.V100);

            settings.TransportProviders.Add(amqpProvider);

            AmqpTransportInitiator initiator = new AmqpTransportInitiator(settings, transportSettings);
            TransportBase          transport = await Task.Factory.FromAsync(
                (c, s) => initiator.BeginConnect(timeout, c, s),
                (r) => initiator.EndConnect(r),
                null).ConfigureAwait(false);

            try
            {
                AmqpConnectionSettings connectionSettings = new AmqpConnectionSettings()
                {
                    ContainerId = Guid.NewGuid().ToString(),
                    HostName    = addressUri.Host
                };

                AmqpConnection connection = new AmqpConnection(transport, settings, connectionSettings);
                await connection.OpenAsync(timeout).ConfigureAwait(false);

                return(connection);
            }
            catch
            {
                transport.Abort();
                throw;
            }
        }