Пример #1
0
    def test_fromraw_toraw(self):
        peer = Peer.from_signed_raw(rawpeer)
        rendered_peer = peer.signed_raw()
        from_rendered_peer = Peer.from_signed_raw(rendered_peer)

        self.assertEqual(from_rendered_peer.currency, "beta_brousouf")
        self.assertEqual(from_rendered_peer.pubkey, "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY")
        self.assertEqual(str(from_rendered_peer.blockUID), "8-1922C324ABC4AF7EF7656734A31F5197888DDD52")
        self.assertEqual(len(from_rendered_peer.endpoints), 3)
        self.assertTrue(type(from_rendered_peer.endpoints[0]) is BMAEndpoint)
        self.assertTrue(type(from_rendered_peer.endpoints[1]) is BMAEndpoint)
        self.assertTrue(type(from_rendered_peer.endpoints[2]) is UnknownEndpoint)

        self.assertEqual(from_rendered_peer.endpoints[0].server, "some.dns.name")
        self.assertEqual(from_rendered_peer.endpoints[0].ipv4, "88.77.66.55")
        self.assertEqual(from_rendered_peer.endpoints[0].ipv6, "2001:0db8:0000:85a3:0000:0000:ac1f")
        self.assertEqual(from_rendered_peer.endpoints[0].port, 9001)

        self.assertEqual(from_rendered_peer.endpoints[1].server, "some.dns.name")
        self.assertEqual(from_rendered_peer.endpoints[1].ipv4, "88.77.66.55")
        self.assertEqual(from_rendered_peer.endpoints[1].ipv6, "2001:0db8:0000:85a3:0000:0000:ac1f")
        self.assertEqual(from_rendered_peer.endpoints[1].port, 9002)

        self.assertEqual(from_rendered_peer.signatures[0], "dkaXIiCYUJtCg8Feh/BKvPYf4uFH9CJ/zY6J4MlA9BsjmcMe4YAblvNt/gJy31b1aGq3ue3h14mLMCu84rraDg==")
        self.assertEqual(rawpeer, from_rendered_peer.signed_raw())
Пример #2
0
    def test_fromraw(self):
        peer = Peer.from_signed_raw(rawpeer)
        self.assertEqual(peer.currency, "beta_brousouf")
        self.assertEqual(peer.pubkey,
                         "HsLShAtzXTVxeUtQd7yi5Z5Zh4zNvbu8sTEZ53nfKcqY")
        self.assertEqual(str(peer.blockUID),
                         "8-1922C324ABC4AF7EF7656734A31F5197888DDD52")
        self.assertEqual(len(peer.endpoints), 4)
        self.assertIsInstance(peer.endpoints[0], BMAEndpoint)
        self.assertIsInstance(peer.endpoints[1], BMAEndpoint)
        self.assertIsInstance(peer.endpoints[2], WS2PEndpoint)
        self.assertIsInstance(peer.endpoints[3], UnknownEndpoint)

        self.assertEqual(peer.endpoints[0].server, "some.dns.name")
        self.assertEqual(peer.endpoints[0].ipv4, "88.77.66.55")
        self.assertEqual(peer.endpoints[0].ipv6, "2001:42d0:52:a00::648")
        self.assertEqual(peer.endpoints[0].port, 9001)

        self.assertEqual(peer.endpoints[1].server, "some.dns.name")
        self.assertEqual(peer.endpoints[1].ipv4, "88.77.66.55")
        self.assertEqual(peer.endpoints[1].ipv6, "2001:42d0:52:a00::648")
        self.assertEqual(peer.endpoints[1].port, 9002)

        self.assertEqual(peer.endpoints[2].server, "g1-test.duniter.org")
        self.assertEqual(peer.endpoints[2].ws2pid, "d2edcb92")
        self.assertEqual(peer.endpoints[2].port, 20902)

        self.assertEqual(
            peer.signatures[0],
            "dkaXIiCYUJtCg8Feh/BKvPYf4uFH9CJ/zY6J4MlA9BsjmcMe4YAblvNt/gJy31b1aGq3ue3h14mLMCu84rraDg=="
        )
Пример #3
0
    async def from_address(cls, currency, address, port, session):
        """
        Factory method to get a node from a given address

        :param str currency: The node currency. None if we don't know\
         the currency it should have, for example if its the first one we add
        :param str address: The node address
        :param int port: The node port
        :return: A new node
        :rtype: sakia.core.net.Node
        """
        peer_data = await bma.network.Peering(ConnectionHandler(address, port)
                                              ).get(session)

        peer = Peer.from_signed_raw("{0}{1}\n".format(peer_data['raw'],
                                                      peer_data['signature']))

        if currency is not None:
            if peer.currency != currency:
                raise InvalidNodeCurrency(peer.currency, currency)

        node = cls(peer, "", peer.pubkey, None, Node.ONLINE, time.time(), {
            'root': "",
            'leaves': []
        }, "", "", 0, session)
        logging.debug("Node from address : {:}".format(str(node)))
        return node
Пример #4
0
    def setUp(self):
        self.setUpQuamash()
        QLocale.setDefault(QLocale("en_GB"))
        self.identities_registry = IdentitiesRegistry()

        self.application = Application(self.qapplication, self.lp,
                                       self.identities_registry)
        self.application.preferences['notifications'] = False

        self.peer = Peer.from_signed_raw("""Version: 2
Type: Peer
Currency: meta_brouzouf
PublicKey: 8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU
Block: 48698-000005E0F228038E4DDD4F6CA4ACB01EC88FBAF8
Endpoints:
BASIC_MERKLED_API duniter.inso.ovh 80
82o1sNCh1bLpUXU6nacbK48HBcA9Eu2sPkL1/3c2GtDPxBUZd2U2sb7DxwJ54n6ce9G0Oy7nd1hCxN3fS0oADw==
""")
        self.node = Node(self.peer, "",
                         "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk", None,
                         Node.ONLINE, time.time(), {}, "duniter", "0.12.0", 0,
                         Mock("aiohttp.ClientSession"))
        self.network = Network.create(self.node)
        self.bma_access = BmaAccess.create(self.network)
        self.community = Community("test_currency", self.network,
                                   self.bma_access)
Пример #5
0
    async def from_address(cls, currency, secured, address, port, user_parameters):
        """
        Factory method to get a node from a given address
        :param str currency: The node currency. None if we don't know\
         the currency it should have, for example if its the first one we add
        :param bool secured: True if the node uses https
        :param str address: The node address
        :param int port: The node port
        :return: A new node
        :rtype: sakia.core.net.Node
        """
        http_scheme = "https" if secured else "http"
        ws_scheme = "ws" if secured else "wss"
        session = aiohttp.ClientSession()
        peer_data = await bma.network.peering(ConnectionHandler(http_scheme, ws_scheme, address, port, "",
                                                                proxy=user_parameters.proxy(), session=session))

        peer = Peer.from_signed_raw("{0}{1}\n".format(peer_data['raw'],
                                                      peer_data['signature']))

        if currency and peer.currency != currency:
            raise InvalidNodeCurrency(currency, peer.currency)

        node = Node(peer.currency, peer.pubkey, peer.endpoints, peer.blockUID)
        logging.getLogger('sakia').debug("Node from address : {:}".format(str(node)))

        return cls(node, user_parameters, session=session)
Пример #6
0
    async def from_address(cls, currency, address, port, session):
        """
        Factory method to get a node from a given address

        :param str currency: The node currency. None if we don't know\
         the currency it should have, for example if its the first one we add
        :param str address: The node address
        :param int port: The node port
        :return: A new node
        :rtype: sakia.core.net.Node
        """
        peer_data = await bma.network.Peering(ConnectionHandler(address, port)).get(session)

        peer = Peer.from_signed_raw("{0}{1}\n".format(peer_data['raw'],
                                                  peer_data['signature']))

        if currency is not None:
            if peer.currency != currency:
                raise InvalidNodeCurrency(peer.currency, currency)

        node = cls(peer,
                   "", peer.pubkey, None, Node.ONLINE, time.time(),
                   {'root': "", 'leaves': []}, "", "", 0, session)
        logging.debug("Node from address : {:}".format(str(node)))
        return node
Пример #7
0
    async def from_address(cls, currency, secured, address, port, user_parameters):
        """
        Factory method to get a node from a given address
        :param str currency: The node currency. None if we don't know\
         the currency it should have, for example if its the first one we add
        :param bool secured: True if the node uses https
        :param str address: The node address
        :param int port: The node port
        :return: A new node
        :rtype: sakia.core.net.Node
        """
        http_scheme = "https" if secured else "http"
        ws_scheme = "ws" if secured else "wss"
        session = aiohttp.ClientSession()
        peer_data = await bma.network.peering(ConnectionHandler(http_scheme, ws_scheme, address, port, "",
                                                                proxy=user_parameters.proxy(), session=session))

        peer = Peer.from_signed_raw("{0}{1}\n".format(peer_data['raw'],
                                                      peer_data['signature']))

        if currency and peer.currency != currency:
            raise InvalidNodeCurrency(currency, peer.currency)

        node = Node(peer.currency, peer.pubkey, peer.endpoints, peer.blockUID, last_state_change=time.time())
        logging.getLogger('sakia').debug("Node from address : {:}".format(str(node)))

        return cls(node, user_parameters, session=session)
Пример #8
0
    async def refresh_informations(self):
        """
        Refresh basic information (pubkey and currency)
        """
        conn_handler = self.endpoint.conn_handler()

        try:
            peering_data = await bma.network.Peering(conn_handler).get(
                self._session)
            node_pubkey = peering_data["pubkey"]
            node_currency = peering_data["currency"]
            self.state = Node.ONLINE

            if peering_data['raw'] != self.peer.raw():
                peer = Peer.from_signed_raw("{0}{1}\n".format(
                    peering_data['raw'], peering_data['signature']))
                if peer.blockUID.number > peer.blockUID.number:
                    self.peer = Peer.from_signed_raw("{0}{1}\n".format(
                        peering_data['raw'], peering_data['signature']))

            if node_pubkey != self.pubkey:
                self._pubkey = node_pubkey
                self.identity_changed.emit()

            if node_currency != self.currency:
                self.state = Node.CORRUPTED
                logging.debug("Change : new state corrupted")
                self.changed.emit()

        except errors.DuniterError as e:
            if e.ucode == errors.PEER_NOT_FOUND:
                logging.debug("Error in peering reply : {0}".format(str(e)))
                self.state = Node.OFFLINE
                self.changed.emit()
        except (ClientError, gaierror, TimeoutError, DisconnectedError,
                ValueError) as e:
            logging.debug("{0} : {1}".format(
                type(e).__name__, self.pubkey[:5]))
            self.state = Node.OFFLINE
        except (MalformedDocumentError, jsonschema.ValidationError) as e:
            logging.debug(str(e))
            logging.debug("Validation error : {0}".format(self.pubkey[:5]))
            self.state = Node.CORRUPTED
Пример #9
0
 def refresh_peer_data(self, peer_data):
     if "raw" in peer_data:
         try:
             str_doc = "{0}{1}\n".format(peer_data['raw'],
                                         peer_data['signature'])
             peer_doc = Peer.from_signed_raw(str_doc)
             self.neighbour_found.emit(peer_doc)
         except MalformedDocumentError as e:
             self._logger.debug(str(e))
     else:
         self._logger.debug("Incorrect leaf reply")
Пример #10
0
 def refresh_peer_data(self, peer_data):
     if "raw" in peer_data:
         try:
             str_doc = "{0}{1}\n".format(peer_data['raw'],
                                         peer_data['signature'])
             peer_doc = Peer.from_signed_raw(str_doc)
             self.neighbour_found.emit(peer_doc)
         except MalformedDocumentError as e:
             logging.debug(str(e))
     else:
         logging.debug("Incorrect leaf reply")
Пример #11
0
    async def refresh_informations(self):
        """
        Refresh basic information (pubkey and currency)
        """
        conn_handler = self.endpoint.conn_handler()

        try:
            peering_data = await bma.network.Peering(conn_handler).get(self._session)
            node_pubkey = peering_data["pubkey"]
            node_currency = peering_data["currency"]
            self.state = Node.ONLINE

            if peering_data['raw'] != self.peer.raw():
                peer = Peer.from_signed_raw("{0}{1}\n".format(peering_data['raw'], peering_data['signature']))
                if peer.blockUID.number > peer.blockUID.number:
                    self.peer = Peer.from_signed_raw("{0}{1}\n".format(peering_data['raw'], peering_data['signature']))

            if node_pubkey != self.pubkey:
                self._pubkey = node_pubkey
                self.identity_changed.emit()

            if node_currency != self.currency:
                self.state = Node.CORRUPTED
                logging.debug("Change : new state corrupted")
                self.changed.emit()

        except errors.DuniterError as e:
            if e.ucode == errors.PEER_NOT_FOUND:
                logging.debug("Error in peering reply : {0}".format(str(e)))
                self.state = Node.OFFLINE
                self.changed.emit()
        except (ClientError, gaierror, TimeoutError, DisconnectedError, ValueError) as e:
            logging.debug("{0} : {1}".format(type(e).__name__, self.pubkey[:5]))
            self.state = Node.OFFLINE
        except (MalformedDocumentError, jsonschema.ValidationError) as e:
            logging.debug(str(e))
            logging.debug("Validation error : {0}".format(self.pubkey[:5]))
            self.state = Node.CORRUPTED
Пример #12
0
    def test_peer_signature(self):
        signed_raw = """Version: 2
Type: Peer
Currency: test_net
PublicKey: 8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU
Block: 2086-00005D6FC6E22FB308D8815A565A01C66FFB7DC761D616DE0698F6322565F1D6
Endpoints:
BASIC_MERKLED_API testnet.duniter.inso.ovh 80
4aQ/sfqFAFUeYkkLdC2OfgXqTBjCIcMptpR/GIlGqbe4aFVJcy9NEVAFx7sHiLuAb+VNnec3XHHC+xOk3MLzDA==
"""
        peer = Peer.from_signed_raw(signed_raw)
        pubkey = "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU"
        verifying_key = VerifyingKey(pubkey)
        self.assertTrue(verifying_key.verify_document(peer))
    def test_peer_signature(self):
        signed_raw = """Version: 2
Type: Peer
Currency: test_net
PublicKey: 8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU
Block: 2086-00005D6FC6E22FB308D8815A565A01C66FFB7DC761D616DE0698F6322565F1D6
Endpoints:
BASIC_MERKLED_API testnet.duniter.inso.ovh 80
4aQ/sfqFAFUeYkkLdC2OfgXqTBjCIcMptpR/GIlGqbe4aFVJcy9NEVAFx7sHiLuAb+VNnec3XHHC+xOk3MLzDA==
"""""
        peer = Peer.from_signed_raw(signed_raw)
        pubkey = "8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU"
        verifying_key = VerifyingKey(pubkey)
        self.assertTrue(verifying_key.verify_document(peer))
Пример #14
0
    def setUp(self):
        self.setUpQuamash()
        QLocale.setDefault(QLocale("en_GB"))
        self.identities_registry = IdentitiesRegistry()

        self.application = Application(self.qapplication, self.lp, self.identities_registry)
        self.application.preferences['notifications'] = False

        self.peer = Peer.from_signed_raw("""Version: 2
Type: Peer
Currency: meta_brouzouf
PublicKey: 8Fi1VSTbjkXguwThF4v2ZxC5whK7pwG2vcGTkPUPjPGU
Block: 48698-000005E0F228038E4DDD4F6CA4ACB01EC88FBAF8
Endpoints:
BASIC_MERKLED_API duniter.inso.ovh 80
82o1sNCh1bLpUXU6nacbK48HBcA9Eu2sPkL1/3c2GtDPxBUZd2U2sb7DxwJ54n6ce9G0Oy7nd1hCxN3fS0oADw==
""")
        self.node = Node(self.peer,
                         "", "HnFcSms8jzwngtVomTTnzudZx7SHUQY8sVE1y8yBmULk",
                         None, Node.ONLINE,
                         time.time(), {}, "duniter", "0.12.0", 0, Mock("aiohttp.ClientSession"))
        self.network = Network.create(self.node)
        self.bma_access = BmaAccess.create(self.network)
        self.community = Community("test_currency", self.network, self.bma_access)
Пример #15
0
 def test_incorrect(self):
     peer = Peer.from_signed_raw(test_weird_ipv6_peer)
     rendered_peer = peer.signed_raw()
     self.assertEqual(test_weird_ipv6_peer, rendered_peer)
     Peer.from_signed_raw(rendered_peer)
Пример #16
0
    def from_json(cls, currency, data, file_version, session):
        """
        Loads a node from json data

        :param str currency: the currency of the community
        :param dict data: the json data of the node
        :param NormalizedVersion file_version: the version of the file
        :return: A new node
        :rtype: Node
        """
        endpoints = []
        uid = ""
        pubkey = ""
        software = ""
        version = ""
        fork_window = 0
        block = None
        last_change = time.time()
        state = Node.OFFLINE
        if 'uid' in data:
            uid = data['uid']

        if 'pubkey' in data:
            pubkey = data['pubkey']

        if 'last_change' in data:
            last_change = data['last_change']

        if 'block' in data:
            block = data['block']

        if 'state' in data:
            state = data['state']

        if 'software' in data:
            software = data['software']

        if 'version' in data:
            version = data['version']

        if 'fork_window' in data:
            fork_window = data['fork_window']

        if parse_version("0.11") <= file_version < parse_version("0.12dev1"):
            for endpoint_data in data['endpoints']:
                endpoints.append(Endpoint.from_inline(endpoint_data))

            if currency in data:
                currency = data['currency']

            peer = Peer(2, currency, pubkey, BlockUID(0, Block.Empty_Hash),
                        endpoints, "SOMEFAKESIGNATURE")
        else:
            peer = Peer.from_signed_raw(data['peer'])

        node = cls(peer, uid, pubkey, block, state, last_change, {
            'root': "",
            'leaves': []
        }, software, version, fork_window, session)

        logging.debug("Node from json : {:}".format(str(node)))
        return node
Пример #17
0
 def test_incorrect(self):
     peer = Peer.from_signed_raw(test_weird_ipv6_peer)
     rendered_peer = peer.signed_raw()
     from_rendered_peer = Peer.from_signed_raw(rendered_peer)
Пример #18
0
    def from_json(cls, currency, data, file_version, session):
        """
        Loads a node from json data

        :param str currency: the currency of the community
        :param dict data: the json data of the node
        :param NormalizedVersion file_version: the version of the file
        :return: A new node
        :rtype: Node
        """
        endpoints = []
        uid = ""
        pubkey = ""
        software = ""
        version = ""
        fork_window = 0
        block = None
        last_change = time.time()
        state = Node.OFFLINE
        if 'uid' in data:
            uid = data['uid']

        if 'pubkey' in data:
            pubkey = data['pubkey']

        if 'last_change' in data:
            last_change = data['last_change']

        if 'block' in data:
            block = data['block']

        if 'state' in data:
            state = data['state']

        if 'software' in data:
            software = data['software']

        if 'version' in data:
            version = data['version']

        if 'fork_window' in data:
            fork_window = data['fork_window']

        if parse_version("0.11") <= file_version < parse_version("0.12dev1") :
            for endpoint_data in data['endpoints']:
                endpoints.append(Endpoint.from_inline(endpoint_data))

            if currency in data:
                currency = data['currency']

            peer = Peer(2, currency, pubkey, BlockUID(0, Block.Empty_Hash), endpoints, "SOMEFAKESIGNATURE")
        else:
            peer = Peer.from_signed_raw(data['peer'])

        node = cls(peer, uid, pubkey, block,
                   state, last_change,
                   {'root': "", 'leaves': []},
                   software, version, fork_window, session)

        logging.debug("Node from json : {:}".format(str(node)))
        return node