git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] git-svn, perl/Git.pm: add central method for prompting passwords honoring GIT_ASKPASS and SSH_ASKPASS

From
Jakub Narebski <jnareb@gmail.com>
Date
Dec 28, 2011, 18:56 UTC
Message-ID
<201112281956.30289.jnareb@gmail.com>
In-Reply-To
<7vboqt2zm4.fsf@alter.siamese.dyndns.org>
Junio C Hamano wrote:
> Sven Strickroth <sven.strickroth@tu-clausthal.de> writes:
Show 27 quoted lines
> I only have a few minor nits, and request for extra set of eyeballs from
> Perl-y people.
> 
> >  sub _read_password {
> >  	my ($prompt, $realm) = @_;
> > -	my $password = '';
> > -	if (exists $ENV{GIT_ASKPASS}) {
> > -		open(PH, "-|", $ENV{GIT_ASKPASS}, $prompt);
> > -		$password = <PH>;
> > -		$password =~ s/[\012\015]//; # \n\r
> > - ...
> > -		while (defined(my $key = Term::ReadKey::ReadKey(0))) {
> > -			last if $key =~ /[\012\015]/; # \n\r
> > -			$password .= $key;
> > -		}
> > - ...
> > +	my $password = Git->prompt($prompt);
> >  	$password;
> >  }
> > ...
> > +Check if GIT_ASKPASS or SSH_ASKPASS is set, use first matching for querying
> > +user and return answer. If no *_ASKPASS variable is set, the variable is
> > +empty or an error occoured, the terminal is tried as a fallback.
> 
> Looks like a description that is correct, but I feel a slight hiccup when
> trying to read the first sentence aloud.  Perhaps other reviewers on the
> list can offer an easier to read alternative?
Perhaps
  Query user for password with given PROMPT and return answer.  It respects
  GIT_ASKPASS and SSH_ASKPASS environment variables, with terminal in a
  password mode (no echo) as a fallback.  Returns undef if it cannot ask
  for password. 
> > +sub prompt {
> > +	my ($self, $prompt) = _maybe_self(@_);
> > +	my $ret;
> > +	if (exists $ENV{'GIT_ASKPASS'}) {

Wouldn't it be simpler and more resilent to just check for $ENV{'GIT_ASKPASS'}? Assuming that nobody uses command named '0' it would cover both GIT_ASKPASS not being set (!exists) and being set to empty value (eq '').

Show 13 quoted lines
> > +		$ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt);
> > +	}
> > +	if (!defined $ret && exists $ENV{'SSH_ASKPASS'}) {
> > +		$ret = _prompt($ENV{'SSH_ASKPASS'}, $prompt);
> > +	}
> > +	if (!defined $ret) {
> > +		print STDERR $prompt;
> > +		STDERR->flush;
> > +		require Term::ReadKey;
> > +		Term::ReadKey::ReadMode('noecho');
> > +		while (defined(my $key = Term::ReadKey::ReadKey(0))) {
> > +			last if $key =~ /[\012\015]/; # \n\r
> > +			$ret .= $key;

I wonder if the last part wouldn't be better to be refactored into a separate subroutine, e.g. _prompt_readkey.

Show 5 quoted lines
> 
> Unlike the original in _read_password, $ret ($password over there) is left
> "undef" here; I am wondering if "$ret .= $key" might trigger a warning and
> if that is the case, probably we should have an explicit "$ret = '';"
> before going into the while loop.

No that is not a problem. In Perl undefined variable functions as 0 in numeric context ($foo++), as '' in string context ($foo .= $key), and [] in arrayref context (push @$foo, $key).

Show 19 quoted lines
> > +sub _prompt {
> > +	my ($askpass, $prompt) = @_;
> > +	unless ($askpass) {
> > +		return undef;
> > +	}
> 
> Perl gurus on the list might prefer to rewrite this with statement
> modifier as "return undef unless (...);" but I am not one of them.
> 
> > +	my $ret;
> > +	open my $fh, "-|", $askpass, $prompt || return undef;
> 
> I am so used see this spelled with the lower-precedence "or" like this
> 
> 	open my $fh, "-|", $askpass, $prompt
>         	or return undef;
> 
> that I am no longer sure if the use of "||" is Ok here. Help from Perl
> gurus on the list?
It is incorrect, which you can check with B::Deparse.
$ perl -MO=Deparse,-p -e 'open my $fh, "-|", $askpass, $prompt || return undef;'
  open(my $fh, '-|', $askpass, ($prompt || return(undef)));
 
Anyway, wouldn't it be simpler and better to use command_oneline or its
backend here?
Show 21 quoted lines
> > +	$ret = <$fh>;
> > +	$ret =~ s/[\012\015]//g; # strip \n\r, chomp does not work on all systems (i.e. windows) as expected
> 
> The original reads one line from the helper process, removes the first \n
> or \r (expecting there is only one), and returns the result. The new code
> reads one line, removes all \n and \r everywhere, and returns the result.
> 
> I do not think it makes any difference in practice, but shouldn't this
> logically be more like "s/\r?\n$//", that is "remove the CRLF or LF at the
> end"?
> 
> > +	close ($fh);
> 
> It seems that we aquired a SP after "close" compared to the
> original. What's the prevailing coding style in our Perl code?
> 
> This close() of pipe to the subprocess is where a lot of error checking
> happens, no? Can this return an error?
> 
> I can see the original ignored an error condition, but do we care, or not
> care?
 
If we use command_oneline or its backend we wouldn't have to worry
about this.
-- 
Jakub Narebski
Poland
Previous: Sven StrickrothNext: Ævar Arnfjörð Bjarmason
Message 28 of 82 in “honour GIT_ASKPASS for querying username in git-svn”
  1. honour GIT_ASKPASS for querying username in git-svnSven Strickroth, Nov 17, 2011
  2. Erik Faye-LundNov 18, 2011
  3. Sven StrickrothNov 18, 2011
  4. Erik Faye-LundNov 18, 2011
  5. Sven StrickrothNov 26, 2011
  6. Jeff KingNov 30, 2011
  7. Sven StrickrothDec 26, 2011
  8. Jakub NarebskiDec 27, 2011
  9. Sven StrickrothDec 27, 2011
  10. Jakub NarebskiDec 27, 2011
  11. 0/5 honour *_ASKPASS for querying user in git-svnSven Strickroth, Dec 27, 2011
  12. 1/5 add central method for prompting a user using GIT_ASKPASS or SSH_ASKPASSSven Strickroth, Dec 27, 2011
  13. Junio C HamanoDec 27, 2011
  14. Thomas AdamDec 27, 2011
  15. Junio C HamanoDec 27, 2011
  16. 2/5 switch to central prompt methodSven Strickroth, Dec 27, 2011
  17. Junio C HamanoDec 27, 2011
  18. 3/5 honour *_ASKPASS for querying username and for querying further actions like unknown certificatesSven Strickroth, Dec 27, 2011
  19. Junio C HamanoDec 27, 2011
  20. 4/5 ignore empty *_ASKPASS variablesSven Strickroth, Dec 27, 2011
  21. Junio C HamanoDec 27, 2011
  22. 5/5 make askpass_prompt a global prompt method for asking usersSven Strickroth, Dec 27, 2011
  23. Junio C HamanoDec 27, 2011
  24. Junio C HamanoDec 27, 2011
  25. 1/2 git-svn, perl/Git.pm: add central method for prompting passwords honoring GIT_ASKPASS and SSH_ASKPASSSven Strickroth, Dec 28, 2011
  26. Junio C HamanoDec 28, 2011
  27. Sven StrickrothDec 28, 2011
  28. Jakub NarebskiDec 28, 2011
  29. Ævar Arnfjörð BjarmasonJan 3, 2012
  30. Sven StrickrothJan 3, 2012
  31. Ævar Arnfjörð BjarmasonJan 3, 2012
  32. Ævar Arnfjörð BjarmasonJan 3, 2012
  33. Sven StrickrothJan 3, 2012
  34. Junio C HamanoJan 3, 2012
  35. Junio C HamanoJan 3, 2012
  36. Sven StrickrothJan 3, 2012
  37. Junio C HamanoJan 4, 2012
  38. Sven StrickrothJan 4, 2012
  39. Sven StrickrothJan 4, 2012
  40. Jeff KingJan 4, 2012
  41. Sven StrickrothJan 4, 2012
  42. Junio C HamanoJan 4, 2012
  43. Sven StrickrothJan 7, 2012
  44. Junio C HamanoJan 4, 2012
  45. Sven StrickrothJan 4, 2012
  46. 2/2 git-svn, perl/Git.pm: extend and use Git->prompt method for querying usersSven Strickroth, Dec 28, 2011
  47. Junio C HamanoDec 28, 2011
  48. Sven StrickrothDec 28, 2011
  49. Junio C HamanoDec 28, 2011
  50. Junio C HamanoDec 28, 2011
  51. Sven StrickrothDec 28, 2011
  52. Junio C HamanoDec 28, 2011
  53. Sven StrickrothDec 30, 2011
  54. Jeff KingDec 30, 2011
  55. Sven StrickrothDec 30, 2011
  56. Junio C HamanoJan 1, 2012
  57. Sven StrickrothJan 1, 2012
  58. Sven StrickrothJan 1, 2012
  59. Sven StrickrothJan 1, 2012
  60. Junio C HamanoJan 3, 2012
  61. Jeff KingJan 3, 2012
  62. Sven StrickrothFeb 12, 2012
  63. Jakub NarebskiFeb 12, 2012
  64. Sven StrickrothFeb 12, 2012
  65. Jeff KingFeb 14, 2012
  66. Junio C HamanoFeb 14, 2012
  67. Jeff KingFeb 14, 2012
  68. Sven StrickrothJan 3, 2012
  69. Junio C HamanoJan 4, 2012
  70. Sven StrickrothOct 6, 2012
  71. Junio C HamanoOct 6, 2012
  72. 0/2 second trySven Strickroth, Nov 11, 2012
  73. Sven StrickrothNov 24, 2012
  74. Junio C HamanoNov 26, 2012
  75. Sven StrickrothDec 17, 2012
  76. Junio C HamanoDec 17, 2012
  77. 1/3 git-svn, perl/Git.pm: add central method for prompting passwordsSven Strickroth, Dec 18, 2012
  78. 2/3 perl/Git.pm: Honor SSH_ASKPASS as fallback if GIT_ASKPASS is not setSven Strickroth, Dec 18, 2012
  79. Jeff KingDec 18, 2012
  80. 3/3 git-svn, perl/Git.pm: extend and use Git->prompt method for querying usersSven Strickroth, Dec 18, 2012
  81. 1/2 git-svn, perl/Git.pm: add central method for prompting passwords honoring GIT_ASKPASS and SSH_ASKPASSSven Strickroth, Nov 11, 2012
  82. 2/2 git-svn, perl/Git.pm: extend and use Git->prompt method for querying usersSven Strickroth, Nov 11, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.