Пример #1
0
        /// <summary>
        /// Handle incoming packets related to connection setup
        /// </summary>
        /// <param name="message">The message to handle</param>
        /// <returns>A PacketResponse indicating if the message was consumed</returns>
        public PacketResponse HandlePacket(Message message)
        {
            switch (message.MessageType)
            {
            case MessageType.HeartbeatRequest:
                var msg = new Message(MessageType.Heartbeat, message.Sender)
                {
                    DataAsString = Dns.GetHostName()
                };
                Outbox.SendUnencryptedMessage(msg);
                if (!ConnectedPeers.ContainsKey(message.Sender))
                {
                    ConnectedPeers.Add(message.Sender, message.DataAsString);
                }
                return(PacketResponse.Accept);

            case MessageType.Heartbeat:
                if (!ConnectedPeers.ContainsKey(message.Sender))
                {
                    ConnectedPeers.Add(message.Sender, message.DataAsString);
                }
                return(PacketResponse.Accept);

            case MessageType.EncryptionPacket:
                SecurityManager.GetInstance().SetKeysFromPacket(message.Data);
                Inbox.GetInstance().UseEncryption = true;
                ConnectionDone = true;

                return(PacketResponse.AcceptAndFinish);

            default:
                return(PacketResponse.Decline);
            }
        }
Пример #2
0
        /// <summary>
        /// Check the inbox for new messages and try to pass them to registered handlers
        /// </summary>
        private void CheckMessages()
        {
            if (!Inbox.GetInstance().HasMessages())
            {
                return;                                     //Do nothing if there's no new messages
            }
            Message message = Inbox.GetInstance().GetNextMessage();

            //Save the handling handler along with the response, to be able to remove it afterwards
            PacketResponse        response = PacketResponse.Decline;
            INetworkPacketHandler handler  = null;

            foreach (var currentHandler in handlers)
            {
                response = currentHandler.Key.HandlePacket(message);
                handler  = currentHandler.Key;
                if (response != PacketResponse.Decline)
                {
                    break;
                }
            }

            if (response == PacketResponse.AcceptAndFinish && handler != null)
            {
                handlers.Remove(handler);
            }
        }
Пример #3
0
        /// <summary>
        /// Send the generated key and IV directly to the discovered peers
        /// </summary>
        public void SendKey()
        {
            if (ConnectedPeers.Count < Program.MinimumPeerCount)
            {
                throw new NotEnoughPeersException(ConnectedPeers.Count);
            }

            foreach (var ipaddress in ConnectedPeers)
            {
                var keymsg = new Message(MessageType.EncryptionPacket, ipaddress.Key);
                keymsg.Data = SecurityManager.GetInstance().GetKeysAsPacket();
                Outbox.SendUnencryptedMessage(keymsg);
            }
            Inbox.GetInstance().UseEncryption = true;
            ConnectionDone = true;
        }
Пример #4
0
 /// <summary>
 /// Create a new connector and put all found peers in the given set
 /// </summary>
 /// <param name="peers">The set to store peers in</param>
 public Connector(Dictionary <IPAddress, string> peers)
 {
     ConnectedPeers = peers;
     Inbox.GetInstance().UseEncryption = false;
     ConnectionDone = false;
 }