def main(app_config):
    # find certificates to process
    certificates = find_unsigned_certificates(app_config)
    if not certificates:
        logging.info('No certificates to process')
        exit(0)

    batch_id = helpers.get_batch_id(list(certificates.keys()))
    logging.info('Processing %d certificates with batch id=%s',
                 len(certificates), batch_id)

    # validate schema
    for uid, certificate in certificates.items():
        with open(certificate.unsigned_certificate_file_name) as cert:
            cert_json = json.load(cert)
            schema_validator.validate_unsigned_v1_2(cert_json)

    # ensure they are not already signed. We want the user to know about this in case there
    # is a failure from a previous run
    for uid, certificate in certificates.items():
        with open(certificate.unsigned_certificate_file_name) as cert:
            cert_json = json.load(cert)
            if 'signature' in cert_json and cert_json['signature']:
                logging.warning(
                    'Certificate with uid=%s has already been signed.', uid)
                exit(0)

    logging.info('Signing certificates and writing to folder %s',
                 app_config.signed_certs_file_pattern)
    sign_certs(certificates)

    logging.info('Archiving unsigned files to archive folder %s', batch_id)
    helpers.archive_files(app_config.unsigned_certs_file_pattern,
                          app_config.archive_path,
                          app_config.unsigned_certs_file_part, batch_id)
def main(app_config):
    # find certificates to process
    certificates = find_unsigned_certificates(app_config)
    if not certificates:
        logging.info('No certificates to process')
        exit(0)

    batch_id = helpers.get_batch_id(list(certificates.keys()))
    logging.info('Processing %d certificates with batch id=%s', len(certificates), batch_id)

    # validate schema
    for uid, certificate in certificates.items():
        with open(certificate.unsigned_certificate_file_name) as cert:
            cert_json = json.load(cert)
            schema_validator.validate_unsigned_v1_2(cert_json)

    # ensure they are not already signed. We want the user to know about this in case there
    # is a failure from a previous run
    for uid, certificate in certificates.items():
        with open(certificate.unsigned_certificate_file_name) as cert:
            cert_json = json.load(cert)
            if 'signature' in cert_json and cert_json['signature']:
                logging.warning('Certificate with uid=%s has already been signed.', uid)
                exit(0)

    logging.info('Signing certificates and writing to folder %s', app_config.signed_certs_file_pattern)
    sign_certs(certificates)

    logging.info('Archiving unsigned files to archive folder %s', batch_id)
    helpers.archive_files(app_config.unsigned_certs_file_pattern,
                          app_config.archive_path,
                          app_config.unsigned_certs_file_part,
                          batch_id)
Example #3
0
def main(app_config):
    # find certificates to process
    certificates = find_signed_certificates(app_config)
    if not certificates:
        logging.info('No certificates to process')
        exit(0)

    batch_id = helpers.get_batch_id(list(certificates.keys()))
    logging.info('Processing %d certificates with batch id=%s', len(certificates), batch_id)

    helpers.clear_intermediate_folders(app_config)

    # get issuing and revocation addresses from config
    issuing_address = app_config.issuing_address
    revocation_address = app_config.revocation_address

    issuer = BatchIssuer(config=app_config, certificates_to_issue=certificates)

    issuer.validate_schema()

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

    wallet = Wallet()

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

    # calculate transaction costs
    all_costs = issuer.get_cost_for_certificate_batch(app_config.transfer_from_storage_address)

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

    if app_config.transfer_from_storage_address:
        # ensure there is enough in our wallet at the storage/issuing address, transferring from the storage address
        # if configured
        logging.info('Checking there is enough balance in the issuing address')
        funds_needed = wallet.check_balance_no_throw(issuing_address, all_costs)
        if funds_needed > 0:
            wallet.check_balance(app_config.storage_address, all_costs)
            wallet.send_payment(
                app_config.storage_address,
                issuing_address,
                all_costs.min_per_output,
                all_costs.fee)

    # ensure the issuing address now has sufficient balance
    wallet.check_balance(issuing_address, all_costs)

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

    # archive
    logging.info('Archiving signed certificates.')
    helpers.archive_files(app_config.signed_certs_file_pattern,
                          app_config.archive_path,
                          app_config.signed_certs_file_part,
                          batch_id)

    logging.info('Archiving sent transactions.')
    helpers.archive_files(app_config.sent_txs_file_pattern,
                          app_config.archive_path,
                          app_config.txs_file_part,
                          batch_id)

    logging.info('Archiving receipts.')
    helpers.archive_files(app_config.receipts_file_pattern,
                          app_config.archive_path,
                          app_config.receipts_file_part,
                          batch_id)

    logging.info('Archiving blockchain certificates.')
    helpers.archive_files(app_config.blockchain_certificates_file_pattern,
                          app_config.archive_path,
                          app_config.blockchain_certificates_file_part,
                          batch_id)

    archive_folder = os.path.join(app_config.archive_path, batch_id)
    logging.info('Your Blockchain Certificates are in %s', archive_folder)
Example #4
0
def main(app_config):

    # find certificates to process
    certificates = find_signed_certificates(app_config)
    if not certificates:
        logging.info('No certificates to process')
        exit(0)

    batch_id = helpers.get_batch_id(list(certificates.keys()))
    logging.info('Processing %d certificates with batch id=%s',
                 len(certificates), batch_id)

    helpers.clear_intermediate_folders(app_config)

    # get issuing and revocation addresses from config
    issuing_address = app_config.issuing_address
    revocation_address = app_config.revocation_address

    issuer = V1_2_Issuer(config=app_config, certificates_to_issue=certificates)

    issuer.validate_schema()

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

    allowable_wif_prefixes = app_config.allowable_wif_prefixes

    # configure bitcoin wallet and broadcast connectors
    wallet = Wallet(connectors.create_wallet_connector(app_config))
    broadcast_function = connectors.create_broadcast_function(app_config)

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

    # calculate transaction costs
    all_costs = issuer.get_cost_for_certificate_batch(
        app_config.dust_threshold, app_config.tx_fee,
        app_config.satoshi_per_byte, app_config.transfer_from_storage_address)

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

    split_input_trxs = False
    if app_config.transfer_from_storage_address:
        # ensure there is enough in our wallet at the storage/issuing address, transferring from the storage address
        # if configured
        logging.info('Checking there is enough balance in the issuing address')
        funds_needed = wallet.calculate_funds_needed(issuing_address,
                                                     all_costs)
        if funds_needed > 0:
            wallet.check_balance(app_config.storage_address, all_costs)
            wallet.transfer_balance(app_config.storage_address,
                                    issuing_address, all_costs)
            split_input_trxs = True

    # ensure the issuing address now has sufficient balance
    wallet.check_balance(issuing_address, all_costs.issuing_transaction_cost)

    # issue the certificates on the blockchain
    logging.info('Issuing the certificates on the blockchain')
    issuer.issue_on_blockchain(
        wallet=wallet,
        revocation_address=revocation_address,
        split_input_trxs=split_input_trxs,
        allowable_wif_prefixes=allowable_wif_prefixes,
        broadcast_function=broadcast_function,
        issuing_transaction_cost=all_costs.issuing_transaction_cost)

    # archive
    logging.info('Archiving signed certificates.')
    helpers.archive_files(app_config.signed_certs_file_pattern,
                          app_config.archive_path,
                          app_config.signed_certs_file_part, batch_id)

    logging.info('Archiving sent transactions.')
    helpers.archive_files(app_config.sent_txs_file_pattern,
                          app_config.archive_path, app_config.txs_file_part,
                          batch_id)

    logging.info('Archiving receipts.')
    helpers.archive_files(app_config.receipts_file_pattern,
                          app_config.archive_path,
                          app_config.receipts_file_part, batch_id)

    logging.info('Archiving blockchain certificates.')
    helpers.archive_files(app_config.blockchain_certificates_file_pattern,
                          app_config.archive_path,
                          app_config.blockchain_certificates_file_part,
                          batch_id)

    archive_folder = os.path.join(app_config.archive_path, batch_id)
    logging.info('Your Blockchain Certificates are in %s', archive_folder)