示例#1
0
        private void WriteSecurityHeader(TransportAsyncCallbackArgs args)
        {
            TransportProvider item = this.settings.TransportProviders[this.providerIndex];

            this.sentHeader = new ProtocolHeader(item.ProtocolId, item.DefaultVersion);
            ByteBuffer byteBuffer = new ByteBuffer(new byte[8]);

            this.sentHeader.Encode(byteBuffer);
            args.SetBuffer(byteBuffer.Buffer, byteBuffer.Offset, byteBuffer.Length);
            args.CompletedCallback = new Action <TransportAsyncCallbackArgs>(this.OnWriteHeaderComplete);
            this.writer.WriteBuffer(args);
        }
        void WriteSecurityHeader(TransportAsyncCallbackArgs args)
        {
            // secure transport: header negotiation
            TransportProvider provider = this.settings.TransportProviders[this.providerIndex];

            this.sentHeader = new ProtocolHeader(provider.ProtocolId, provider.DefaultVersion);
            Utils.Trace(TraceLevel.Info, "{0}: Sending header {1}", this, this.sentHeader);
            Utils.Trace(TraceLevel.Frame, "SEND  {0}", this.sentHeader);

            args.SetBuffer(this.sentHeader.Buffer);
            args.CompletedCallback = this.OnWriteHeaderComplete;
            this.writer.WriteBuffer(args);
        }
            void OnProtocolHeader(ByteBuffer buffer)
            {
                ProtocolHeader header = ProtocolHeader.Decode(buffer);
                Utils.Trace(TraceLevel.Info, "{0}: Received a protocol header {1}.", this, header);

                // Protocol id negotiation
                TransportProvider provider = null;
                if (!this.parent.settings.TryGetTransportProvider(header, out provider))
                {
                    Fx.Assert(provider != null, "At least on provider should be configured.");
                    this.WriteReplyHeader(new ProtocolHeader(provider.ProtocolId, provider.DefaultVersion), true);
                    return;
                }

                // Protocol version negotiation
                AmqpVersion version;
                if (!provider.TryGetVersion(header.Version, out version))
                {
                    this.WriteReplyHeader(new ProtocolHeader(provider.ProtocolId, version), true);
                    return;
                }

                TransportBase newTransport = provider.CreateTransport(this.args.Transport, false);
                if (object.ReferenceEquals(newTransport, this.args.Transport))
                {
                    if ((this.parent.settings.RequireSecureTransport && !newTransport.IsSecure) ||
                        (!this.parent.settings.AllowAnonymousConnection && !newTransport.IsAuthenticated))
                    {
                        Utils.Trace(TraceLevel.Warning, 
                            "{0}: Transport {1} does not meet the security requirement (isSecure:{2}, isAuthenticated:{3}).", 
                            this.parent, 
                            newTransport,
                            newTransport.IsSecure,
                            newTransport.IsAuthenticated);
                        this.WriteReplyHeader(this.parent.settings.GetDefaultHeader(), true);
                    }
                    else
                    {
                        this.args.UserToken = header;
                        this.parent.OnHandleTransportComplete(this.args);
                    }
                }
                else
                {
                    Utils.Trace(TraceLevel.Frame, "RECV  {0}", header);
                    Utils.Trace(TraceLevel.Verbose, "{0}: Upgrade transport {1} -> {2}.", this, this.args.Transport, newTransport);
                    this.args.Transport = newTransport;
                    this.WriteReplyHeader(header, false);
                }
            }
        void OnConnectComplete(TransportAsyncCallbackArgs args)
        {
            if (args.Exception != null)
            {
                this.Complete(args);
                return;
            }

            TransportProvider provider = this.settings.TransportProviders[this.providerIndex];

            if (provider.ProtocolId == ProtocolId.Amqp)
            {
                this.Complete(args);
                return;
            }

            Utils.Trace(TraceLevel.Info, "{0}: Connected. Start security negotiation...", this);
            this.writer = new AsyncIO.AsyncBufferWriter(args.Transport);
            this.reader = new AsyncIO.AsyncBufferReader(args.Transport);
            this.WriteSecurityHeader(args);
        }
示例#5
0
            private void OnProtocolHeader(ByteBuffer buffer)
            {
                AmqpVersion    amqpVersion;
                ProtocolHeader protocolHeader = new ProtocolHeader();

                protocolHeader.Decode(buffer);
                MessagingClientEtwProvider.TraceClient <AmqpTransportListener.TransportHandler, ProtocolHeader>((AmqpTransportListener.TransportHandler source, ProtocolHeader detail) => MessagingClientEtwProvider.Provider.EventWriteAmqpLogOperation(source, TraceOperation.Receive, detail), this, protocolHeader);
                TransportProvider transportProvider = null;

                if (!this.parent.settings.TryGetTransportProvider(protocolHeader, out transportProvider))
                {
                    this.WriteReplyHeader(new ProtocolHeader(transportProvider.ProtocolId, transportProvider.DefaultVersion), true);
                    return;
                }
                if (!transportProvider.TryGetVersion(protocolHeader.Version, out amqpVersion))
                {
                    this.WriteReplyHeader(new ProtocolHeader(transportProvider.ProtocolId, amqpVersion), true);
                    return;
                }
                TransportBase transportBase = transportProvider.CreateTransport(this.args.Transport, false);

                if (!object.ReferenceEquals(transportBase, this.args.Transport))
                {
                    MessagingClientEtwProvider.TraceClient <AmqpTransportListener.TransportHandler, TransportBase, TransportBase>((AmqpTransportListener.TransportHandler source, TransportBase from, TransportBase to) => MessagingClientEtwProvider.Provider.EventWriteAmqpUpgradeTransport(source, from, to), this, this.args.Transport, transportBase);
                    this.args.Transport = transportBase;
                    this.WriteReplyHeader(protocolHeader, false);
                    return;
                }
                if ((!this.parent.settings.RequireSecureTransport || transportBase.IsSecure) && (this.parent.settings.AllowAnonymousConnection || transportBase.IsAuthenticated))
                {
                    this.args.UserToken = protocolHeader;
                    this.parent.OnHandleTransportComplete(this.args);
                    return;
                }
                MessagingClientEtwProvider.TraceClient <AmqpTransportListener, TransportBase>((AmqpTransportListener source, TransportBase transport) => MessagingClientEtwProvider.Provider.EventWriteAmqpInsecureTransport(source, transport, transport.IsSecure, transport.IsAuthenticated), this.parent, transportBase);
                this.WriteReplyHeader(this.parent.settings.GetDefaultHeader(), true);
            }