Example #1
0
    def from_bytes(bytes):
        try:
            data = Bencode.bdecode(bytes)
        except BTFailure:
            Logger().write(LogVerbosity.Debug, "DHT: Invalid dht message" + str(bytes))
            return None
        if b'y' not in data:
            Logger().write(LogVerbosity.Debug, "DHT: Unknown message: " + str(data))
            return None

        if data[b'y'] == b'r':
            # response
            return ResponseDHTMessage.from_dict(data)

        elif data[b'y'] == b'q':
            # query
            return QueryDHTMessage.from_dict(data)

        else:
            # error
            return ErrorDHTMessage.from_dict(data)
Example #2
0
    def to_bytes(self):
        result = dict()
        added_result = bytearray()
        flag_result = bytearray()
        index = 0

        for uri in self.added:
            added_result[index:index + 6] = uri_to_bytes(uri)
            flag_result.append(0x10)
            index += 6

        result[b'added'] = bytes(added_result)
        result[b'added.f'] = bytes(flag_result)
        bencoded = Bencode.bencode(result)

        self.length = len(bencoded) + 2
        result_bytes = bytearray(self.total_length)
        offset = 0
        offset = Network.write_int(result_bytes, self.length, offset)
        offset = Network.write_int_as_byte(result_bytes, self.message_type,
                                           offset)
        offset = Network.write_int_as_byte(result_bytes, self.type, offset)
        Network.write_bytes(result_bytes, bencoded, offset)
        return result_bytes
Example #3
0
    def handle_message(self, peer, message, timestamp):
        if peer.protocol_logger is None:
            return

        if isinstance(message, PieceMessage):
            Logger().write(
                LogVerbosity.All,
                str(peer.id) + ' Received piece message: ' +
                str(message.index) + ', offset ' + str(message.offset))
            peer.protocol_logger.update("Sending/receiving requests", True)
            self.torrent.data_manager.block_done(peer, message.index,
                                                 message.offset, message.data)
            peer.download_manager.block_done(
                message.index * self.torrent.data_manager.piece_length +
                message.offset, timestamp)
            peer.counter.add_value(message.length)
            return

        elif isinstance(message, KeepAliveMessage):
            Logger().write(LogVerbosity.Debug,
                           str(peer.id) + ' Received keep alive message')
            peer.protocol_logger.update("Received KeepAlive")
            return

        elif isinstance(message, ChokeMessage):
            Logger().write(LogVerbosity.Debug,
                           str(peer.id) + ' Received choke message')
            peer.protocol_logger.update("Received Choke")
            peer.communication_state.in_choke = PeerChokeState.Choked
            return

        elif isinstance(message, UnchokeMessage):
            Logger().write(LogVerbosity.Debug,
                           str(peer.id) + ' Received unchoke message')
            peer.protocol_logger.update("Received UnChoke")
            peer.communication_state.in_choke = PeerChokeState.Unchoked
            return

        elif isinstance(message, InterestedMessage):
            Logger().write(LogVerbosity.Info,
                           str(peer.id) + ' Received interested message')
            peer.protocol_logger.update("Received Interested")
            peer.communication_state.in_interest = PeerInterestedState.Interested
            return

        elif isinstance(message, UninterestedMessage):
            Logger().write(LogVerbosity.Debug,
                           str(peer.id) + ' Received uninterested message')
            peer.protocol_logger.update("Received Uninterested")
            peer.communication_state.in_interest = PeerInterestedState.Uninterested
            return

        elif isinstance(message, HaveMessage):
            if peer.state == PeerState.Started:
                Logger().write(
                    LogVerbosity.All,
                    str(peer.id) + ' Received have message for piece ' +
                    str(message.piece_index))
                peer.protocol_logger.update("Received Have", True)
                peer.bitfield.update_piece(message.piece_index, True)
            return

        elif isinstance(message, BitfieldMessage):
            if peer.state == PeerState.Started:
                Logger().write(LogVerbosity.All,
                               str(peer.id) + ' Received bitfield message')
                peer.protocol_logger.update("Received Bitfield")
                peer.bitfield.update(message.bitfield)
            return

        elif isinstance(message, RequestMessage):
            Logger().write(LogVerbosity.Info,
                           str(peer.id) + ' Received request message')
            peer.protocol_logger.update("Received Request")
            return

        elif isinstance(message, CancelMessage):
            Logger().write(LogVerbosity.Debug,
                           str(peer.id) + ' Received cancel message')
            peer.protocol_logger.update("Received Cancel")
            return

        elif isinstance(message, PortMessage):
            Logger().write(
                LogVerbosity.All,
                str(peer.id) + ' Received port message, port = ' +
                str(message.port))
            peer.protocol_logger.update("Received Port")
            EventManager.throw_event(
                EventType.NewDHTNode,
                [peer.connection_manager.uri.hostname, message.port])
            return

        elif isinstance(message, HaveAllMessage):
            if peer.state == PeerState.Started:
                Logger().write(LogVerbosity.All,
                               str(peer.id) + " Received HaveAll message")
                peer.protocol_logger.update("Received HaveAll")
                peer.bitfield.set_has_all()
            return

        elif isinstance(message, HaveNoneMessage):
            if peer.state == PeerState.Started:
                Logger().write(LogVerbosity.All,
                               str(peer.id) + " Received HaveNone message")
                peer.protocol_logger.update("Received HaveNone")
                peer.bitfield.set_has_none()
            return

        elif isinstance(message, AllowedFastMessage):
            if peer.state == PeerState.Started:
                Logger().write(LogVerbosity.All,
                               str(peer.id) + " Received AllowedFast message")
                peer.protocol_logger.update("Received AllowedFast", True)
                peer.allowed_fast_pieces.append(message.piece_index)
            return

        elif isinstance(message, SuggestPieceMessage):
            Logger().write(LogVerbosity.All,
                           str(peer.id) + " Received SuggestPiece message")
            peer.protocol_logger.update("Received SuggestPiece", True)
            return

        elif isinstance(message, RejectRequestMessage):
            if peer.state == PeerState.Started:
                Logger().write(
                    LogVerbosity.Debug,
                    str(peer.id) + " Received RejectRequest message")
                peer.protocol_logger.update("Received RejectRequest", True)
                peer.download_manager.request_rejected(message.index,
                                                       message.offset,
                                                       message.data_length)
            return

        elif isinstance(message, ExtensionHandshakeMessage):
            Logger().write(
                LogVerbosity.All,
                str(peer.id) + ' Received extension handshake message')
            peer.protocol_logger.update("Received ExtensionHandshake")

            try:
                dic = Bencode.bdecode(message.bencoded_payload)
            except BTFailure:
                Logger().write(LogVerbosity.Debug,
                               "Invalid extension handshake received")
                peer.stop_async("Invalid extension handshake")
                return

            peer.extension_manager.parse_dictionary(dic)
            if b'metadata_size' in dic:
                if peer is not None:
                    self.torrent.metadata_manager.set_total_size(
                        dic[b'metadata_size'])

            return

        elif isinstance(message, PeerExchangeMessage):
            peer.protocol_logger.update("Received PeerExchange")
            Logger().write(
                LogVerbosity.Debug,
                str(peer.id) + ' Received ' + str(len(message.added)) +
                ' peers from peer exchange')
            self.torrent.peer_manager.add_potential_peers(
                message.added, PeerSource.PeerExchange)
            return

        elif isinstance(message, MetadataMessage):
            if message.metadata_message_type == MetadataMessageType.Data:
                peer.protocol_logger.update("Received Metadata")
                Logger().write(
                    LogVerbosity.Debug,
                    str(peer.id) + ' Received metadata message index ' +
                    str(message.piece_index))
                self.torrent.metadata_manager.add_metadata_piece(
                    message.piece_index, message.data)
            else:
                peer.protocol_logger.update("Received Metadata rejected")
                Logger().write(
                    LogVerbosity.Debug,
                    str(peer.id) + ' Received metadata reject message ' +
                    str(message.piece_index))
            return
Example #4
0
 def to_bytes(self):
     result = dict()
     result[b't'] = self.transaction_id
     result[b'y'] = self.message_type
     result[b'e'] = [self.errorcode, self.errormsg]
     return Bencode.bencode(result)
Example #5
0
 def to_bytes(self):
     result = dict()
     result[b't'] = self.transaction_id
     result[b'y'] = self.message_type
     result[b'r'] = self.response
     return Bencode.bencode(result)