Example #1
0
def _query_encoder(query):
    """@see encode"""
    query_dict = {
        "q": query.rpctype,
        "a": {
            "id": basic_coder.encode_network_id(query._from)
        }
    }
    # Perform specific rpc encoding
    if query.rpctype == 'ping':
        pass
    elif query.rpctype == 'find_node':
        query_dict['a']['target'] = (basic_coder.encode_network_id(
            query.target_id))
    elif query.rpctype == 'get_peers':
        query_dict['a']['info_hash'] = (basic_coder.encode_network_id(
            query.target_id))
    elif query.rpctype == 'announce_peer':
        query_dict['a']['token'] = basic_coder.ltob(query.token)
        # Try encoding the port, to see if it is within range
        basic_coder.encode_port(query.port)
        query_dict['a']['port'] = query.port
        query_dict['a']['info_hash'] = (basic_coder.encode_network_id(
            query.target_id))
    else:
        raise _ProtocolFormatError()
    return query_dict
Example #2
0
 def __init__(self,
              node_id=None,
              address=None,
              last_updated=None,
              totalrtt=None,
              successcount=None,
              failcount=None):
     # TODO make check interface.Don't use the encoding funcs directlly
     # So we don't crash here.
     basic_coder.encode_address(address)
     basic_coder.encode_network_id(node_id)
     # Network information
     self.node_id = node_id
     self.address = address
     # Statistical information
     if last_updated is None:
         self.last_updated = time.time()
         self.totalrtt = 0
         self.successcount = 0
         self.failcount = 0
     else:
         self.last_updated = last_updated
         self.totalrtt = totalrtt
         self.successcount = successcount
         self.failcount = failcount
Example #3
0
 def __init__(self, node_id, address):
     # Verify the node_id and address are in the proper format
     basic_coder.encode_address(address)
     basic_coder.encode_network_id(node_id)
     # Network information
     self.node_id = node_id
     self.address = address
     # Statistical information
     self.last_updated = time.time()
     self.totalrtt = 0
     self.successcount = 0
     self.failcount = 0
Example #4
0
    def __init__(self, routing_table_class=TreeRoutingTable,
        node_id=None, _reactor=None):

        if node_id is None:
            node_id = random.getrandbits(constants.id_size)

        # Verify the node_id is valid
        basic_coder.encode_network_id(node_id)
        KRPC_Sender.__init__(self, routing_table_class, node_id, _reactor)

        # Datastore is used for storing peers on torrents
        self._datastore = defaultdict(set)
        self._token_generator = _TokenGenerator()
Example #5
0
 def __init__(self, node_id, address):
     # Verify the node_id and address are in the proper format
     basic_coder.encode_address(address)
     basic_coder.encode_network_id(node_id)
     # Network information
     self.node_id = node_id
     self.address = address
     # Statistical information
     # TODO make this time format human readable
     self.last_updated = time.time()
     self.totalrtt = 0
     self.successcount = 0
     self.failcount = 0
Example #6
0
 def _get_hash(self, query, address, secret):
     """
     Create the hash code for the given query/address/secret combination
     """
     node_id = query._from
     infohash = query.target_id
     hash = self.hash_constructor()
     # The hash code relies on the querying node's ID,
     # the target infohash of the query, the address of
     # the querier, and a secret that changes every
     # constants._secret_timeout seconds
     hash.update(basic_coder.encode_network_id(node_id))
     hash.update(basic_coder.encode_network_id(infohash))
     hash.update(basic_coder.encode_address(address))
     hash.update(secret)
     # Return the hash as a number rather than a string
     numeric_hash_value = basic_coder.btol(hash.digest())
     return numeric_hash_value
Example #7
0
 def __init__(self, node_id=None, address=None, last_updated=None, totalrtt=None, successcount=None, failcount=None):
     # TODO make check interface.Don't use the encoding funcs directlly
     # So we don't crash here.
     basic_coder.encode_address(address)
     basic_coder.encode_network_id(node_id)
     # Network information
     self.node_id = node_id
     self.address = address
     # Statistical information
     if last_updated is None:
         self.last_updated = time.time()
         self.totalrtt = 0
         self.successcount = 0
         self.failcount = 0
     else:
         self.last_updated = last_updated
         self.totalrtt = totalrtt
         self.successcount = successcount
         self.failcount = failcount
Example #8
0
def _response_encoder(response):
    """@see encode"""
    resp_dict = {"r": {"id": basic_coder.encode_network_id(response._from)}}
    if response.nodes is not None:
        encoded_nodes = [contact.encode_node(node) for node in response.nodes]
        resp_dict['r']['nodes'] = "".join(encoded_nodes)
    if response.peers is not None:
        encoded_peers = map(basic_coder.encode_address, response.peers)
        resp_dict['r']['values'] = encoded_peers
    if response.token is not None:
        resp_dict['r']['token'] = basic_coder.ltob(response.token)
    return resp_dict
Example #9
0
def encode_node(node):
    """
    Encodes the given node into a network string

    The format of the network string is specified in the
    BitTorrent DHT extension specification

    @see DHTBot/references/README for the DHT BEP

    """
    return "%s%s" % (basic_coder.encode_network_id(
        node.node_id), basic_coder.encode_address(node.address))
Example #10
0
def _response_encoder(response):
    """@see encode"""
    resp_dict = {"r": {"id": basic_coder.encode_network_id(response._from)}}
    if response.nodes is not None:
        encoded_nodes = [contact.encode_node(node) for node in response.nodes]
        resp_dict['r']['nodes'] = "".join(encoded_nodes)
    if response.peers is not None:
        encoded_peers = map(basic_coder.encode_address, response.peers)
        resp_dict['r']['values'] = encoded_peers
    if response.token is not None:
        resp_dict['r']['token'] = basic_coder.ltob(response.token)
    return resp_dict
Example #11
0
def encode_node(node):
    """
    Encodes the given node into a network string

    The format of the network string is specified in the
    BitTorrent DHT extension specification

    @see DHTBot/references/README for the DHT BEP

    """
    return "%s%s" % (basic_coder.encode_network_id(node.node_id),
                     basic_coder.encode_address(node.address))
Example #12
0
def _query_encoder(query):
    """@see encode"""
    query_dict = {"q": query.rpctype,
                  "a": { "id": basic_coder.encode_network_id(query._from)}}
    # Perform specific rpc encoding
    if query.rpctype == 'ping':
        pass
    elif query.rpctype == 'find_node':
        query_dict['a']['target'] = (
                basic_coder.encode_network_id(query.target_id))
    elif query.rpctype == 'get_peers':
        query_dict['a']['info_hash'] = (
                basic_coder.encode_network_id(query.target_id))
    elif query.rpctype == 'announce_peer':
        query_dict['a']['token'] = basic_coder.ltob(query.token)
        # Try encoding the port, to see if it is within range
        basic_coder.encode_port(query.port)
        query_dict['a']['port'] = query.port
        query_dict['a']['info_hash'] = (
                basic_coder.encode_network_id(query.target_id))
    else:
        raise _ProtocolFormatError()
    return query_dict
Example #13
0
 def test_encode_network_id_validIDs(self):
     self.assertEquals("\x00" * 20, encode_network_id(0))
     self.assertEquals("\xff" * 20, encode_network_id(2**160 - 1))
Example #14
0
 def test_encode_network_id_validIDs(self):
     self.assertEquals("\x00" * 20, encode_network_id(0))
     self.assertEquals("\xff" * 20, encode_network_id(2**160 - 1))