git-svn: print and flush authentication prompts to STDERR

People that redirect STDOUT output should always see STDERR
prompts interactively.

STDERR should always be flushed without buffering, so
they should always show up.  If that is unset, we still
explicitly flush by calling STDERR->flush.

The svn command-line client prompts to STDERR, too.

Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Eric Wong 2007-01-15 20:15:55 -08:00 коммит произвёл Junio C Hamano
Родитель d9e74d5745
Коммит 6f729591d1
1 изменённых файлов: 22 добавлений и 15 удалений

Просмотреть файл

@ -1918,7 +1918,8 @@ sub _simple_prompt {
$default_username = $_username if defined $_username; $default_username = $_username if defined $_username;
if (defined $default_username && length $default_username) { if (defined $default_username && length $default_username) {
if (defined $realm && length $realm) { if (defined $realm && length $realm) {
print "Authentication realm: $realm\n"; print STDERR "Authentication realm: $realm\n";
STDERR->flush;
} }
$cred->username($default_username); $cred->username($default_username);
} else { } else {
@ -1933,36 +1934,38 @@ sub _simple_prompt {
sub _ssl_server_trust_prompt { sub _ssl_server_trust_prompt {
my ($cred, $realm, $failures, $cert_info, $may_save, $pool) = @_; my ($cred, $realm, $failures, $cert_info, $may_save, $pool) = @_;
$may_save = undef if $_no_auth_cache; $may_save = undef if $_no_auth_cache;
print "Error validating server certificate for '$realm':\n"; print STDERR "Error validating server certificate for '$realm':\n";
if ($failures & $SVN::Auth::SSL::UNKNOWNCA) { if ($failures & $SVN::Auth::SSL::UNKNOWNCA) {
print " - The certificate is not issued by a trusted ", print STDERR " - The certificate is not issued by a trusted ",
"authority. Use the\n", "authority. Use the\n",
" fingerprint to validate the certificate manually!\n"; " fingerprint to validate the certificate manually!\n";
} }
if ($failures & $SVN::Auth::SSL::CNMISMATCH) { if ($failures & $SVN::Auth::SSL::CNMISMATCH) {
print " - The certificate hostname does not match.\n"; print STDERR " - The certificate hostname does not match.\n";
} }
if ($failures & $SVN::Auth::SSL::NOTYETVALID) { if ($failures & $SVN::Auth::SSL::NOTYETVALID) {
print " - The certificate is not yet valid.\n"; print STDERR " - The certificate is not yet valid.\n";
} }
if ($failures & $SVN::Auth::SSL::EXPIRED) { if ($failures & $SVN::Auth::SSL::EXPIRED) {
print " - The certificate has expired.\n"; print STDERR " - The certificate has expired.\n";
} }
if ($failures & $SVN::Auth::SSL::OTHER) { if ($failures & $SVN::Auth::SSL::OTHER) {
print " - The certificate has an unknown error.\n"; print STDERR " - The certificate has an unknown error.\n";
} }
printf( "Certificate information:\n". printf STDERR
"Certificate information:\n".
" - Hostname: %s\n". " - Hostname: %s\n".
" - Valid: from %s until %s\n". " - Valid: from %s until %s\n".
" - Issuer: %s\n". " - Issuer: %s\n".
" - Fingerprint: %s\n", " - Fingerprint: %s\n",
map $cert_info->$_, qw(hostname valid_from valid_until map $cert_info->$_, qw(hostname valid_from valid_until
issuer_dname fingerprint) ); issuer_dname fingerprint);
my $choice; my $choice;
prompt: prompt:
print $may_save ? print STDERR $may_save ?
"(R)eject, accept (t)emporarily or accept (p)ermanently? " : "(R)eject, accept (t)emporarily or accept (p)ermanently? " :
"(R)eject or accept (t)emporarily? "; "(R)eject or accept (t)emporarily? ";
STDERR->flush;
$choice = lc(substr(<STDIN> || 'R', 0, 1)); $choice = lc(substr(<STDIN> || 'R', 0, 1));
if ($choice =~ /^t$/i) { if ($choice =~ /^t$/i) {
$cred->may_save(undef); $cred->may_save(undef);
@ -1980,7 +1983,8 @@ prompt:
sub _ssl_client_cert_prompt { sub _ssl_client_cert_prompt {
my ($cred, $realm, $may_save, $pool) = @_; my ($cred, $realm, $may_save, $pool) = @_;
$may_save = undef if $_no_auth_cache; $may_save = undef if $_no_auth_cache;
print "Client certificate filename: "; print STDERR "Client certificate filename: ";
STDERR->flush;
chomp(my $filename = <STDIN>); chomp(my $filename = <STDIN>);
$cred->cert_file($filename); $cred->cert_file($filename);
$cred->may_save($may_save); $cred->may_save($may_save);
@ -1999,13 +2003,14 @@ sub _username_prompt {
my ($cred, $realm, $may_save, $pool) = @_; my ($cred, $realm, $may_save, $pool) = @_;
$may_save = undef if $_no_auth_cache; $may_save = undef if $_no_auth_cache;
if (defined $realm && length $realm) { if (defined $realm && length $realm) {
print "Authentication realm: $realm\n"; print STDERR "Authentication realm: $realm\n";
} }
my $username; my $username;
if (defined $_username) { if (defined $_username) {
$username = $_username; $username = $_username;
} else { } else {
print "Username: "; print STDERR "Username: ";
STDERR->flush;
chomp($username = <STDIN>); chomp($username = <STDIN>);
} }
$cred->username($username); $cred->username($username);
@ -2015,7 +2020,8 @@ sub _username_prompt {
sub _read_password { sub _read_password {
my ($prompt, $realm) = @_; my ($prompt, $realm) = @_;
print $prompt; print STDERR $prompt;
STDERR->flush;
require Term::ReadKey; require Term::ReadKey;
Term::ReadKey::ReadMode('noecho'); Term::ReadKey::ReadMode('noecho');
my $password = ''; my $password = '';
@ -2024,7 +2030,8 @@ sub _read_password {
$password .= $key; $password .= $key;
} }
Term::ReadKey::ReadMode('restore'); Term::ReadKey::ReadMode('restore');
print "\n"; print STDERR "\n";
STDERR->flush;
$password; $password;
} }