Esempio n. 1
0
    def cache_exitnodes_to_disk(self):
        """
        Write a copy of the exit_candidates to the file self.exitnode_cache.

        :returns: None
        """
        exit_nodes = Network()
        for peer in self.get_candidates(PEER_FLAG_EXIT_BT):
            exit_nodes.add_verified_peer(peer)
        self.logger.debug('Writing exit nodes to cache: %s',
                          self.exitnode_cache)
        with open(self.exitnode_cache, 'wb') as cache:
            cache.write(exit_nodes.snapshot())
Esempio n. 2
0
        def __init__(self, configuration, endpoint_override=None, enable_statistics=False, extra_communities=None):
            if endpoint_override:
                self.endpoint = endpoint_override
            else:
                self.endpoint = UDPEndpoint(port=configuration['port'], ip=configuration['address'])
                self.endpoint.open()
                if enable_statistics:
                    self.endpoint = StatisticsEndpoint(self, self.endpoint)

            self.network = Network()

            # Load/generate keys
            self.keys = {}
            for key_block in configuration['keys']:
                if key_block['file'] and isfile(key_block['file']):
                    with open(key_block['file'], 'r') as f:
                        content = f.read()
                        try:
                            # IPv8 Standardized bin format
                            self.keys[key_block['alias']] = Peer(default_eccrypto.key_from_private_bin(content))
                        except ValueError:
                            try:
                                # Try old Tribler M2Crypto PEM format
                                content = b64decode(content[31:-30].replace('\n', ''))
                                peer = Peer(M2CryptoSK(keystring=content))
                                peer.mid # This will error out if the keystring is not M2Crypto
                                self.keys[key_block['alias']] = peer
                            except:
                                # Try old LibNacl format
                                content = "LibNaCLSK:" + content
                                self.keys[key_block['alias']] = Peer(default_eccrypto.key_from_private_bin(content))
                else:
                    self.keys[key_block['alias']] = Peer(default_eccrypto.generate_key(key_block['generation']))
                    if key_block['file']:
                        with open(key_block['file'], 'w') as f:
                            f.write(self.keys[key_block['alias']].key.key_to_bin())

            # Setup logging
            logging.basicConfig(**configuration['logger'])

            self.overlay_lock = RLock()
            self.strategies = []
            self.overlays = []

            for overlay in configuration['overlays']:
                overlay_class = _COMMUNITIES.get(overlay['class'], (extra_communities or {}).get(overlay['class']))
                my_peer = self.keys[overlay['key']]
                overlay_instance = overlay_class(my_peer, self.endpoint, self.network, **overlay['initialize'])
                self.overlays.append(overlay_instance)
                for walker in overlay['walkers']:
                    strategy_class = _WALKERS.get(walker['strategy'],
                                                  overlay_instance.get_available_strategies().get(walker['strategy']))
                    args = walker['init']
                    target_peers = walker['peers']
                    self.strategies.append((strategy_class(overlay_instance, **args), target_peers))
                for config in overlay['on_start']:
                    reactor.callWhenRunning(getattr(overlay_instance, config[0]), *config[1:])

            self.state_machine_lc = LoopingCall(self.on_tick)
            self.state_machine_lc.start(configuration['walker_interval'], False)
Esempio n. 3
0
    async def run(self):
        await super().run()
        await self.get_component(ReporterComponent)

        self._ipv8_component = await self.require_component(Ipv8Component)
        metadata_store_component = await self.require_component(
            MetadataStoreComponent)
        torrent_checker_component = await self.require_component(
            TorrentCheckerComponent)

        config = self.session.config
        community = PopularityCommunity(
            self._ipv8_component.peer,
            self._ipv8_component.ipv8.endpoint,
            Network(),
            settings=config.popularity_community,
            rqc_settings=config.remote_query_community,
            metadata_store=metadata_store_component.mds,
            torrent_checker=torrent_checker_component.torrent_checker)
        self.community = community

        self._ipv8_component.initialise_community_by_default(
            community, default_random_walk_max_peers=30)
        self._ipv8_component.ipv8.add_strategy(community,
                                               RemovePeers(community),
                                               INFINITE)
Esempio n. 4
0
    async def run(self):
        await super().run()
        await self.get_component(ReporterComponent)

        config = self.session.config
        notifier = self.session.notifier

        self._ipv8_component = await self.require_component(Ipv8Component)
        metadata_store_component = await self.require_component(
            MetadataStoreComponent)
        tag_component = await self.get_component(TagComponent)

        giga_channel_cls = GigaChannelTestnetCommunity if config.general.testnet else GigaChannelCommunity
        community = giga_channel_cls(
            self._ipv8_component.peer,
            self._ipv8_component.ipv8.endpoint,
            Network(),
            notifier=notifier,
            settings=config.chant,
            rqc_settings=config.remote_query_community,
            metadata_store=metadata_store_component.mds,
            max_peers=50,
            tags_db=tag_component.tags_db if tag_component else None)
        self.community = community
        self._ipv8_component.initialise_community_by_default(
            community, default_random_walk_max_peers=30)
        self._ipv8_component.ipv8.add_strategy(community,
                                               RemovePeers(community),
                                               INFINITE)
Esempio n. 5
0
 def __init__(self, endpoint):
     my_peer = Peer(default_eccrypto.generate_key(u"very-low"))
     self.signature_length = default_eccrypto.get_signature_length(
         my_peer.public_key)
     super(EndpointServer, self).__init__(my_peer, endpoint, Network())
     self.churn_strategy = SimpleChurn(self)
     self.churn_lc = self.register_task(
         "churn",
         LoopingCall(self.churn_strategy.take_step)).start(30.0, now=False)
Esempio n. 6
0
 def __init__(self, endpoint):
     my_peer = Peer(default_eccrypto.generate_key(u"very-low"))
     self.signature_length = default_eccrypto.get_signature_length(
         my_peer.public_key)
     super(EndpointServer, self).__init__(my_peer, endpoint, Network())
     self.churn_strategy = SimpleChurn(self)
     self.churn_task = self.register_task("churn",
                                          self.churn_strategy.take_step,
                                          interval=30)
Esempio n. 7
0
    def __init__(self, crypto_curve, overlay_class, *args, **kwargs):
        self.endpoint = AutoMockEndpoint()
        self.endpoint.open()
        self.network = Network()
        self.my_peer = Peer(ECCrypto().generate_key(crypto_curve), self.endpoint.wan_address)
        self.overlay = overlay_class(self.my_peer, self.endpoint, self.network, *args, **kwargs)
        self.discovery = MockWalk(self.overlay)

        self.overlay.my_estimated_wan = self.endpoint.wan_address
        self.overlay.my_estimated_lan = self.endpoint.lan_address
Esempio n. 8
0
    async def sanitize_network(self, session):
        # We disable the discovery communities in this session since we don't want to walk to the live network
        for overlay in session.ipv8.overlays:
            if isinstance(overlay, DiscoveryCommunity):
                await overlay.unload()
        session.ipv8.overlays = []
        session.ipv8.strategies = []

        # Also reset the IPv8 network
        session.ipv8.network = Network()
Esempio n. 9
0
    def restore_exitnodes_from_disk(self):
        """
        Send introduction requests to peers stored in the file self.exitnode_cache.

        :returns: None
        """
        if self.exitnode_cache.is_file():
            self.logger.debug('Loading exit nodes from cache: %s',
                              self.exitnode_cache)
            exit_nodes = Network()
            with self.exitnode_cache.open('rb') as cache:
                exit_nodes.load_snapshot(cache.read())
            for exit_node in exit_nodes.get_walkable_addresses():
                self.endpoint.send(exit_node,
                                   self.create_introduction_request(exit_node))
        else:
            self.logger.warning(
                'Could not retrieve backup exitnode cache, file does not exist!'
            )
Esempio n. 10
0
 def __init__(self, endpoint):
     my_peer = Peer(default_eccrypto.generate_key(u"very-low"))
     self.signature_length = default_eccrypto.get_signature_length(
         my_peer.public_key)
     super(EndpointServer, self).__init__(my_peer, endpoint, Network())
     self.endpoint.add_listener(
         self
     )  # Listen to all incoming packets (not just the fake community_id).
     self.churn_strategy = SimpleChurn(self)
     self.churn_task = self.register_task("churn",
                                          self.churn_strategy.take_step,
                                          interval=30)
Esempio n. 11
0
    def __init__(self, my_peer, endpoint, network, metadata_store, **kwargs):
        kwargs["settings"] = kwargs.get("settings", GigaChannelCommunitySettings())
        self.notifier = kwargs.pop("notifier", None)

        # ACHTUNG! We create a separate instance of Network for this community because it
        # walks aggressively and wants lots of peers, which can interfere with other communities
        super().__init__(my_peer, endpoint, Network(), metadata_store, **kwargs)

        # This set contains all the peers that we queried for subscribed channels over time.
        # It is emptied regularly. The purpose of this set is to work as a filter so we never query the same
        # peer twice. If we do, this should happen really rarely
        # TODO: use Bloom filter here instead. We actually *want* it to be all-false-positives eventually.
        self.queried_peers = set()

        self.discovery_booster = DiscoveryBooster(timeout_in_sec=30)
        self.discovery_booster.apply(self)
Esempio n. 12
0
    def __init__(self, my_peer, endpoint, network, **kwargs):
        self.torrent_checker = kwargs.pop('torrent_checker', None)

        # Creating a separate instance of Network for this community to find more peers
        super().__init__(my_peer, endpoint, Network(), **kwargs)

        self.add_message_handler(TorrentsHealthPayload,
                                 self.on_torrents_health)

        self.logger.info('Popularity Community initialized (peer mid %s)',
                         hexlify(self.my_peer.mid))
        self.register_task(
            "gossip_popular_torrents",
            self.gossip_popular_torrents_health,
            interval=PopularityCommunity.GOSSIP_INTERVAL_FOR_POPULAR_TORRENTS)
        self.register_task(
            "gossip_random_torrents",
            self.gossip_random_torrents_health,
            interval=PopularityCommunity.GOSSIP_INTERVAL_FOR_RANDOM_TORRENTS)
Esempio n. 13
0
        def __init__(self,
                     configuration,
                     endpoint_override=None,
                     enable_statistics=False,
                     extra_communities=None):
            super(IPv8, self).__init__()
            self.configuration = configuration

            if endpoint_override:
                self.endpoint = endpoint_override
            else:
                self.endpoint = DispatcherEndpoint(["UDPIPv4"],
                                                   UDPIPv4={
                                                       'port':
                                                       configuration['port'],
                                                       'ip':
                                                       configuration['address']
                                                   })
            if enable_statistics:
                self.endpoint = StatisticsEndpoint(self.endpoint)
            if any([
                    overlay.get('initialize', {}).get('anonymize')
                    for overlay in configuration['overlays']
            ]):
                self.endpoint = TunnelEndpoint(self.endpoint)

            self.network = Network()

            # Load/generate keys
            self.keys = {}
            for key_block in configuration['keys']:
                if key_block['file'] and isfile(key_block['file']):
                    with open(key_block['file'], 'rb') as f:
                        content = f.read()
                        try:
                            # IPv8 Standardized bin format
                            self.keys[key_block['alias']] = Peer(
                                default_eccrypto.key_from_private_bin(content))
                        except ValueError:
                            try:
                                # Try old Tribler M2Crypto PEM format
                                content = b64decode(content[31:-30].replace(
                                    '\n', ''))
                                peer = Peer(M2CryptoSK(keystring=content))
                                peer.mid  # This will error out if the keystring is not M2Crypto
                                self.keys[key_block['alias']] = peer
                            except Exception:
                                # Try old LibNacl format
                                content = "LibNaCLSK:" + content
                                self.keys[key_block['alias']] = Peer(
                                    default_eccrypto.key_from_private_bin(
                                        content))
                else:
                    self.keys[key_block['alias']] = Peer(
                        default_eccrypto.generate_key(key_block['generation']))
                    if key_block['file']:
                        with open(key_block['file'], 'wb') as f:
                            f.write(
                                self.keys[key_block['alias']].key.key_to_bin())

            # Setup logging
            logging.basicConfig(**configuration['logger'])

            self.overlay_lock = RLock()
            self.strategies = []
            self.overlays = []
            self.on_start = []

            for overlay in configuration['overlays']:
                overlay_class = _COMMUNITIES.get(overlay['class'],
                                                 (extra_communities
                                                  or {}).get(overlay['class']))
                my_peer = self.keys[overlay['key']]
                overlay_instance = overlay_class(my_peer, self.endpoint,
                                                 self.network,
                                                 **overlay['initialize'])
                self.overlays.append(overlay_instance)
                for walker in overlay['walkers']:
                    strategy_class = _WALKERS.get(
                        walker['strategy'],
                        overlay_instance.get_available_strategies().get(
                            walker['strategy']))
                    args = walker['init']
                    target_peers = walker['peers']
                    self.strategies.append(
                        (strategy_class(overlay_instance,
                                        **args), target_peers))
                for config in overlay['on_start']:
                    self.on_start.append((getattr(overlay_instance,
                                                  config[0]), config[1:]))
                for bootstrapper in overlay['bootstrappers']:
                    bootstrapper_class = _BOOTSTRAPPERS.get(
                        bootstrapper['class'])
                    if bootstrapper_class:
                        overlay_instance.bootstrappers.append(
                            bootstrapper_class(**bootstrapper['init']))
            self.walk_interval = configuration['walker_interval']
            self.state_machine_task = None
Esempio n. 14
0
    class IPv8(object):
        def __init__(self,
                     configuration,
                     endpoint_override=None,
                     enable_statistics=False):
            if endpoint_override:
                self.endpoint = endpoint_override
            else:
                self.endpoint = UDPEndpoint(port=configuration['port'],
                                            ip=configuration['address'])
                self.endpoint.open()
                if enable_statistics:
                    self.endpoint = StatisticsEndpoint(self, self.endpoint)

            self.network = Network()

            # Load/generate keys
            self.keys = {}
            for key_block in configuration['keys']:
                if key_block['file'] and isfile(key_block['file']):
                    with open(key_block['file'], 'r') as f:
                        content = f.read()
                        try:
                            # IPv8 Standardized bin format
                            self.keys[key_block['alias']] = Peer(
                                ECCrypto().key_from_private_bin(content))
                        except ValueError:
                            try:
                                # Try old Tribler M2Crypto PEM format
                                content = content[31:-30].replace(
                                    '\n', '').decode("BASE64")
                                peer = Peer(M2CryptoSK(keystring=content))
                                peer.mid  # This will error out if the keystring is not M2Crypto
                                self.keys[key_block['alias']] = peer
                            except:
                                # Try old LibNacl format
                                content = "LibNaCLSK:" + content
                                self.keys[key_block['alias']] = Peer(
                                    ECCrypto().key_from_private_bin(content))
                else:
                    self.keys[key_block['alias']] = Peer(
                        ECCrypto().generate_key(key_block['generation']))
                    if key_block['file']:
                        with open(key_block['file'], 'w') as f:
                            f.write(
                                self.keys[key_block['alias']].key.key_to_bin())

            # Setup logging
            logging.basicConfig(**configuration['logger'])

            self.overlay_lock = RLock()
            self.strategies = []
            self.overlays = []

            for overlay in configuration['overlays']:
                overlay_class = _COMMUNITIES[overlay['class']]
                my_peer = self.keys[overlay['key']]
                overlay_instance = overlay_class(my_peer, self.endpoint,
                                                 self.network,
                                                 **overlay['initialize'])
                self.overlays.append(overlay_instance)
                for walker in overlay['walkers']:
                    strategy_class = _WALKERS[walker['strategy']]
                    args = walker['init']
                    target_peers = walker['peers']
                    self.strategies.append(
                        (strategy_class(overlay_instance,
                                        **args), target_peers))
                for config in overlay['on_start']:
                    reactor.callWhenRunning(
                        getattr(overlay_instance, config[0]), *config[1:])

            self.state_machine_lc = LoopingCall(self.on_tick)
            self.state_machine_lc.start(configuration['walker_interval'],
                                        False)

        def on_tick(self):
            if self.endpoint.is_open():
                with self.overlay_lock:
                    for strategy, target_peers in self.strategies:
                        service = strategy.overlay.master_peer.mid
                        peer_count = len(
                            self.network.get_peers_for_service(service))
                        if (target_peers == -1) or (peer_count < target_peers):
                            strategy.take_step(service)

        def unload_overlay(self, instance):
            with self.overlay_lock:
                self.overlays = [
                    overlay for overlay in self.overlays if overlay != instance
                ]
                self.strategies = [(strategy, target_peers)
                                   for (strategy,
                                        target_peers) in self.strategies
                                   if strategy.overlay != instance]
                return maybeDeferred(instance.unload)

        @inlineCallbacks
        def stop(self, stop_reactor=True):
            self.state_machine_lc.stop()
            with self.overlay_lock:
                unload_list = [
                    self.unload_overlay(overlay)
                    for overlay in self.overlays[:]
                ]
                yield DeferredList(unload_list)
                yield self.endpoint.close()
            if stop_reactor:
                reactor.callFromThread(reactor.stop)
Esempio n. 15
0
 def setUp(self):
     self.network = Network()
Esempio n. 16
0
class TestNetwork(unittest.TestCase):

    peers = [_generate_peer() for _ in range(4)]

    def setUp(self):
        self.network = Network()

    def test_discover_address(self):
        """
        Check registration of introducer and introduced when a new address is discovered.

        The introducer should be verified and not walkable.
        The introduced should not be verified and walkable.
        """
        self.network.discover_address(self.peers[0], self.peers[1].address)

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[1].address,
                      self.network.get_walkable_addresses())
        self.assertIn(self.peers[0], self.network.verified_peers)
        self.assertNotIn(self.peers[1], self.network.verified_peers)
        self.assertIn(self.peers[1].address,
                      self.network.get_introductions_from(self.peers[0]))
        self.assertTrue(
            self.network.graph.has_edge(b64encode(self.peers[0].mid),
                                        self.peers[1].address))

    def test_discover_address_duplicate(self):
        """
        Check registration of introducer and introduced when the same address is discovered twice.
        """
        self.network.discover_address(self.peers[0], self.peers[1].address)
        self.network.discover_address(self.peers[0], self.peers[1].address)

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[1].address,
                      self.network.get_walkable_addresses())
        self.assertIn(self.peers[0], self.network.verified_peers)
        self.assertNotIn(self.peers[1], self.network.verified_peers)
        self.assertIn(self.peers[1].address,
                      self.network.get_introductions_from(self.peers[0]))
        self.assertTrue(
            self.network.graph.has_edge(b64encode(self.peers[0].mid),
                                        self.peers[1].address))

    def test_discover_address_known(self):
        """
        Check if an address is already known, the network isn't updated.
        """
        self.network.discover_address(self.peers[0], self.peers[1].address)
        self.network.discover_address(self.peers[2], self.peers[1].address)

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[1].address,
                      self.network.get_walkable_addresses())
        self.assertNotIn(self.peers[2].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[0], self.network.verified_peers)
        self.assertNotIn(self.peers[1], self.network.verified_peers)
        self.assertIn(self.peers[2], self.network.verified_peers)
        self.assertIn(self.peers[1].address,
                      self.network.get_introductions_from(self.peers[0]))
        self.assertTrue(
            self.network.graph.has_edge(b64encode(self.peers[0].mid),
                                        self.peers[1].address))

    def test_discover_address_known_parent_deceased(self):
        """
        Check if an address is already known, the new introducer adopts the introduced.
        """
        self.network.discover_address(self.peers[0], self.peers[1].address)
        self.network.remove_peer(self.peers[0])
        self.network.discover_address(self.peers[2], self.peers[1].address)

        self.assertIn(self.peers[1].address,
                      self.network.get_walkable_addresses())
        self.assertNotIn(self.peers[2].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[2], self.network.verified_peers)
        self.assertNotIn(self.peers[1], self.network.verified_peers)
        self.assertIn(self.peers[1].address,
                      self.network.get_introductions_from(self.peers[2]))
        self.assertTrue(
            self.network.graph.has_edge(b64encode(self.peers[2].mid),
                                        self.peers[1].address))

    def test_discover_address_blacklist(self):
        """
        Check if an address is in the blacklist, the network isn't updated.
        """
        self.network.blacklist.append(self.peers[2].address)
        self.network.discover_address(self.peers[0], self.peers[1].address)
        self.network.discover_address(self.peers[0], self.peers[2].address)

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[1].address,
                      self.network.get_walkable_addresses())
        self.assertNotIn(self.peers[2].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[0], self.network.verified_peers)
        self.assertNotIn(self.peers[1], self.network.verified_peers)
        self.assertNotIn(self.peers[2], self.network.verified_peers)
        self.assertIn(self.peers[1].address,
                      self.network.get_introductions_from(self.peers[0]))
        self.assertTrue(
            self.network.graph.has_edge(b64encode(self.peers[0].mid),
                                        self.peers[1].address))

    def test_discover_address_multiple(self):
        """
        Check if a single peer can perform multiple introductions.
        """
        self.network.discover_address(self.peers[0], self.peers[1].address)
        self.network.discover_address(self.peers[0], self.peers[2].address)

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[0], self.network.verified_peers)

        for other in [1, 2]:
            self.assertIn(self.peers[other].address,
                          self.network.get_walkable_addresses())
            self.assertNotIn(self.peers[other], self.network.verified_peers)
            self.assertIn(self.peers[other].address,
                          self.network.get_introductions_from(self.peers[0]))
            self.assertTrue(
                self.network.graph.has_edge(b64encode(self.peers[0].mid),
                                            self.peers[other].address))

    def test_discover_services(self):
        """
        Check if services are properly registered for a peer.
        """
        service = "".join([chr(i) for i in range(20)])
        self.network.discover_services(self.peers[0], [service])
        self.network.add_verified_peer(self.peers[0])

        self.assertIn(service,
                      self.network.get_services_for_peer(self.peers[0]))
        self.assertIn(self.peers[0],
                      self.network.get_peers_for_service(service))

    def test_discover_services_unverified(self):
        """
        Check if services are properly registered for an unverified peer.

        You can query the services of an unverified peer, but it won't show up as a reachable peer for a service.
        """
        service = "".join([chr(i) for i in range(20)])
        self.network.discover_services(self.peers[0], [service])

        self.assertIn(service,
                      self.network.get_services_for_peer(self.peers[0]))
        self.assertNotIn(self.peers[0],
                         self.network.get_peers_for_service(service))

    def test_discover_services_update(self):
        """
        Check if services are properly combined for a peer.
        """
        service1 = "".join([chr(i) for i in range(20)])
        service2 = "".join([chr(i) for i in range(20, 40)])
        self.network.discover_services(self.peers[0], [service1])
        self.network.discover_services(self.peers[0], [service2])
        self.network.add_verified_peer(self.peers[0])

        self.assertIn(service1,
                      self.network.get_services_for_peer(self.peers[0]))
        self.assertIn(service2,
                      self.network.get_services_for_peer(self.peers[0]))
        self.assertIn(self.peers[0],
                      self.network.get_peers_for_service(service1))
        self.assertIn(self.peers[0],
                      self.network.get_peers_for_service(service2))

    def test_discover_services_update_overlap(self):
        """
        Check if services are properly combined when discovered services overlap.
        """
        service1 = "".join([chr(i) for i in range(20)])
        service2 = "".join([chr(i) for i in range(20, 40)])
        self.network.discover_services(self.peers[0], [service1])
        self.network.discover_services(self.peers[0], [service1, service2])
        self.network.add_verified_peer(self.peers[0])

        self.assertIn(service1,
                      self.network.get_services_for_peer(self.peers[0]))
        self.assertIn(service2,
                      self.network.get_services_for_peer(self.peers[0]))
        self.assertIn(self.peers[0],
                      self.network.get_peers_for_service(service1))
        self.assertIn(self.peers[0],
                      self.network.get_peers_for_service(service2))

    def test_add_verified_peer_new(self):
        """
        Check if a new verified peer can be added to the network.
        """
        self.network.add_verified_peer(self.peers[0])

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[0], self.network.verified_peers)
        self.assertListEqual([],
                             self.network.get_introductions_from(
                                 self.peers[0]))
        self.assertTrue(
            self.network.graph.has_node(b64encode(self.peers[0].mid)))

    def test_add_verified_peer_blacklist(self):
        """
        Check if a new verified peer can be added to the network.
        """
        self.network.blacklist.append(self.peers[0].address)
        self.network.add_verified_peer(self.peers[0])

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertNotIn(self.peers[0], self.network.verified_peers)
        self.assertFalse(
            self.network.graph.has_node(b64encode(self.peers[0].mid)))

    def test_add_verified_peer_duplicate(self):
        """
        Check if an already verified (by slightly changed) peer doesn't cause duplicates in the network.
        """
        self.network.add_verified_peer(self.peers[0])
        self.peers[0].update_clock(1)
        self.network.add_verified_peer(self.peers[0])

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[0], self.network.verified_peers)
        self.assertListEqual([],
                             self.network.get_introductions_from(
                                 self.peers[0]))
        self.assertTrue(
            self.network.graph.has_node(b64encode(self.peers[0].mid)))

    def test_add_verified_peer_promote(self):
        """
        Check if a peer can be promoted from an address to a verified peer.
        """
        self.network.discover_address(self.peers[1], self.peers[0].address)
        self.network.add_verified_peer(self.peers[0])

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertIn(self.peers[0], self.network.verified_peers)
        self.assertListEqual([],
                             self.network.get_introductions_from(
                                 self.peers[0]))
        self.assertTrue(
            self.network.graph.has_node(b64encode(self.peers[0].mid)))
        self.assertFalse(self.network.graph.has_node(self.peers[0].address))

    def test_get_verified_by_address(self):
        """
        Check if we can find a peer in our network by its address.
        """
        self.network.add_verified_peer(self.peers[0])

        self.assertEqual(
            self.peers[0],
            self.network.get_verified_by_address(self.peers[0].address))

    def test_get_verified_by_public_key(self):
        """
        Check if we can find a peer in our network by its public key.
        """
        self.network.add_verified_peer(self.peers[0])

        self.assertEqual(
            self.peers[0],
            self.network.get_verified_by_public_key_bin(
                self.peers[0].public_key.key_to_bin()))

    def test_remove_by_address(self):
        """
        Check if we can remove a peer from our network by its address.
        """
        self.network.add_verified_peer(self.peers[0])
        self.network.discover_services(self.peers[0], ["0" * 20])
        self.network.remove_by_address(self.peers[0].address)

        self.assertNotIn(self.peers[0], self.network.verified_peers)
        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertEqual(set(),
                         self.network.get_services_for_peer(self.peers[0]))
        self.assertFalse(
            self.network.graph.has_node(b64encode(self.peers[0].mid)))

    def test_remove_by_address_unverified(self):
        """
        Check if we can remove an unverified peer from our network by its address.
        """
        self.network.discover_address(self.peers[0], self.peers[1].address)
        self.network.remove_by_address(self.peers[1].address)

        self.assertNotIn(self.peers[1].address,
                         self.network.get_walkable_addresses())
        self.assertFalse(self.network.graph.has_node(self.peers[1].address))

    def test_remove_by_address_unknown(self):
        """
        Removing unknown peers should not affect other peers.
        """
        self.network.add_verified_peer(self.peers[0])

        previous_walkable = self.network.get_walkable_addresses()
        previous_verified = self.network.verified_peers

        self.network.remove_by_address(self.peers[1].address)

        self.assertEqual(previous_walkable,
                         self.network.get_walkable_addresses())
        self.assertEqual(previous_verified, self.network.verified_peers)

    def test_remove_by_address_no_services(self):
        """
        Check if we can remove a peer from our network if it doesn't have services by address.
        """
        self.network.add_verified_peer(self.peers[0])
        self.network.remove_by_address(self.peers[0].address)

        self.assertNotIn(self.peers[0], self.network.verified_peers)
        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertFalse(
            self.network.graph.has_node(b64encode(self.peers[0].mid)))

    def test_remove_peer(self):
        """
        Check if we can remove a peer from our network.
        """
        self.network.add_verified_peer(self.peers[0])
        self.network.discover_services(self.peers[0], ["0" * 20])
        self.network.remove_peer(self.peers[0])

        self.assertNotIn(self.peers[0], self.network.verified_peers)
        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertEqual(set(),
                         self.network.get_services_for_peer(self.peers[0]))
        self.assertFalse(
            self.network.graph.has_node(b64encode(self.peers[0].mid)))

    def test_remove_peer_external(self):
        """
        Check if we can remove an externally created peer from our network.
        """
        self.network.discover_address(self.peers[1], self.peers[0].address)
        self.network.remove_peer(self.peers[0])

        self.assertNotIn(self.peers[0].address,
                         self.network.get_walkable_addresses())
        self.assertFalse(
            self.network.graph.has_node(b64encode(self.peers[0].mid)))
        self.assertFalse(self.network.graph.has_node(self.peers[0].address))

    def test_remove_peer_unknown(self):
        """
        Removing unknown peers should not affect other peers.
        """
        self.network.add_verified_peer(self.peers[0])

        previous_walkable = self.network.get_walkable_addresses()
        previous_verified = self.network.verified_peers

        self.network.remove_peer(self.peers[1])

        self.assertEqual(previous_walkable,
                         self.network.get_walkable_addresses())
        self.assertEqual(previous_verified, self.network.verified_peers)

    def test_get_walkable_by_service(self):
        """
        Check if we can retrieve walkable addresses by parent service id.
        """
        service = "".join([chr(i) for i in range(20)])
        self.network.discover_address(self.peers[2], self.peers[3].address)
        self.network.discover_address(self.peers[0], self.peers[1].address)
        self.network.discover_services(self.peers[0], [service])

        self.assertEqual([self.peers[1].address],
                         self.network.get_walkable_addresses(service))
Esempio n. 17
0
 def __init__(self, endpoint):
     my_peer = Peer(ECCrypto().generate_key(u"very-low"))
     super(EndpointServer, self).__init__(my_peer, endpoint, Network())
     self.churn_lc = self.register_task("churn", LoopingCall(self.do_churn)).start(5.0, now=False)
     self.churn_strategy = RandomChurn(self)
     self.crypto = ECCrypto()
Esempio n. 18
0
 def __init__(self):
     self.fetch_next_called = False
     self.send_random_to_called = []
     self.get_peers_return = []
     self.network = Network()
Esempio n. 19
0
 def __init__(self):
     endpoint = AutoMockEndpoint()
     endpoint.open()
     network = Network()
     peer = Peer(ECCrypto().generate_key(u"very-low"), endpoint.wan_address)
     super(MockCommunity, self).__init__(peer, endpoint, network)
Esempio n. 20
0
 def __init__(self):
     self.exit_candidates = []
     self.network = Network()
Esempio n. 21
0
 def __init__(self):
     self.exit_candidates = []
     self.candidates = {}
     self.network = Network()
     self.send_introduction_request = Mock()