def visit_a_neighbor(self): #NeighborGroup return a neighbor to walk #self.neighbor_group.insert_trusted_neighbor(my_public_key=my_public_key,Graph=self.database.TrustGraph) neighbor_to_walk = self.neighbor_group.get_neighbor_to_walk() neighbor_to_walk_ADDR = neighbor_to_walk.get_public_address() #create new Message and specify its parameter, make it a Introduction Request message_introduction_request = Message( neighbor_discovery=self, destination_address=neighbor_to_walk_ADDR, source_private_address=self.private_address, source_public_address=self.public_address) #encode the message to a introduction request, the binary string will be stored at attribute packet message_introduction_request.encode_introduction_request() #send the introduction request #self.transport.write(message_introduction_request.packet,neighbor_to_walk_ADDR) self.send_message(message_introduction_request.packet, neighbor_to_walk_ADDR) logger.info("take step to: " + str(neighbor_to_walk_ADDR)) if self.step_limit: self.step_count = self.step_count + 1 if self.step_count > self.step_limit: print("already reach step_limit, stopping") self.listening_port.stopListening() time.sleep(10) self.reactor.stop()
def test_decode_introduction_request(self): destination_address = ("8.8.8.8", 8) source_lan_address = ("192.168.1.200", 20000) source_wan_address = ("35.1.2.3", 20000) #use the walker to create a message message = Message(neighbor_discovery=neighbor_discovery, destination_address=destination_address, source_private_address=source_lan_address, source_public_address=source_wan_address) message.encode_introduction_request() message_decode = Message(packet=message.packet) message_decode.decode_introduction_request() assert_equals(message.destination_address, message_decode.destination_address) assert_equals(message.source_private_address, message_decode.source_private_address) assert_equals(message.source_public_address, message_decode.source_public_address)
def test_create_introduction_request(self): #the following three address are fabricated #only for test use destination_address = ("8.8.8.8", 8) source_lan_address = ("192.168.1.200", 20000) source_wan_address = ("35.1.2.3", 20000) #use the walker to create a message message = Message(neighbor_discovery=neighbor_discovery, source_private_address=source_lan_address, source_public_address=source_wan_address, destination_address=destination_address) message.encode_introduction_request() #now we create a message using in a KNOWN CORRECT WAY identifier = message.identifier data = [ inet_aton(destination_address[0]), self._struct_H.pack(destination_address[1]), inet_aton(source_lan_address[0]), self._struct_H.pack(source_lan_address[1]), inet_aton(source_wan_address[0]), self._struct_H.pack(source_wan_address[1]), self._struct_B.pack(self._encode_advice_map[True] | self._encode_connection_type_map[u"unknown"] | self._encode_sync_map[False]), self._struct_H.pack(identifier) ] container = [self.prefix, chr(246)] #container.append(self.my_mid) my_public_key = self.my_public_key #container.extend((self._struct_H.pack(len(my_public_key)), my_public_key)) container.append(self.my_mid) #now = int(time()) now = self._struct_Q.pack(message.global_time) container.append(now) container.extend(data) #print container packet = "".join(container) packet_len = len(packet) signiture = neighbor_discovery.crypto.create_signature( self.my_key, packet) packet = packet + signiture assert_equals(message.packet[0:packet_len], packet[0:packet_len])