private void OnQueryReceive(object sender, MessageEventArgs e)
        {
            fLogger.WriteDebug("Query received: {0} :: {1}", e.EndPoint, e.Data.EncodeAsString());

            var pr = FindPeer(e.EndPoint);

            string queryType = e.Data.Get <BString>("q").ToString();
            var    args      = e.Data.Get <BDictionary>("a");

            switch (queryType)
            {
            case "handshake":
                SendData(e.EndPoint, ProtocolHelper.CreateHandshakeResponse(DHTTransactions.GetNextId(), fDHTClient.LocalID, fLocalPeer.Presence));
                break;

            case "get_peer_info":
                SendData(e.EndPoint, ProtocolHelper.CreateGetPeerInfoResponse(DHTTransactions.GetNextId(), fDHTClient.LocalID, fProfile));
                break;

            case ProtocolHelper.MSG_SIGN_CHAT:
                long timestamp = args.Get <BNumber>("ts").Value;
                try {
                    var    enc     = Convert.ToBoolean(args.Get <BNumber>("enc").Value);
                    var    msgdata = args.Get <BString>("msg").Value;
                    string msg     = Encoding.UTF8.GetString(msgdata);
                    OnMessageReceive(pr, msg, enc);
                } finally {
                    SendData(e.EndPoint, ProtocolHelper.CreateChatResponse(DHTTransactions.GetNextId(), fDHTClient.LocalID, timestamp));
                }
                break;
            }
        }
        public Message SendMessage(Peer peer, string message)
        {
            if (peer == null || peer.ID == null || string.IsNullOrEmpty(message))
            {
                return(null);
            }

            fLogger.WriteDebug("SendMessage: {0}, `{1}`", peer.EndPoint, message);

            var msg = new Message(DateTime.UtcNow, message, fLocalPeer.ID.ToString(), peer.ID.ToString());

            fDatabase.SaveMessage(msg);

            bool encrypted = false;

            if (peer.Profile != null && !string.IsNullOrEmpty(peer.Profile.PublicKey))
            {
                message   = Utilities.Encrypt(message, peer.Profile.PublicKey);
                encrypted = true;
            }

            SendData(peer.EndPoint, ProtocolHelper.CreateChatMessage(DHTTransactions.GetNextId(), fDHTClient.LocalID, message, encrypted, msg.Timestamp.ToBinary()));

            return(msg);
        }
        /// <summary>
        /// Peer confirmation after receiving a ping from it.
        /// </summary>
        /// <param name="peerEndPoint"></param>
        /// <returns></returns>
        public bool CheckPeer(IPEndPoint peerEndPoint)
        {
            bool result = false;

            if (peerEndPoint == null)
            {
                return(false);
            }

            Peer peer = FindPeer(peerEndPoint);

            if (peer == null)
            {
                // ping can come from various sources,
                // if a node with such an endpoint is not found - then the source is not a peer
                return(false);
            }

            peer.PingTries = 0;

            if (peer.State != PeerState.Checked && !peer.IsLocal)
            {
                peer.State = PeerState.Checked;
                SendData(peer.EndPoint, ProtocolHelper.CreateGetPeerInfoQuery(DHTTransactions.GetNextId(), fDHTClient.LocalID));
                result = true;
            }

            return(result);
        }
        private void CheckPeers()
        {
            DateTime dtNow           = DateTime.UtcNow;
            bool     changed         = false;
            bool     hasCheckedPeers = false;

            for (int i = fPeers.Count - 1; i >= 0; i--)
            {
                var peer = fPeers[i];
                if (peer.IsLocal)
                {
                    continue;
                }

                if (peer.IsUnknown && (peer.PingTries >= 10 || dtNow - peer.LastUpdateTime > TimeSpan.FromMinutes(10)))
                {
                    fPeers.Remove(peer);
                    changed = true;
                    continue;
                }

                // always send ping
                SendPing(peer, (peer.State < PeerState.Checked));

                if (peer.State >= PeerState.Checked)
                {
                    hasCheckedPeers = true;
                }

                if (peer.State == PeerState.Unknown)
                {
                    fDHTClient.FindUnkPeer(peer);
                }

                SendData(peer.EndPoint, ProtocolHelper.CreateHandshakeQuery(DHTTransactions.GetNextId(), fDHTClient.LocalID));
            }

            if (hasCheckedPeers)
            {
                if (fConnectionState == ConnectionState.Connection)
                {
                    fConnectionState = ConnectionState.Connected;
                    changed          = true;
                }
            }
            else
            {
                if (fConnectionState == ConnectionState.Connected)
                {
                    fConnectionState = ConnectionState.Connection;
                    changed          = true;
                }
            }

            if (changed)
            {
                fForm.OnPeersListChanged();
            }
        }
示例#5
0
        public void Test_CreateGetPeerInfoQuery()
        {
            var tid    = DHTTransactions.GetNextId();
            var nodeId = DHTId.CreateRandom();
            var msg    = ProtocolHelper.CreateGetPeerInfoQuery(tid, nodeId);

            Assert.IsNotNull(msg);
            // TODO: test contents
        }
示例#6
0
        public void Test_CreateChatMessage()
        {
            var tid    = DHTTransactions.GetNextId();
            var nodeId = DHTId.CreateRandom();
            var msg    = ProtocolHelper.CreateChatMessage(tid, nodeId, "test", false, 0);

            Assert.IsNotNull(msg);
            // TODO: test contents
        }
示例#7
0
        public void Test_CreateHandshakeResponse()
        {
            var tid    = DHTTransactions.GetNextId();
            var nodeId = DHTId.CreateRandom();
            var msg    = ProtocolHelper.CreateHandshakeResponse(tid, nodeId, PresenceStatus.Online);

            Assert.IsNotNull(msg);
            // TODO: test contents
        }
示例#8
0
        public void Test_CreateGetPeerInfoResponse()
        {
            var peerInfo = new UserProfile();

            peerInfo.Reset();

            var tid    = DHTTransactions.GetNextId();
            var nodeId = DHTId.CreateRandom();
            var msg    = ProtocolHelper.CreateGetPeerInfoResponse(tid, nodeId, peerInfo);

            Assert.IsNotNull(msg);
            // TODO: test contents
        }