def receive_message(self, datagram): if len(datagram) < 166: self.log.warning("received datagram too small from %s, ignoring" % self.addr) return False m = Message() try: m.ParseFromString(datagram) self.node = Node(m.sender.guid, m.sender.nodeAddress.ip, m.sender.nodeAddress.port, m.sender.publicKey, None if not m.sender.HasField("relayAddress") else (m.sender.relayAddress.ip, m.sender.relayAddress.port), m.sender.natType, m.sender.vendor) pubkey = m.sender.publicKey verify_key = nacl.signing.VerifyKey(pubkey) signature = m.signature m.ClearField("signature") verify_key.verify(m.SerializeToString(), signature) h = nacl.hash.sha512(m.sender.publicKey) pow_hash = h[40:] if int(pow_hash[:6], 16) >= 50 or m.sender.guid.encode("hex") != h[:40]: raise Exception('Invalid GUID') except Exception: # If message isn't formatted property then ignore self.log.warning("received an invalid message from %s, ignoring" % self.addr) return False for processor in self.processors: if m.command in processor or m.command == NOT_FOUND: processor.receive_message(m, self.node, self.connection, self.ban_score)