def issue(app_config, certificate_batch_handler, transaction_handler):
    unsigned_certs_dir = app_config.unsigned_certificates_dir
    signed_certs_dir = app_config.signed_certificates_dir
    blockchain_certificates_dir = app_config.blockchain_certificates_dir
    work_dir = app_config.work_dir

    certificates_metadata = helpers.prepare_issuance_batch(
        unsigned_certs_dir, signed_certs_dir, blockchain_certificates_dir,
        work_dir)
    num_certificates = len(certificates_metadata)
    if num_certificates < 1:
        logging.warning('No certificates to process')
        return None

    logging.info('Processing %d certificates under work path=%s',
                 num_certificates, work_dir)
    certificate_batch_handler.set_certificates_in_batch(certificates_metadata)

    transaction_handler.ensure_balance()

    issuer = Issuer(certificate_batch_handler=certificate_batch_handler,
                    transaction_handler=transaction_handler,
                    max_retry=app_config.max_retry)
    tx_id = issuer.issue(app_config.bitcoin_chain)

    helpers.copy_output(certificates_metadata)

    logging.info('Your Blockchain Certificates are in %s',
                 blockchain_certificates_dir)
    return tx_id
def issue(app_config, certificate_batch_handler, transaction_handler):
    unsigned_certs_dir = app_config.unsigned_certificates_dir
    signed_certs_dir = app_config.signed_certificates_dir
    blockchain_certificates_dir = app_config.blockchain_certificates_dir
    work_dir = app_config.work_dir

    certificates_metadata = helpers.prepare_issuance_batch(unsigned_certs_dir, signed_certs_dir,
                                                           blockchain_certificates_dir, work_dir)
    num_certificates = len(certificates_metadata)
    if num_certificates < 1:
        logging.warning('No certificates to process')
        return None

    logging.info('Processing %d certificates under work path=%s', num_certificates, work_dir)
    certificate_batch_handler.set_certificates_in_batch(certificates_metadata)

    transaction_handler.ensure_balance()

    issuer = Issuer(
        certificate_batch_handler=certificate_batch_handler,
        transaction_handler=transaction_handler,
        max_retry=app_config.max_retry)
    tx_id = issuer.issue(app_config.bitcoin_chain)

    helpers.copy_output(certificates_metadata)

    logging.info('Your Blockchain Certificates are in %s', blockchain_certificates_dir)
    return tx_id
Beispiel #3
0
    def _process_directories(self, config):
        unsigned_certs_dir = config.unsigned_certificates_dir
        signed_certs_dir = config.signed_certificates_dir
        blockchain_certificates_dir = config.blockchain_certificates_dir
        work_dir = config.work_dir

        certificates_metadata = helpers.prepare_issuance_batch(
            unsigned_certs_dir, signed_certs_dir, blockchain_certificates_dir,
            work_dir)

        num_certificates = len(certificates_metadata)

        if num_certificates < 1:
            return None

        logging.info('Processing %d certificates under work path=%s',
                     num_certificates, work_dir)
        self.set_certificates_in_batch(certificates_metadata)
    def _process_directories(self, config):
        unsigned_certs_dir = config.unsigned_certificates_dir
        signed_certs_dir = config.signed_certificates_dir
        blockchain_certificates_dir = config.blockchain_certificates_dir
        work_dir = config.work_dir
        
        certificates_metadata = helpers.prepare_issuance_batch(
                unsigned_certs_dir,
                signed_certs_dir,
                blockchain_certificates_dir,
                work_dir)

        num_certificates = len(certificates_metadata)

        if num_certificates < 1:
            return None

        logging.info('Processing %d certificates under work path=%s', num_certificates, work_dir)
        self.set_certificates_in_batch(certificates_metadata)
def main(app_config):
    unsigned_certs_dir = app_config.unsigned_certificates_dir
    signed_certs_dir = app_config.signed_certificates_dir
    blockcerts_dir = app_config.blockchain_certificates_dir
    work_dir = app_config.work_dir

    # find certificates to issue
    certificates = helpers.find_certificates_to_process(
        unsigned_certs_dir, signed_certs_dir)
    if not certificates:
        logging.warning('No certificates to process')
        raise NoCertificatesFoundError('No certificates to process')

    certificates, batch_metadata = helpers.prepare_issuance_batch(
        unsigned_certs_dir, signed_certs_dir, work_dir)
    logging.info('Processing %d certificates under work path=%s',
                 len(certificates), work_dir)

    issuing_address = app_config.issuing_address
    revocation_address = app_config.revocation_address

    if app_config.wallet_connector_type == 'blockchain.info':
        wallet_credentials = {
            'wallet_guid': app_config.wallet_guid,
            'wallet_password': app_config.wallet_password,
            'api_key': app_config.api_key,
        }
    else:
        wallet_credentials = {}

    connector = ServiceProviderConnector(app_config.netcode,
                                         app_config.wallet_connector_type,
                                         wallet_credentials)
    path_to_secret = os.path.join(app_config.usb_name, app_config.key_file)

    signer = Signer(
        FileSecretManager(path_to_secret=path_to_secret,
                          disable_safe_mode=app_config.safe_mode))
    tx_constants = TransactionCostConstants(app_config.tx_fee,
                                            app_config.dust_threshold,
                                            app_config.satoshi_per_byte)

    issuer = BatchIssuer(netcode=app_config.netcode,
                         issuing_address=issuing_address,
                         certificates_to_issue=certificates,
                         connector=connector,
                         signer=signer,
                         tx_cost_constants=tx_constants,
                         batch_metadata=batch_metadata)

    issuer.validate_schema()

    # verify signed certs are signed with issuing key
    [
        verify_signature(uid, cert.signed_cert_file_name, issuing_address)
        for uid, cert in certificates.items()
    ]

    logging.info('Hashing signed certificates.')
    issuer.hash_certificates()

    # calculate transaction cost
    transaction_cost = issuer.calculate_cost_for_certificate_batch()

    logging.info('Total cost will be %d satoshis', transaction_cost)

    # ensure the issuing address has sufficient balance
    balance = connector.get_balance(issuing_address)

    if transaction_cost > balance:
        error_message = 'Please add {} satoshis to the address {}'.format(
            transaction_cost - balance, issuing_address)
        logging.error(error_message)
        raise InsufficientFundsError(error_message)

    # issue the certificates on the blockchain
    logging.info('Issuing the certificates on the blockchain')
    issuer.issue_on_blockchain(revocation_address=revocation_address)

    blockcerts_tmp_dir = os.path.join(work_dir,
                                      helpers.BLOCKCHAIN_CERTIFICATES_DIR)
    if not os.path.exists(blockcerts_dir):
        os.makedirs(blockcerts_dir)
    for item in os.listdir(blockcerts_tmp_dir):
        s = os.path.join(blockcerts_tmp_dir, item)
        d = os.path.join(blockcerts_dir, item)
        shutil.copy2(s, d)

    logging.info('Your Blockchain Certificates are in %s', blockcerts_dir)
    return blockcerts_dir
def main(app_config, secure_signer=None):
    unsigned_certs_dir = app_config.unsigned_certificates_dir
    signed_certs_dir = app_config.signed_certificates_dir
    blockchain_certificates_dir = app_config.blockchain_certificates_dir
    work_dir = app_config.work_dir
    v2 = app_config.v2
    issuing_address = app_config.issuing_address
    revocation_address = app_config.revocation_address  # not needed for v2

    certificates, batch_metadata = helpers.prepare_issuance_batch(
        unsigned_certs_dir, signed_certs_dir, blockchain_certificates_dir,
        work_dir)
    logging.info('Processing %d certificates under work path=%s',
                 len(certificates), work_dir)

    logging.info('Signing certificates...')
    if not secure_signer:
        secure_signer = secure_signer_helper.initialize_secure_signer(
            app_config)
    connector = ServiceProviderConnector(app_config.bitcoin_chain)
    tx_constants = TransactionCostConstants(app_config.tx_fee,
                                            app_config.dust_threshold,
                                            app_config.satoshi_per_byte)

    if v2:
        certificate_handler = CertificateV2Handler()
        transaction_handler = TransactionV2Handler(
            tx_cost_constants=tx_constants, issuing_address=issuing_address)
    else:
        certificate_handler = CertificateV1_2Handler()
        transaction_handler = TransactionV1_2Handler(
            tx_cost_constants=tx_constants,
            issuing_address=issuing_address,
            certificates_to_issue=certificates,
            revocation_address=revocation_address)
    certificate_batch_handler = CertificateBatchHandler(
        certificates_to_issue=certificates,
        certificate_handler=certificate_handler)
    issuer = Issuer(issuing_address=issuing_address,
                    connector=connector,
                    secure_signer=secure_signer,
                    certificate_batch_handler=certificate_batch_handler,
                    transaction_handler=transaction_handler)
    transaction_cost = issuer.calculate_cost_for_certificate_batch()
    logging.info('Total cost will be %d satoshis', transaction_cost)

    # ensure the issuing address has sufficient balance
    balance = connector.get_balance(issuing_address)

    if transaction_cost > balance:
        error_message = 'Please add {} satoshis to the address {}'.format(
            transaction_cost - balance, issuing_address)
        logging.error(error_message)
        raise InsufficientFundsError(error_message)

    tx_id = issuer.issue_certificates()

    blockcerts_tmp_dir = os.path.join(work_dir,
                                      helpers.BLOCKCHAIN_CERTIFICATES_DIR)
    if not os.path.exists(blockchain_certificates_dir):
        os.makedirs(blockchain_certificates_dir)
    for item in os.listdir(blockcerts_tmp_dir):
        s = os.path.join(blockcerts_tmp_dir, item)
        d = os.path.join(blockchain_certificates_dir, item)
        shutil.copy2(s, d)

    logging.info('Your Blockchain Certificates are in %s',
                 blockchain_certificates_dir)
    return tx_id