|
1 | 1 | import logging |
2 | | -import os |
3 | | -from pathlib import Path |
4 | | - |
5 | | -from cryptography.hazmat.backends import default_backend |
6 | | -from cryptography.hazmat.primitives import serialization |
7 | | -from cryptography.hazmat.primitives.asymmetric import rsa |
8 | 2 |
|
9 | 3 | from job_executor.adapter import datastore_api |
10 | 4 | from job_executor.adapter.datastore_api.models import JobStatus |
|
25 | 19 | UnnecessaryUpdateException, |
26 | 20 | VersioningException, |
27 | 21 | ) |
28 | | -from job_executor.config import environment |
29 | 22 | from job_executor.domain.models import JobContext |
30 | 23 | from job_executor.domain.rollback import ( |
31 | 24 | rollback_bump, |
32 | 25 | rollback_manager_phase_import_job, |
33 | 26 | ) |
| 27 | +from job_executor.domain.rsa_keys import generate_rsa_key_pair |
34 | 28 |
|
35 | 29 | logger = logging.getLogger() |
36 | 30 |
|
@@ -605,55 +599,34 @@ def generate_rsa_keys( |
605 | 599 | """ |
606 | 600 | job_id = job_context.job.job_id |
607 | 601 | datastore_rdn = job_context.job.datastore_rdn |
| 602 | + private_keys_dir = job_context.local_storage.private_keys_dir |
608 | 603 | try: |
609 | 604 | logger.info(f"{job_id}: initiated") |
610 | 605 | datastore_api.update_job_status(job_id, JobStatus.INITIATED) |
611 | 606 |
|
612 | | - target_dir = Path(environment.private_keys_dir) / datastore_rdn |
613 | | - |
614 | | - if not target_dir.exists(): |
615 | | - logger.info( |
616 | | - f"{job_id}: Creating private keys directory at {target_dir}" |
617 | | - ) |
618 | | - os.makedirs(target_dir) |
619 | | - |
620 | | - logger.info(f"{job_id}: Generating RSA key pair") |
621 | | - private_key = rsa.generate_private_key( |
622 | | - public_exponent=65537, key_size=2048, backend=default_backend() |
623 | | - ) |
624 | | - public_key = private_key.public_key() |
625 | | - |
626 | | - microdata_private_key_pem = private_key.private_bytes( |
627 | | - encoding=serialization.Encoding.PEM, |
628 | | - format=serialization.PrivateFormat.PKCS8, |
629 | | - encryption_algorithm=serialization.NoEncryption(), |
| 607 | + logger.info( |
| 608 | + f"{job_id}: Checking private keys directory at " |
| 609 | + f"{private_keys_dir.path_with_rdn}" |
630 | 610 | ) |
| 611 | + if private_keys_dir.create(): |
| 612 | + logger.info(f"{job_id}: Private keys directory created") |
631 | 613 |
|
632 | | - private_key_location = target_dir / "microdata_private_key.pem" |
633 | | - with open(private_key_location, "wb") as file: |
634 | | - file.write(microdata_private_key_pem) |
635 | | - logger.info(f"{job_id}: Saved private key to {private_key_location}") |
| 614 | + logger.info(f"{job_id}: Generating RSA key pair") |
| 615 | + private_key_pem, public_key_pem = generate_rsa_key_pair() |
636 | 616 |
|
637 | | - microdata_public_key_pem = public_key.public_bytes( |
638 | | - encoding=serialization.Encoding.PEM, |
639 | | - format=serialization.PublicFormat.SubjectPublicKeyInfo, |
640 | | - ) |
| 617 | + private_keys_dir.save_private_key(private_key_pem) |
| 618 | + logger.info(f"{job_id}: Saved private key") |
641 | 619 |
|
642 | 620 | try: |
643 | 621 | logger.info(f"{job_id}: Posting public key to datastore-api") |
644 | | - datastore_api.post_public_key( |
645 | | - datastore_rdn, microdata_public_key_pem |
646 | | - ) |
| 622 | + datastore_api.post_public_key(datastore_rdn, public_key_pem) |
647 | 623 | except Exception as post_error: |
648 | 624 | logger.error( |
649 | 625 | f"{job_id}: Failed to post public key to datastore-api, " |
650 | 626 | "cleaning up saved private key" |
651 | 627 | ) |
652 | | - if private_key_location.exists(): |
653 | | - os.remove(private_key_location) |
654 | | - logger.info( |
655 | | - f"{job_id}: Deleted private key at {private_key_location}" |
656 | | - ) |
| 628 | + if private_keys_dir.clean_up(): |
| 629 | + logger.info(f"{job_id}: Deleted private key due to error") |
657 | 630 | raise post_error |
658 | 631 |
|
659 | 632 | logger.info(f"{job_id}: completed") |
|
0 commit comments