Esempio n. 1
0
    def __init__(
            self,
            rest_server,
            certificate_filepath=None,
            certificate=None,
            certificate_dir=None,
            common_name=None,  # TODO: Is this actually optional?
            *args,
            **kwargs) -> None:

        if certificate and certificate_filepath:
            # TODO: Design decision here: if they do pass both, and they're identical, do we let that slide?
            raise ValueError(
                "Pass either a certificate or a certificate_filepath - what do you even expect from passing both?"
            )

        if certificate:
            kwargs['keypair'] = HostingKeypair(certificate=certificate,
                                               certificate_dir=certificate_dir,
                                               common_name=common_name)
        elif certificate_filepath:
            kwargs['keypair'] = HostingKeypair(
                certificate_filepath=certificate_filepath)
        self.rest_server = rest_server
        super().__init__(*args, **kwargs)
Esempio n. 2
0
    def __init__(self,
                 host: str,
                 public_certificate=None,
                 public_certificate_filepath=None,
                 *args, **kwargs) -> None:

        if public_certificate and public_certificate_filepath:
            # TODO: Design decision here: if they do pass both, and they're identical, do we let that slide?
            raise ValueError("Pass either a public_certificate or a public_certificate_filepath, not both.")

        if public_certificate:
            kwargs['keypair'] = HostingKeypair(certificate=public_certificate, host=host)
        elif public_certificate_filepath:
            kwargs['keypair'] = HostingKeypair(certificate_filepath=public_certificate_filepath, host=host)
        super().__init__(*args, **kwargs)
Esempio n. 3
0
def _get_tls_hosting_power(host: str = None,
                           tls_certificate_filepath: str = None,
                           tls_private_key_filepath: str = None):
    # Pre-Signed
    if tls_certificate_filepath and tls_private_key_filepath:
        with open(tls_private_key_filepath, 'rb') as file:
            tls_private_key = UmbralPrivateKey.from_bytes(file.read())
        tls_hosting_keypair = HostingKeypair(
            curve=ec.SECP384R1,
            host=host,
            certificate_filepath=tls_certificate_filepath,
            private_key=tls_private_key)

    # Self-Sign
    else:
        tls_hosting_keypair = HostingKeypair(curve=ec.SECP384R1, host=host)

    tls_hosting_power = TLSHostingPower(keypair=tls_hosting_keypair, host=host)
    return tls_hosting_power
Esempio n. 4
0
    def __init__(self,
                 rest_server,
                 certificate=None,
                 certificate_filepath=None,
                 *args,
                 **kwargs) -> None:

        if certificate and certificate_filepath:
            # TODO: Design decision here: if they do pass both, and they're identical, do we let that slide?
            raise ValueError(
                "Pass either a certificate or a certificate_filepath, not both."
            )

        if certificate:
            kwargs['keypair'] = HostingKeypair(
                certificate=certificate, host=rest_server.rest_interface.host)
        elif certificate_filepath:
            kwargs['keypair'] = HostingKeypair(
                certificate_filepath=certificate_filepath)
        self.rest_server = rest_server
        super().__init__(*args, **kwargs)
Esempio n. 5
0
    def __init__(self,
                 host=None,
                 port=None,
                 db_name=None,
                 tls_private_key=None,
                 tls_curve=None,
                 *args,
                 **kwargs):
        self.rest_interface = InterfaceInfo(host=host, port=port)

        self.db_name = db_name
        self._rest_app = None
        tls_hosting_keypair = HostingKeypair(
            common_name=self.checksum_public_address,
            private_key=tls_private_key,
            curve=tls_curve)
        tls_hosting_power = TLSHostingPower(keypair=tls_hosting_keypair)
        self._crypto_power.consume_power_up(tls_hosting_power)
Esempio n. 6
0
    def __init__(
            self,

            # Ursula
            rest_host: str,
            rest_port: int,
            domains: Set = (
                GLOBAL_DOMAIN,
            ),  # For now, serving and learning domains will be the same.
            certificate: Certificate = None,
            certificate_filepath: str = None,
            db_filepath: str = None,
            is_me: bool = True,
            interface_signature=None,
            timestamp=None,

            # Blockchain
            identity_evidence: bytes = constants.NOT_SIGNED,
            checksum_public_address: str = None,

            # Character
            password: str = None,
            abort_on_learning_error: bool = False,
            federated_only: bool = False,
            start_learning_now: bool = None,
            crypto_power=None,
            tls_curve: EllipticCurve = None,
            known_nodes: Iterable = None,
            **character_kwargs) -> None:

        #
        # Character
        #
        self._work_orders = list()
        Character.__init__(self,
                           is_me=is_me,
                           checksum_public_address=checksum_public_address,
                           start_learning_now=start_learning_now,
                           federated_only=federated_only,
                           crypto_power=crypto_power,
                           abort_on_learning_error=abort_on_learning_error,
                           known_nodes=known_nodes,
                           domains=domains,
                           **character_kwargs)

        #
        # Self-Ursula
        #
        if is_me is True:  # TODO: 340
            self._stored_treasure_maps = dict()

            #
            # Staking Ursula
            #
            if not federated_only:
                Miner.__init__(self,
                               is_me=is_me,
                               checksum_address=checksum_public_address)

                # Access staking node via node's transacting keys  TODO: Better handle ephemeral staking self ursula
                blockchain_power = BlockchainPower(
                    blockchain=self.blockchain,
                    account=self.checksum_public_address)
                self._crypto_power.consume_power_up(blockchain_power)

                # Use blockchain power to substantiate stamp, instead of signing key
                self.substantiate_stamp(
                    password=password)  # TODO: Derive from keyring

        #
        # ProxyRESTServer and TLSHostingPower # TODO: Maybe we want _power_ups to be public after all?
        #
        if not crypto_power or (TLSHostingPower
                                not in crypto_power._power_ups):

            #
            # Ephemeral Self-Ursula
            #
            if is_me:
                self.suspicious_activities_witnessed = {
                    'vladimirs': [],
                    'bad_treasure_maps': []
                }

                #
                # REST Server (Ephemeral Self-Ursula)
                #
                rest_app, datastore = make_rest_app(
                    db_filepath=db_filepath,
                    network_middleware=self.network_middleware,
                    federated_only=self.federated_only,  # TODO: 466
                    treasure_map_tracker=self.treasure_maps,
                    node_tracker=self.known_nodes,
                    node_bytes_caster=self.__bytes__,
                    work_order_tracker=self._work_orders,
                    node_recorder=self.remember_node,
                    stamp=self.stamp,
                    verifier=self.verify_from,
                    suspicious_activity_tracker=self.
                    suspicious_activities_witnessed,
                    serving_domains=domains,
                )

                #
                # TLSHostingPower (Ephemeral Self-Ursula)
                #
                tls_hosting_keypair = HostingKeypair(
                    curve=tls_curve,
                    host=rest_host,
                    checksum_public_address=self.checksum_public_address)
                tls_hosting_power = TLSHostingPower(
                    keypair=tls_hosting_keypair, host=rest_host)
                self.rest_server = ProxyRESTServer(
                    rest_host=rest_host,
                    rest_port=rest_port,
                    rest_app=rest_app,
                    datastore=datastore,
                    hosting_power=tls_hosting_power)

            #
            # Stranger-Ursula
            #
            else:

                # TLSHostingPower
                if certificate or certificate_filepath:
                    tls_hosting_power = TLSHostingPower(
                        host=rest_host,
                        public_certificate_filepath=certificate_filepath,
                        public_certificate=certificate)
                else:
                    tls_hosting_keypair = HostingKeypair(
                        curve=tls_curve,
                        host=rest_host,
                        generate_certificate=False)
                    tls_hosting_power = TLSHostingPower(
                        host=rest_host, keypair=tls_hosting_keypair)

                # REST Server
                # Unless the caller passed a crypto power we'll make our own TLSHostingPower for this stranger.
                self.rest_server = ProxyRESTServer(
                    rest_host=rest_host,
                    rest_port=rest_port,
                    hosting_power=tls_hosting_power)

            #
            # OK - Now we have a ProxyRestServer and a TLSHostingPower for some Ursula
            #
            self._crypto_power.consume_power_up(tls_hosting_power)  # Consume!

        #
        # Verifiable Node
        #
        certificate_filepath = self._crypto_power.power_ups(
            TLSHostingPower).keypair.certificate_filepath
        certificate = self._crypto_power.power_ups(
            TLSHostingPower).keypair.certificate
        Teacher.__init__(
            self,
            domains=domains,
            certificate=certificate,
            certificate_filepath=certificate_filepath,
            interface_signature=interface_signature,
            timestamp=timestamp,
            identity_evidence=identity_evidence,
            substantiate_immediately=is_me and not federated_only,
        )

        #
        # Logging / Updating
        #
        if is_me:
            self.known_nodes.record_fleet_state(
                additional_nodes_to_track=[self])
            message = "THIS IS YOU: {}: {}".format(self.__class__.__name__,
                                                   self)
            self.log.info(message)
        else:
            message = "Initialized Stranger {} | {}".format(
                self.__class__.__name__, self)
            self.log.debug(message)
Esempio n. 7
0
    def __init__(self,

                 # Ursula
                 rest_host: str,
                 rest_port: int,
                 certificate: Certificate = None,  # TODO: from_certificate classmethod instead, use only filepath..?
                 certificate_filepath: str = None,
                 db_name: str = None,  # TODO: deprecate db_name, use only filepath.?
                 db_filepath: str = None,
                 is_me: bool = True,
                 interface_signature=None,

                 # Blockchain
                 miner_agent=None,
                 checksum_address: str = None,
                 registry_filepath: str = None,

                 # Character
                 abort_on_learning_error: bool = False,
                 federated_only: bool = False,
                 start_learning_now: bool = None,
                 crypto_power=None,
                 tls_curve: EllipticCurve = None,
                 tls_private_key=None,  # TODO: config here. #361
                 known_nodes: Iterable = None,

                 **character_kwargs
                 ) -> None:

        self._work_orders = []

        Character.__init__(self,
                           is_me=is_me,
                           checksum_address=checksum_address,
                           start_learning_now=start_learning_now,
                           federated_only=federated_only,
                           crypto_power=crypto_power,
                           abort_on_learning_error=abort_on_learning_error,
                           known_nodes=known_nodes,
                           **character_kwargs)

        if not federated_only:
            Miner.__init__(self,
                           is_me=is_me,
                           miner_agent=miner_agent,
                           checksum_address=checksum_address,
                           registry_filepath=registry_filepath)

            blockchain_power = BlockchainPower(blockchain=self.blockchain, account=self.checksum_public_address)
            self._crypto_power.consume_power_up(blockchain_power)

        if is_me is True:
            # TODO: 340
            self._stored_treasure_maps = {}
            if not federated_only:
                self.substantiate_stamp()

        if not crypto_power or (TLSHostingPower not in crypto_power._power_ups):
            # TODO: Maybe we want _power_ups to be public after all?
            # We'll hook all the TLS stuff up unless the crypto_power was already passed.

            if is_me:
                self.suspicious_activities_witnessed = {'vladimirs': [], 'bad_treasure_maps': []}

                rest_routes = ProxyRESTRoutes(
                    db_name=db_name,
                    db_filepath=db_filepath,
                    network_middleware=self.network_middleware,
                    federated_only=self.federated_only,
                    treasure_map_tracker=self.treasure_maps,
                    node_tracker=self.known_nodes,
                    node_bytes_caster=self.__bytes__,
                    work_order_tracker=self._work_orders,
                    node_recorder=self.remember_node,
                    stamp=self.stamp,
                    verifier=self.verify_from,
                    suspicious_activity_tracker=self.suspicious_activities_witnessed,
                    certificate_dir=self.known_certificates_dir,
                )

                rest_server = ProxyRESTServer(
                    rest_host=rest_host,
                    rest_port=rest_port,
                    routes=rest_routes,
                )
                self.rest_url = rest_server.rest_url
                self.datastore = rest_routes.datastore  # TODO: Maybe organize this better?

                tls_hosting_keypair = HostingKeypair(
                    common_name=self.checksum_public_address,
                    private_key=tls_private_key,
                    curve=tls_curve,
                    host=rest_host,
                    certificate=certificate,
                    certificate_dir=self.known_certificates_dir)

                tls_hosting_power = TLSHostingPower(rest_server=rest_server,
                                                    keypair=tls_hosting_keypair)

            else:
                # Unless the caller passed a crypto power, we'll make our own TLSHostingPower for this stranger.
                rest_server = ProxyRESTServer(
                    rest_host=rest_host,
                    rest_port=rest_port
                )
                if certificate or certificate_filepath:
                    tls_hosting_power = TLSHostingPower(rest_server=rest_server,
                                                        certificate_filepath=certificate_filepath,
                                                        certificate=certificate,
                                                        certificate_dir=self.known_certificates_dir,
                                                        common_name=self.checksum_public_address,)
                else:
                    tls_hosting_keypair = HostingKeypair(
                        common_name=self.checksum_public_address,
                        curve=tls_curve,
                        host=rest_host,
                        certificate_filepath=certificate_filepath,
                        certificate_dir=self.known_certificates_dir)

                    tls_hosting_power = TLSHostingPower(rest_server=rest_server,
                                                        keypair=tls_hosting_keypair)

            self._crypto_power.consume_power_up(tls_hosting_power)  # Make this work for not me for certificate to work

        else:
            self.log.info("Not adhering rest_server; we'll use the one on crypto_power..")

        certificate_filepath = self._crypto_power.power_ups(TLSHostingPower).keypair.certificate_filepath
        certificate = self._crypto_power.power_ups(TLSHostingPower).keypair.certificate
        # VerifiableNode.from_tls_hosting_power(tls_hosting_power=self._crypto_power.power_ups(TLSHostingPower))  # TODO: use classmethod
        VerifiableNode.__init__(self,
                                certificate=certificate,
                                certificate_filepath=certificate_filepath,
                                interface_signature=interface_signature)

        if is_me:
            message = "Initialized Self {} | {}".format(self.__class__.__name__, self.checksum_public_address)
            self.log.info(message)
        else:
            message = "Initialized Stranger {} | {}".format(self.__class__.__name__, self.checksum_public_address)
            self.log.debug(message)
Esempio n. 8
0
def create_node_certificate(host: str, checksum_address: str):
    tls_hosting_keypair = HostingKeypair(host=host,
                                         checksum_address=checksum_address)

    return tls_hosting_keypair.certificate
Esempio n. 9
0
    def __init__(
            self,

            # Ursula
            rest_host: str,
            rest_port: int,
            certificate: Certificate = None,
            certificate_filepath: str = None,
            tls_private_key=None,  # TODO: Derive from keyring
            db_name: str = None,
            db_filepath: str = None,
            is_me: bool = True,
            interface_signature=None,
            timestamp=None,

            # Blockchain
            miner_agent=None,
            checksum_address: str = None,

            # Character
            passphrase: str = None,
            abort_on_learning_error: bool = False,
            federated_only: bool = False,
            start_learning_now: bool = None,
            crypto_power=None,
            tls_curve: EllipticCurve = None,
            known_nodes: Iterable = None,
            **character_kwargs) -> None:

        #
        # Character
        #
        self._work_orders = list()
        Character.__init__(self,
                           is_me=is_me,
                           checksum_address=checksum_address,
                           start_learning_now=start_learning_now,
                           federated_only=federated_only,
                           crypto_power=crypto_power,
                           abort_on_learning_error=abort_on_learning_error,
                           known_nodes=known_nodes,
                           **character_kwargs)

        #
        # Self-Ursula
        #
        if is_me is True:  # TODO: 340
            self._stored_treasure_maps = dict()

            if not federated_only:
                Miner.__init__(self,
                               is_me=is_me,
                               miner_agent=miner_agent,
                               checksum_address=checksum_address)

                # Access staking node via node's transacting keys
                blockchain_power = BlockchainPower(
                    blockchain=self.blockchain,
                    account=self.checksum_public_address)
                self._crypto_power.consume_power_up(blockchain_power)

                # Use blockchain power to substantiate stamp
                self.substantiate_stamp(passphrase=passphrase)

        #
        # ProxyRESTServer and TLSHostingPower
        #
        if not crypto_power or (TLSHostingPower
                                not in crypto_power._power_ups):
            # TODO: Maybe we want _power_ups to be public after all?
            # We'll hook all the TLS stuff up unless the crypto_power was already passed.

            #
            # Self-Ursula
            #
            if is_me:
                self.suspicious_activities_witnessed = {
                    'vladimirs': [],
                    'bad_treasure_maps': []
                }

                #
                # REST Server
                #
                rest_routes = ProxyRESTRoutes(
                    db_name=db_name,
                    db_filepath=db_filepath,
                    network_middleware=self.network_middleware,
                    federated_only=self.federated_only,  # TODO: 466
                    treasure_map_tracker=self.treasure_maps,
                    node_tracker=self.known_nodes,
                    node_bytes_caster=self.__bytes__,
                    work_order_tracker=self._work_orders,
                    node_recorder=self.remember_node,
                    stamp=self.stamp,
                    verifier=self.verify_from,
                    suspicious_activity_tracker=self.
                    suspicious_activities_witnessed,
                    certificate_dir=self.known_certificates_dir,
                )

                rest_server = ProxyRESTServer(
                    rest_host=rest_host,
                    rest_port=rest_port,
                    routes=rest_routes,
                )
                self.rest_url = rest_server.rest_url
                self.datastore = rest_routes.datastore  # TODO: Maybe organize this better?

                #
                # TLSHostingPower
                #
                tls_hosting_keypair = HostingKeypair(
                    curve=tls_curve,
                    host=rest_host,
                    certificate=certificate,
                    certificate_filepath=certificate_filepath,
                    private_key=tls_private_key)

                tls_hosting_power = TLSHostingPower(
                    rest_server=rest_server, keypair=tls_hosting_keypair)

            #
            # Stranger-Ursula
            #
            else:

                # REST Server
                # Unless the caller passed a crypto power,
                # we'll make our own TLSHostingPower for this stranger.
                rest_server = ProxyRESTServer(rest_host=rest_host,
                                              rest_port=rest_port)

                #
                # TLSHostingPower
                #
                if certificate or certificate_filepath:
                    tls_hosting_power = TLSHostingPower(
                        rest_server=rest_server,
                        certificate_filepath=certificate_filepath,
                        certificate=certificate)
                else:
                    tls_hosting_keypair = HostingKeypair(
                        curve=tls_curve,
                        host=rest_host,
                        certificate_filepath=certificate_filepath)
                    tls_hosting_power = TLSHostingPower(
                        rest_server=rest_server, keypair=tls_hosting_keypair)

            # OK - Now we have a ProxyRestServer and a TLSHostingPower for some Ursula
            self._crypto_power.consume_power_up(tls_hosting_power)  # Consume!

        else:
            self.log.info(
                "Not adhering rest_server; Using the one on crypto_power.")

        #
        # Verifiable Node
        #
        certificate_filepath = self._crypto_power.power_ups(
            TLSHostingPower).keypair.certificate_filepath
        certificate = self._crypto_power.power_ups(
            TLSHostingPower).keypair.certificate
        VerifiableNode.__init__(self,
                                certificate=certificate,
                                certificate_filepath=certificate_filepath,
                                interface_signature=interface_signature,
                                timestamp=timestamp)

        #
        # Logging
        #
        if is_me:
            message = "Initialized Self {} | {}".format(
                self.__class__.__name__, self.checksum_public_address)
            self.log.info(message)
        else:
            message = "Initialized Stranger {} | {}".format(
                self.__class__.__name__, self.checksum_public_address)
            self.log.debug(message)