|
@@ -36,7 +36,7 @@ class NoPassphraseFailure(Error):
|
|
|
|
|
|
|
|
|
class PassphraseWrong(Error):
|
|
|
- """passphrase supplied in BORG_PASSPHRASE or by BORG_PASSCOMMAND is incorrect."""
|
|
|
+ """passphrase supplied in BORG_PASSPHRASE, by BORG_PASSCOMMAND or via BORG_PASSPHRASE_FD is incorrect."""
|
|
|
|
|
|
|
|
|
class PasscommandFailure(Error):
|
|
@@ -429,6 +429,9 @@ class Passphrase(str):
|
|
|
passphrase = cls.env_passcommand()
|
|
|
if passphrase is not None:
|
|
|
return passphrase
|
|
|
+ passphrase = cls.fd_passphrase()
|
|
|
+ if passphrase is not None:
|
|
|
+ return passphrase
|
|
|
|
|
|
@classmethod
|
|
|
def env_passcommand(cls, default=None):
|
|
@@ -442,6 +445,16 @@ class Passphrase(str):
|
|
|
raise PasscommandFailure(e)
|
|
|
return cls(passphrase.rstrip('\n'))
|
|
|
|
|
|
+ @classmethod
|
|
|
+ def fd_passphrase(cls):
|
|
|
+ try:
|
|
|
+ fd = int(os.environ.get('BORG_PASSPHRASE_FD'))
|
|
|
+ except (ValueError, TypeError):
|
|
|
+ return None
|
|
|
+ with os.fdopen(fd, mode='r') as f:
|
|
|
+ passphrase = f.read()
|
|
|
+ return cls(passphrase.rstrip('\n'))
|
|
|
+
|
|
|
@classmethod
|
|
|
def env_new_passphrase(cls, default=None):
|
|
|
return cls._env_passphrase('BORG_NEW_PASSPHRASE', default)
|