2
0
Эх сурвалжийг харах

Merge pull request #6046 from Killamus/fix_overwrite_keys

Disallow overwriting of existing keyfiles on init
TW 3 жил өмнө
parent
commit
1a6437d8ca

+ 11 - 6
src/borg/crypto/key.py

@@ -679,12 +679,12 @@ class KeyfileKeyBase(AESKeyBase):
         key.init_from_random_data()
         key.init_from_random_data()
         key.init_ciphers()
         key.init_ciphers()
         target = key.get_new_target(args)
         target = key.get_new_target(args)
-        key.save(target, passphrase)
+        key.save(target, passphrase, create=True)
         logger.info('Key in "%s" created.' % target)
         logger.info('Key in "%s" created.' % target)
         logger.info('Keep this key safe. Your data will be inaccessible without it.')
         logger.info('Keep this key safe. Your data will be inaccessible without it.')
         return key
         return key
 
 
-    def save(self, target, passphrase):
+    def save(self, target, passphrase, create=False):
         raise NotImplementedError
         raise NotImplementedError
 
 
     def get_new_target(self, args):
     def get_new_target(self, args):
@@ -767,7 +767,12 @@ class KeyfileKey(ID_HMAC_SHA_256, KeyfileKeyBase):
             self.target = target
             self.target = target
         return success
         return success
 
 
-    def save(self, target, passphrase):
+    def save(self, target, passphrase, create=False):
+        if create and os.path.isfile(target):
+            # if a new keyfile key repository is created, ensure that an existing keyfile of another
+            # keyfile key repo is not accidentally overwritten by careless use of the BORG_KEY_FILE env var.
+            # see issue #6036
+            raise Error('Aborting because key in "%s" already exists.' % target)
         key_data = self._save(passphrase)
         key_data = self._save(passphrase)
         with SaveFile(target) as fd:
         with SaveFile(target) as fd:
             fd.write('%s %s\n' % (self.FILE_ID, bin_to_hex(self.repository_id)))
             fd.write('%s %s\n' % (self.FILE_ID, bin_to_hex(self.repository_id)))
@@ -807,7 +812,7 @@ class RepoKey(ID_HMAC_SHA_256, KeyfileKeyBase):
             self.target = target
             self.target = target
         return success
         return success
 
 
-    def save(self, target, passphrase):
+    def save(self, target, passphrase, create=False):
         self.logically_encrypted = passphrase != ''
         self.logically_encrypted = passphrase != ''
         key_data = self._save(passphrase)
         key_data = self._save(passphrase)
         key_data = key_data.encode('utf-8')  # remote repo: msgpack issue #99, giving bytes
         key_data = key_data.encode('utf-8')  # remote repo: msgpack issue #99, giving bytes
@@ -845,8 +850,8 @@ class AuthenticatedKeyBase(RepoKey):
         self.logically_encrypted = False
         self.logically_encrypted = False
         return success
         return success
 
 
-    def save(self, target, passphrase):
-        super().save(target, passphrase)
+    def save(self, target, passphrase, create=False):
+        super().save(target, passphrase, create=create)
         self.logically_encrypted = False
         self.logically_encrypted = False
 
 
     def init_ciphers(self, manifest_data=None):
     def init_ciphers(self, manifest_data=None):