ui: check EOF of getpass() response read from command-server channel
authorYuya Nishihara <yuya@tcha.org>
Sat, 14 Jan 2017 20:31:35 +0900
changeset 30814 b96c57c1f860
parent 30813 2cbbd4622ab0
child 30815 c5bf2e8ec18c
ui: check EOF of getpass() response read from command-server channel readline() returns '' only when EOF is encountered, in which case, Python's getpass() raises EOFError. We should do the same to abort the session as "response expected." This bug was reported to https://bitbucket.org/tortoisehg/thg/issues/4659/
mercurial/ui.py
tests/test-commandserver.t
--- a/mercurial/ui.py	Fri Jan 13 23:21:10 2017 -0800
+++ b/mercurial/ui.py	Sat Jan 14 20:31:35 2017 +0900
@@ -972,7 +972,10 @@
             # disable getpass() only if explicitly specified. it's still valid
             # to interact with tty even if fin is not a tty.
             if self.configbool('ui', 'nontty'):
-                return self.fin.readline().rstrip('\n')
+                l = self.fin.readline()
+                if not l:
+                    raise EOFError
+                return l.rstrip('\n')
             else:
                 return getpass.getpass('')
         except EOFError:
--- a/tests/test-commandserver.t	Fri Jan 13 23:21:10 2017 -0800
+++ b/tests/test-commandserver.t	Sat Jan 14 20:31:35 2017 +0900
@@ -607,6 +607,12 @@
   ...     runcommand(server, ['debuggetpass', '--config',
   ...                         'ui.interactive=True'],
   ...                input=stringio('1234\n'))
+  ...     runcommand(server, ['debuggetpass', '--config',
+  ...                         'ui.interactive=True'],
+  ...                input=stringio('\n'))
+  ...     runcommand(server, ['debuggetpass', '--config',
+  ...                         'ui.interactive=True'],
+  ...                input=stringio(''))
   ...     runcommand(server, ['debugprompt', '--config',
   ...                         'ui.interactive=True'],
   ...                input=stringio('5678\n'))
@@ -614,6 +620,11 @@
   ...     runcommand(server, ['debugwritestdout'])
   *** runcommand debuggetpass --config ui.interactive=True
   password: 1234
+  *** runcommand debuggetpass --config ui.interactive=True
+  password: 
+  *** runcommand debuggetpass --config ui.interactive=True
+  password: abort: response expected
+   [255]
   *** runcommand debugprompt --config ui.interactive=True
   prompt: 5678
   *** runcommand debugreadstdin