| 41 | |
| 42 | |
| 43 | class KeyManager: |
| 44 | def __init__(self, repository): |
| 45 | self.repository = repository |
| 46 | self.keyblob = None |
| 47 | self.keyblob_storage = None |
| 48 | |
| 49 | manifest_chunk = repository.get_manifest() |
| 50 | manifest_data = RepoObj.extract_crypted_data(manifest_chunk) |
| 51 | key = identify_key(manifest_data) |
| 52 | self.keyblob_storage = key.STORAGE |
| 53 | if self.keyblob_storage == KeyBlobStorage.NO_STORAGE: |
| 54 | raise UnencryptedRepo() |
| 55 | |
| 56 | def load_keyblob(self): |
| 57 | if self.keyblob_storage == KeyBlobStorage.KEYFILE: |
| 58 | k = CHPOKeyfileKey(self.repository) |
| 59 | target = k.find_key() |
| 60 | with open(target) as fd: |
| 61 | self.keyblob = "".join(fd.readlines()[1:]) |
| 62 | |
| 63 | elif self.keyblob_storage == KeyBlobStorage.REPO: |
| 64 | key_data = self.repository.load_key().decode() |
| 65 | if not key_data: |
| 66 | # if we got an empty key, it means there is no key. |
| 67 | loc = self.repository._location.canonical_path() |
| 68 | raise RepoKeyNotFoundError(loc) from None |
| 69 | self.keyblob = key_data |
| 70 | |
| 71 | def store_keyblob(self, args): |
| 72 | if self.keyblob_storage == KeyBlobStorage.KEYFILE: |
| 73 | k = CHPOKeyfileKey(self.repository) |
| 74 | target = k.get_existing_or_new_target(args) |
| 75 | |
| 76 | self.store_keyfile(target) |
| 77 | elif self.keyblob_storage == KeyBlobStorage.REPO: |
| 78 | self.repository.save_key(self.keyblob.encode("utf-8")) |
| 79 | |
| 80 | def get_keyfile_data(self): |
| 81 | data = f"{CHPOKeyfileKey.FILE_ID} {bin_to_hex(self.repository.id)}\n" |
| 82 | data += self.keyblob |
| 83 | if not self.keyblob.endswith("\n"): |
| 84 | data += "\n" |
| 85 | return data |
| 86 | |
| 87 | def store_keyfile(self, target): |
| 88 | with dash_open(target, "w") as fd: |
| 89 | fd.write(self.get_keyfile_data()) |
| 90 | |
| 91 | def export(self, path): |
| 92 | if path is None: |
| 93 | path = "-" |
| 94 | |
| 95 | self.store_keyfile(path) |
| 96 | |
| 97 | def export_qr(self, path): |
| 98 | if path is None: |
| 99 | path = "-" |
| 100 |
no outgoing calls
no test coverage detected