Esempio n. 1
0
 def test_error_datagram(self):
     serialized = ErrorDatagram(ERROR_TYPE, b'1' * 20, b'1' * 48, b'FakeErrorType', b'more info').bencode()
     decoded = decode_datagram(serialized)
     self.assertEqual(decoded.packet_type, ERROR_TYPE)
     self.assertEqual(decoded.rpc_id, b'1' * 20)
     self.assertEqual(decoded.node_id, b'1' * 48)
     self.assertEqual(decoded.exception_type, 'FakeErrorType')
     self.assertEqual(decoded.response, 'more info')
Esempio n. 2
0
 def test_find_value_response_with_pages_field(self):
     found_value_response = {b'2' * 48: [b'\x7f\x00\x00\x01'], b'p': 1}
     serialized = ResponseDatagram(RESPONSE_TYPE, b'1' * 20, b'1' * 48, found_value_response).bencode()
     decoded = decode_datagram(serialized)
     self.assertEqual(decoded.packet_type, RESPONSE_TYPE)
     self.assertEqual(decoded.rpc_id, b'1' * 20)
     self.assertEqual(decoded.node_id, b'1' * 48)
     self.assertDictEqual(decoded.response, found_value_response)
Esempio n. 3
0
    def test_find_node_response(self):
        closest_response = [(b'3' * 48, '1.2.3.4', 1234)]
        expected = [[b'3' * 48, b'1.2.3.4', 1234]]

        serialized = ResponseDatagram(RESPONSE_TYPE, b'1' * 20, b'1' * 48, closest_response).bencode()
        decoded = decode_datagram(serialized)
        self.assertEqual(decoded.packet_type, RESPONSE_TYPE)
        self.assertEqual(decoded.rpc_id, b'1' * 20)
        self.assertEqual(decoded.node_id, b'1' * 48)
        self.assertEqual(decoded.response, expected)
Esempio n. 4
0
 def test_ping_response(self):
     self.assertRaises(ValueError, ResponseDatagram, RESPONSE_TYPE, b'1' * 21, b'1' * 48, b'pong')
     self.assertRaises(ValueError, ResponseDatagram, RESPONSE_TYPE, b'1' * 20, b'1' * 49, b'pong')
     self.assertRaises(ValueError, ResponseDatagram, 5, b'1' * 20, b'1' * 48, b'pong')
     serialized = ResponseDatagram(RESPONSE_TYPE, b'1' * 20, b'1' * 48, b'pong').bencode()
     decoded = decode_datagram(serialized)
     self.assertEqual(decoded.packet_type, RESPONSE_TYPE)
     self.assertEqual(decoded.rpc_id, b'1' * 20)
     self.assertEqual(decoded.node_id, b'1' * 48)
     self.assertEqual(decoded.response, b'pong')
Esempio n. 5
0
 def test_str_or_int_keys(self):
     datagram = decode_datagram(_bencode({
         b'0': 0,
         b'1': b'\n\xbc\xb5&\x9dl\xfc\x1e\x87\xa0\x8e\x92\x0b\xf3\x9f\xe9\xdf\x8e\x92\xfc',
         b'2': b'111111111111111111111111111111111111111111111111',
         b'3': b'ping',
         b'4': [{b'protocolVersion': 1}],
         b'5': b'should not error'
     }))
     self.assertEqual(datagram.packet_type, REQUEST_TYPE)
     self.assertEqual(b'ping', datagram.method)
Esempio n. 6
0
 def test_optional_field_backwards_compatible(self):
     datagram = decode_datagram(_bencode({
         0: 0,
         1: b'\n\xbc\xb5&\x9dl\xfc\x1e\x87\xa0\x8e\x92\x0b\xf3\x9f\xe9\xdf\x8e\x92\xfc',
         2: b'111111111111111111111111111111111111111111111111',
         3: b'ping',
         4: [{b'protocolVersion': 1}],
         5: b'should not error'
     }))
     self.assertEqual(datagram.packet_type, REQUEST_TYPE)
     self.assertEqual(b'ping', datagram.method)
Esempio n. 7
0
 def test_ping_request_datagram(self):
     self.assertRaises(ValueError, RequestDatagram.make_ping, b'1' * 48, b'1' * 21)
     self.assertRaises(ValueError, RequestDatagram.make_ping, b'1' * 47, b'1' * 20)
     self.assertEqual(20, len(RequestDatagram.make_ping(b'1' * 48).rpc_id))
     serialized = RequestDatagram.make_ping(b'1' * 48, b'1' * 20).bencode()
     decoded = decode_datagram(serialized)
     self.assertEqual(decoded.packet_type, REQUEST_TYPE)
     self.assertEqual(decoded.rpc_id, b'1' * 20)
     self.assertEqual(decoded.node_id, b'1' * 48)
     self.assertEqual(decoded.method, b'ping')
     self.assertListEqual(decoded.args, [{b'protocolVersion': 1}])
Esempio n. 8
0
    def test_find_value_request(self):
        self.assertRaises(ValueError, RequestDatagram.make_find_value,
                          b'1' * 49, b'2' * 48, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_find_value,
                          b'1' * 48, b'2' * 49, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_find_value,
                          b'1' * 48, b'2' * 48, b'1' * 21)
        self.assertRaises(ValueError, RequestDatagram.make_find_value,
                          b'1' * 48, b'2' * 48, b'1' * 20, -1)
        self.assertEqual(
            20,
            len(RequestDatagram.make_find_value(b'1' * 48, b'2' * 48).rpc_id))

        # default page argument
        serialized = RequestDatagram.make_find_value(b'1' * 48, b'2' * 48,
                                                     b'1' * 20).bencode()
        decoded = decode_datagram(serialized)
        self.assertEqual(decoded.packet_type, REQUEST_TYPE)
        self.assertEqual(decoded.rpc_id, b'1' * 20)
        self.assertEqual(decoded.node_id, b'1' * 48)
        self.assertEqual(decoded.method, b'findValue')
        self.assertListEqual(decoded.args,
                             [b'2' * 48, {
                                 b'protocolVersion': 1,
                                 b'p': 0
                             }])

        # nondefault page argument
        serialized = RequestDatagram.make_find_value(b'1' * 48, b'2' * 48,
                                                     b'1' * 20, 1).bencode()
        decoded = decode_datagram(serialized)
        self.assertEqual(decoded.packet_type, REQUEST_TYPE)
        self.assertEqual(decoded.rpc_id, b'1' * 20)
        self.assertEqual(decoded.node_id, b'1' * 48)
        self.assertEqual(decoded.method, b'findValue')
        self.assertListEqual(decoded.args,
                             [b'2' * 48, {
                                 b'protocolVersion': 1,
                                 b'p': 1
                             }])
Esempio n. 9
0
    def test_store_request(self):
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 47, b'2' * 48, b'3' * 48, 3333, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 48, b'2' * 49, b'3' * 48, 3333, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 48, b'2' * 48, b'3' * 47, 3333, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 48, b'2' * 48, b'3' * 48, -3333, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 48, b'2' * 48, b'3' * 48, 3333, b'1' * 21)

        serialized = RequestDatagram.make_store(b'1' * 48, b'2' * 48, b'3' * 48, 3333, b'1' * 20).bencode()
        decoded = decode_datagram(serialized)
        self.assertEqual(decoded.packet_type, REQUEST_TYPE)
        self.assertEqual(decoded.rpc_id, b'1' * 20)
        self.assertEqual(decoded.node_id, b'1' * 48)
        self.assertEqual(decoded.method, b'store')
Esempio n. 10
0
    def datagram_received(self, datagram: bytes, address: typing.Tuple[str, int]) -> None:
        try:
            message = decode_datagram(datagram)
        except (ValueError, TypeError):
            self.peer_manager.report_failure(address[0], address[1])
            log.warning("Couldn't decode dht datagram from %s: %s", address, binascii.hexlify(datagram).decode())
            return

        if isinstance(message, RequestDatagram):
            self.handle_request_datagram(address, message)
        elif isinstance(message, ErrorDatagram):
            self.handle_error_datagram(address, message)
        else:
            assert isinstance(message, ResponseDatagram), "sanity"
            self.handle_response_datagram(address, message)