Beispiel #1
0
        public string SelectOperation(ref Message message)
        {
            string action = message.Headers.Action;
            string str2   = null;

            byte[] defaultId             = PeerNodeImplementation.DefaultId;
            string str3                  = PeerStrings.FindAction(action);
            Uri    via                   = null;
            Uri    uri2                  = null;
            bool   flag                  = false;
            PeerMessageProperty property = new PeerMessageProperty();

            if (str3 != null)
            {
                return(str3);
            }
            try
            {
                str2 = PeerMessageHelpers.GetHeaderString(message.Headers, "FloodMessage", "http://schemas.microsoft.com/net/2006/05/peer");
                via  = PeerMessageHelpers.GetHeaderUri(message.Headers, "PeerVia", "http://schemas.microsoft.com/net/2006/05/peer");
                uri2 = PeerMessageHelpers.GetHeaderUri(message.Headers, "PeerTo", "http://schemas.microsoft.com/net/2006/05/peer");
            }
            catch (MessageHeaderException exception)
            {
                System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Warning);
                return("Fault");
            }
            catch (SerializationException exception2)
            {
                System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception2, TraceEventType.Warning);
                return("Fault");
            }
            catch (XmlException exception3)
            {
                System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception3, TraceEventType.Warning);
                return("Fault");
            }
            property.PeerVia = via;
            property.PeerTo  = uri2;
            message.Properties.Add("PeerProperty", property);
            if (!(str2 == "PeerFlooder"))
            {
                return(null);
            }
            try
            {
                if (!this.messageHandler.ValidateIncomingMessage(ref message, via))
                {
                    property.SkipLocalChannels = true;
                    flag = true;
                    TurnOffSecurityHeader(message);
                }
                if (this.messageHandler.IsNotSeenBefore(message, out defaultId, out property.CacheMiss))
                {
                    property.MessageVerified = true;
                }
                else if (!flag)
                {
                    property.SkipLocalChannels = true;
                }
                if (defaultId == PeerNodeImplementation.DefaultId)
                {
                    return("Fault");
                }
            }
            catch (MessageHeaderException exception4)
            {
                System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception4, TraceEventType.Warning);
                return("Fault");
            }
            catch (SerializationException exception5)
            {
                System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception5, TraceEventType.Warning);
                return("Fault");
            }
            catch (XmlException exception6)
            {
                System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception6, TraceEventType.Warning);
                return("Fault");
            }
            catch (MessageSecurityException exception7)
            {
                if (!exception7.ReplayDetected)
                {
                    return("Fault");
                }
                System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception7, TraceEventType.Information);
            }
            return("FloodMessage");
        }
        public virtual IAsyncResult OnFloodedMessage(IPeerNeighbor neighbor, TFloodContract floodInfo, AsyncCallback callback, object state)
        {
            bool                useful        = false;
            MessageBuffer       messageBuffer = null;
            Message             message       = null;
            int                 index         = 0;
            ulong               maxValue      = ulong.MaxValue;
            MessageHeader       hopHeader     = null;
            bool                flag2         = false;
            PeerMessageProperty property      = null;
            IAsyncResult        result        = null;

            try
            {
                property = (PeerMessageProperty)floodInfo.Properties["PeerProperty"];
                if (!property.MessageVerified)
                {
                    if (property.CacheMiss > 2)
                    {
                        UtilityExtension.ReportCacheMiss(neighbor, property.CacheMiss);
                    }
                    result = new CompletedAsyncResult(callback, state);
                }
                else
                {
                    useful        = true;
                    messageBuffer = floodInfo.CreateBufferedCopy((int)this.config.MaxReceivedMessageSize);
                    message       = messageBuffer.CreateMessage();
                    Uri peerVia = property.PeerVia;
                    Uri peerTo  = property.PeerTo;
                    message.Headers.To = message.Properties.Via = peerVia;
                    index = this.UpdateHopCount(message, out hopHeader, out maxValue);
                    PeerMessagePropagation localAndRemote = PeerMessagePropagation.LocalAndRemote;
                    if (property.SkipLocalChannels)
                    {
                        localAndRemote = PeerMessagePropagation.Remote;
                    }
                    else if (this.messageHandler.HasMessagePropagation)
                    {
                        using (Message message2 = messageBuffer.CreateMessage())
                        {
                            localAndRemote = this.messageHandler.DetermineMessagePropagation(message2, PeerMessageOrigination.Remote);
                        }
                    }
                    if (((localAndRemote & PeerMessagePropagation.Remote) != PeerMessagePropagation.None) && (maxValue == 0L))
                    {
                        localAndRemote &= ~PeerMessagePropagation.Remote;
                    }
                    if ((localAndRemote & PeerMessagePropagation.Remote) != PeerMessagePropagation.None)
                    {
                        result = this.BeginFloodReceivedMessage(neighbor, messageBuffer, PeerTransportConstants.ForwardTimeout, callback, state, index, hopHeader);
                    }
                    else
                    {
                        result = new CompletedAsyncResult(callback, state);
                    }
                    if ((localAndRemote & PeerMessagePropagation.Local) != PeerMessagePropagation.None)
                    {
                        this.messageHandler.HandleIncomingMessage(messageBuffer, localAndRemote, index, hopHeader, peerVia, peerTo);
                    }
                }
                UtilityExtension.UpdateLinkUtility(neighbor, useful);
            }
            catch (Exception exception)
            {
                if (Fx.IsFatal(exception))
                {
                    flag2 = true;
                    throw;
                }
                if (PeerFlooderBase <TFloodContract, TLinkContract> .CloseNeighborIfKnownException(this.neighborManager, exception, neighbor) != null)
                {
                    throw;
                }
                System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Information);
            }
            finally
            {
                if (!flag2)
                {
                    if (message != null)
                    {
                        message.Close();
                    }
                    if (messageBuffer != null)
                    {
                        messageBuffer.Close();
                    }
                }
            }
            return(result);
        }
Beispiel #3
0
        public virtual IAsyncResult OnFloodedMessage(IPeerNeighbor neighbor, TFloodContract floodInfo, AsyncCallback callback, object state)
        {
            bool                process       = false;
            MessageBuffer       messageBuffer = null;
            Message             message       = null;
            Uri                 via;
            Uri                 to;
            int                 index         = 0;
            ulong               remainingHops = PeerTransportConstants.MaxHopCount;
            MessageHeader       hopHeader     = null;
            bool                fatal         = false;
            PeerMessageProperty peerProperty  = null;
            IAsyncResult        result        = null;

            try
            {
                peerProperty = (PeerMessageProperty)floodInfo.Properties[PeerStrings.PeerProperty];
                if (!peerProperty.MessageVerified)
                {
                    if (peerProperty.CacheMiss > UtilityExtension.AcceptableMissDistance)
                    {
                        UtilityExtension.ReportCacheMiss(neighbor, peerProperty.CacheMiss);
                    }
                    result = new CompletedAsyncResult(callback, state);
                }
                else
                {
                    process            = true;
                    messageBuffer      = floodInfo.CreateBufferedCopy((int)this.config.MaxReceivedMessageSize);
                    message            = messageBuffer.CreateMessage();
                    via                = peerProperty.PeerVia;
                    to                 = peerProperty.PeerTo;
                    message.Headers.To = message.Properties.Via = via;

                    index = UpdateHopCount(message, out hopHeader, out remainingHops);

                    PeerMessagePropagation propagateFlags = PeerMessagePropagation.LocalAndRemote;
                    if (peerProperty.SkipLocalChannels)
                    {
                        propagateFlags = PeerMessagePropagation.Remote;
                    }
                    else if (messageHandler.HasMessagePropagation)
                    {
                        using (Message filterMessage = messageBuffer.CreateMessage())
                        {
                            propagateFlags = messageHandler.DetermineMessagePropagation(filterMessage, PeerMessageOrigination.Remote);
                        }
                    }

                    if ((propagateFlags & PeerMessagePropagation.Remote) != 0)
                    {
                        if (remainingHops == 0)
                        {
                            propagateFlags &= ~PeerMessagePropagation.Remote;
                        }
                    }
                    if ((propagateFlags & PeerMessagePropagation.Remote) != 0)
                    {
                        result = BeginFloodReceivedMessage(neighbor, messageBuffer, PeerTransportConstants.ForwardTimeout, callback, state, index, hopHeader);
                    }
                    else
                    {
                        result = new CompletedAsyncResult(callback, state);
                    }
                    if ((propagateFlags & PeerMessagePropagation.Local) != 0)
                    {
                        messageHandler.HandleIncomingMessage(messageBuffer, propagateFlags, index, hopHeader, via, to);
                    }
                }
                UtilityExtension.UpdateLinkUtility(neighbor, process);
            }
            catch (Exception e)
            {
                if (Fx.IsFatal(e))
                {
                    fatal = true;
                    throw;
                }
                if (null != CloseNeighborIfKnownException(neighborManager, e, neighbor))
                {
                    throw;
                }
                DiagnosticUtility.TraceHandledException(e, TraceEventType.Information);
            }
            finally
            {
                if (!fatal)
                {
                    if (message != null)
                    {
                        message.Close();
                    }
                    if (messageBuffer != null)
                    {
                        messageBuffer.Close();
                    }
                }
            }
            return(result);
        }
        public string SelectOperation(ref Message message)
        {
            string action = message.Headers.Action;
            string demux  = null;

            byte[] id        = PeerNodeImplementation.DefaultId;
            string operation = PeerStrings.FindAction(action);
            Uri    via       = null;
            Uri    to        = null;
            bool   skipped   = false;
            PeerMessageProperty peerProperty = new PeerMessageProperty();

            if (operation != null)
            {
                return(operation);
            }
            try
            {
                demux = PeerMessageHelpers.GetHeaderString(message.Headers, PeerOperationNames.Flood, PeerStrings.Namespace);
                via   = PeerMessageHelpers.GetHeaderUri(message.Headers, PeerStrings.Via, PeerStrings.Namespace);
                to    = PeerMessageHelpers.GetHeaderUri(message.Headers, PeerOperationNames.PeerTo, PeerStrings.Namespace);
            }
            catch (MessageHeaderException e)
            {
                DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                return(PeerOperationNames.Fault);
            }
            catch (SerializationException e)
            {
                DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                return(PeerOperationNames.Fault);
            }
            catch (XmlException e)
            {
                DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                return(PeerOperationNames.Fault);
            }
            peerProperty.PeerVia = via;
            peerProperty.PeerTo  = to;
            message.Properties.Add(PeerStrings.PeerProperty, peerProperty);
            if (demux == PeerOperationNames.Demuxer)
            {
                try
                {
                    if (!this.messageHandler.ValidateIncomingMessage(ref message, via))
                    {
                        peerProperty.SkipLocalChannels = true;
                        skipped = true;
                        TurnOffSecurityHeader(message);
                    }
                    if (this.messageHandler.IsNotSeenBefore(message, out id, out peerProperty.CacheMiss))
                    {
                        peerProperty.MessageVerified = true;
                    }
                    else
                    {
                        if (!skipped)
                        {
                            peerProperty.SkipLocalChannels = true;
                        }
                    }
                    //means that the message doesnt contain legal id
                    if (id == PeerNodeImplementation.DefaultId)
                    {
                        return(PeerOperationNames.Fault);
                    }
                }
                catch (MessageHeaderException e)
                {
                    DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                    return(PeerOperationNames.Fault);
                }
                catch (SerializationException e)
                {
                    DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                    return(PeerOperationNames.Fault);
                }
                catch (XmlException e)
                {
                    DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                    return(PeerOperationNames.Fault);
                }
                catch (MessageSecurityException e)
                {
                    if (!e.ReplayDetected)
                    {
                        return(PeerOperationNames.Fault);
                    }
                    else
                    {
                        DiagnosticUtility.TraceHandledException(e, TraceEventType.Information);
                    }
                }
                return(PeerOperationNames.Flood);
            }
            else
            {
                return(null);
            }
        }
 public string SelectOperation(ref Message message)
 {
     string action = message.Headers.Action;
     string str2 = null;
     byte[] defaultId = PeerNodeImplementation.DefaultId;
     string str3 = PeerStrings.FindAction(action);
     Uri via = null;
     Uri uri2 = null;
     bool flag = false;
     PeerMessageProperty property = new PeerMessageProperty();
     if (str3 != null)
     {
         return str3;
     }
     try
     {
         str2 = PeerMessageHelpers.GetHeaderString(message.Headers, "FloodMessage", "http://schemas.microsoft.com/net/2006/05/peer");
         via = PeerMessageHelpers.GetHeaderUri(message.Headers, "PeerVia", "http://schemas.microsoft.com/net/2006/05/peer");
         uri2 = PeerMessageHelpers.GetHeaderUri(message.Headers, "PeerTo", "http://schemas.microsoft.com/net/2006/05/peer");
     }
     catch (MessageHeaderException exception)
     {
         System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Warning);
         return "Fault";
     }
     catch (SerializationException exception2)
     {
         System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception2, TraceEventType.Warning);
         return "Fault";
     }
     catch (XmlException exception3)
     {
         System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception3, TraceEventType.Warning);
         return "Fault";
     }
     property.PeerVia = via;
     property.PeerTo = uri2;
     message.Properties.Add("PeerProperty", property);
     if (!(str2 == "PeerFlooder"))
     {
         return null;
     }
     try
     {
         if (!this.messageHandler.ValidateIncomingMessage(ref message, via))
         {
             property.SkipLocalChannels = true;
             flag = true;
             TurnOffSecurityHeader(message);
         }
         if (this.messageHandler.IsNotSeenBefore(message, out defaultId, out property.CacheMiss))
         {
             property.MessageVerified = true;
         }
         else if (!flag)
         {
             property.SkipLocalChannels = true;
         }
         if (defaultId == PeerNodeImplementation.DefaultId)
         {
             return "Fault";
         }
     }
     catch (MessageHeaderException exception4)
     {
         System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception4, TraceEventType.Warning);
         return "Fault";
     }
     catch (SerializationException exception5)
     {
         System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception5, TraceEventType.Warning);
         return "Fault";
     }
     catch (XmlException exception6)
     {
         System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception6, TraceEventType.Warning);
         return "Fault";
     }
     catch (MessageSecurityException exception7)
     {
         if (!exception7.ReplayDetected)
         {
             return "Fault";
         }
         System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception7, TraceEventType.Information);
     }
     return "FloodMessage";
 }
        public string SelectOperation(ref Message message)
        {

            string action = message.Headers.Action;
            string demux = null;
            byte[] id = PeerNodeImplementation.DefaultId;
            string operation = PeerStrings.FindAction(action);
            Uri via = null;
            Uri to = null;
            bool skipped = false;
            PeerMessageProperty peerProperty = new PeerMessageProperty();

            if (operation != null)
                return operation;
            try
            {
                demux = PeerMessageHelpers.GetHeaderString(message.Headers, PeerOperationNames.Flood, PeerStrings.Namespace);
                via = PeerMessageHelpers.GetHeaderUri(message.Headers, PeerStrings.Via, PeerStrings.Namespace);
                to = PeerMessageHelpers.GetHeaderUri(message.Headers, PeerOperationNames.PeerTo, PeerStrings.Namespace);
            }
            catch (MessageHeaderException e)
            {
                DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                return PeerOperationNames.Fault;
            }
            catch (SerializationException e)
            {
                DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                return PeerOperationNames.Fault;
            }
            catch (XmlException e)
            {
                DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                return PeerOperationNames.Fault;
            }
            peerProperty.PeerVia = via;
            peerProperty.PeerTo = to;
            message.Properties.Add(PeerStrings.PeerProperty, peerProperty);
            if (demux == PeerOperationNames.Demuxer)
            {
                try
                {
                    if (!this.messageHandler.ValidateIncomingMessage(ref message, via))
                    {
                        peerProperty.SkipLocalChannels = true;
                        skipped = true;
                        TurnOffSecurityHeader(message);
                    }
                    if (this.messageHandler.IsNotSeenBefore(message, out id, out peerProperty.CacheMiss))
                    {
                        peerProperty.MessageVerified = true;
                    }
                    else
                    {
                        if (!skipped)
                        {
                            peerProperty.SkipLocalChannels = true;
                        }
                    }
                    //means that the message doesnt contain legal id
                    if (id == PeerNodeImplementation.DefaultId)
                        return PeerOperationNames.Fault;
                }
                catch (MessageHeaderException e)
                {
                    DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                    return PeerOperationNames.Fault;
                }
                catch (SerializationException e)
                {
                    DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                    return PeerOperationNames.Fault;
                }
                catch (XmlException e)
                {
                    DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
                    return PeerOperationNames.Fault;
                }
                catch (MessageSecurityException e)
                {
                    if (!e.ReplayDetected)
                        return PeerOperationNames.Fault;
                    else
                        DiagnosticUtility.TraceHandledException(e, TraceEventType.Information);
                }
                return PeerOperationNames.Flood;
            }
            else
                return null;
        }