/// <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); } }
/// <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); } }
/// <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; }
/// <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; }