From a5ba0abe42aed8e00d5092d430ead0eee90bc849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Sipma?= Date: Fri, 22 Apr 2016 19:48:26 +0200 Subject: [PATCH] support new env var 'BORG_KEY_FILE' --- borg/key.py | 32 ++++++++++++++++++++++++++++---- docs/usage.rst | 2 ++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/borg/key.py b/borg/key.py index 0786a49da..81bf69756 100644 --- a/borg/key.py +++ b/borg/key.py @@ -35,6 +35,14 @@ class KeyfileNotFoundError(Error): """No key file for repository {} found in {}.""" +class KeyfileInvalidError(Error): + """Invalid key file for repository {} found in {}.""" + + +class KeyfileMismatchError(Error): + """Mismatch between repository {} and key file {}.""" + + class RepoKeyNotFoundError(Error): """No key entry found in the config of repository {}.""" @@ -404,17 +412,33 @@ class KeyfileKey(KeyfileKeyBase): TYPE = 0x00 FILE_ID = 'BORG_KEY' + def sanity_check(self, filename, id): + with open(filename, 'r') as fd: + line = fd.readline().strip() + if not line.startswith(self.FILE_ID): + raise KeyfileInvalidError(self.repository._location.canonical_path(), filename) + if line[len(self.FILE_ID) + 1:] != id: + raise KeyfileMismatchError(self.repository._location.canonical_path(), filename) + return filename + def find_key(self): + id = self.repository.id_str + keyfile = os.environ.get('BORG_KEY_FILE') + if keyfile: + return self.sanity_check(keyfile, id) keys_dir = get_keys_dir() for name in os.listdir(keys_dir): filename = os.path.join(keys_dir, name) - with open(filename, 'r') as fd: - line = fd.readline().strip() - if line.startswith(self.FILE_ID) and line[len(self.FILE_ID) + 1:] == self.repository.id_str: - return filename + try: + return self.sanity_check(filename, id) + except (KeyfileInvalidError, KeyfileMismatchError): + pass raise KeyfileNotFoundError(self.repository._location.canonical_path(), get_keys_dir()) def get_new_target(self, args): + keyfile = os.environ.get('BORG_KEY_FILE') + if keyfile: + return keyfile filename = args.location.to_key_filename() path = filename i = 1 diff --git a/docs/usage.rst b/docs/usage.rst index 64ee75076..9cbb4503d 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -77,6 +77,8 @@ General: When set, use the value to answer the passphrase question for encrypted repositories. BORG_DISPLAY_PASSPHRASE When set, use the value to answer the "display the passphrase for verification" question when defining a new passphrase for encrypted repositories. + BORG_KEY_FILE + When set, use the given filename as repository key file. BORG_LOGGING_CONF When set, use the given filename as INI_-style logging configuration. BORG_RSH