Browse Source

Merge pull request #3715 from milkey-mouse/getpass-ux-bp1.1

improve getpass user experience (1.1 backport)
TW 7 years ago
parent
commit
8c40c19508
1 changed files with 17 additions and 1 deletions
  1. 17 1
      src/borg/crypto/key.py

+ 17 - 1
src/borg/crypto/key.py

@@ -32,6 +32,10 @@ from .low_level import AES, bytes_to_long, bytes_to_int, num_aes_blocks, hmac_sh
 PREFIX = b'\0' * 8
 PREFIX = b'\0' * 8
 
 
 
 
+class NoPassphraseFailure(Error):
+    """can not acquire a passphrase: {}"""
+
+
 class PassphraseWrong(Error):
 class PassphraseWrong(Error):
     """passphrase supplied in BORG_PASSPHRASE or by BORG_PASSCOMMAND is incorrect."""
     """passphrase supplied in BORG_PASSPHRASE or by BORG_PASSCOMMAND is incorrect."""
 
 
@@ -451,7 +455,19 @@ class Passphrase(str):
 
 
     @classmethod
     @classmethod
     def getpass(cls, prompt):
     def getpass(cls, prompt):
-        return cls(getpass.getpass(prompt))
+        try:
+            pw = getpass.getpass(prompt)
+        except EOFError:
+            if prompt:
+                print()  # avoid err msg appearing right of prompt
+            msg = []
+            for env_var in 'BORG_PASSPHRASE', 'BORG_PASSCOMMAND':
+                env_var_set = os.environ.get(env_var) is not None
+                msg.append('%s is %s.' % (env_var, 'set' if env_var_set else 'not set'))
+            msg.append('Interactive password query failed.')
+            raise NoPassphraseFailure(' '.join(msg)) from None
+        else:
+            return cls(pw)
 
 
     @classmethod
     @classmethod
     def verification(cls, passphrase):
     def verification(cls, passphrase):