From: Michal Nazarewicz <mina86@xxxxxxxxxx> Make git-send-email read password from a ~/.authinfo file instead of requiring it to be stored in git configuration, passed as command line argument or typed in. There are various other applications that use this file for authentication information so letting users use it for git-send-email is convinient. Furthermore, some users store their ~/.gitconfig file in a public repository and having to store password there makes it easy to publish the password. Not to introduce any new dependencies, ~/.authinfo file is parsed only if Text::CSV Perl module is installed. If it's not, a notification is printed and the file is ignored. Signed-off-by: Michal Nazarewicz <mina86@xxxxxxxxxx> --- Documentation/git-send-email.txt | 15 +++++++-- git-send-email.perl | 69 +++++++++++++++++++++++++++++++++------- 2 files changed, 70 insertions(+), 14 deletions(-) diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index eeb561c..b83576e 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -158,14 +158,25 @@ Sending --smtp-pass[=<password>]:: Password for SMTP-AUTH. The argument is optional: If no argument is specified, then the empty string is used as - the password. Default is the value of 'sendemail.smtppass', - however '--smtp-pass' always overrides this value. + the password. Default is the value of 'sendemail.smtppass' + or value read from '~/.authinfo' file, however '--smtp-pass' + always overrides this value. + Furthermore, passwords need not be specified in configuration files or on the command line. If a username has been specified (with '--smtp-user' or a 'sendemail.smtpuser'), but no password has been specified (with '--smtp-pass' or 'sendemail.smtppass'), then the user is prompted for a password while the input is masked for privacy. ++ +The '~/.authinfo' file is read if Text::CSV Perl module is installed +on the system; if it's missing, a notification message will be printed +and the file ignored altogether. The file should contain a line with +the following format: ++ + machine <domain> port <port> login <user> password <pass> ++ +Contrary to other tools, 'git-send-email' does not support symbolic +port names like 'imap' thus `<port>` must be a number. --smtp-server=<host>:: If set, specifies the outgoing SMTP server to use (e.g. diff --git a/git-send-email.perl b/git-send-email.perl index be809e5..d824098 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -1045,6 +1045,62 @@ sub maildomain { return maildomain_net() || maildomain_mta() || 'localhost.localdomain'; } + +sub read_password_from_stdin { + my $line; + + system "stty -echo"; + + do { + print "Password: "; + $line = <STDIN>; + print "\n"; + } while (!defined $line); + + system "stty echo"; + + chomp $line; + return $line; +} + +sub read_password_from_authinfo { + my $fd; + if (!open $fd, '<', $ENV{'HOME'} . '/.authinfo') { + return; + } + + if (!eval { require Text::CSV; 1 }) { + print STDERR "Text::CSV missing, won't read ~/.authinfo\n"; + close $fd; + return; + } + + my $csv = Text::CSV->new( { sep_char => ' ' } ); + my $password; + while (my $line = <$fd>) { + chomp $line; + $csv->parse($line); + my %row = $csv->fields(); + if (defined $row{'machine'} && + defined $row{'login'} && + defined $row{'port'} && + defined $row{'password'} && + $row{'machine'} eq $smtp_server && + $row{'login'} eq $smtp_authuser && + $row{'port'} eq $smtp_server_port) { + $password = $row{'password'}; + last; + } + } + + close $fd; + return $password; +} + +sub read_password { + return read_password_from_authinfo || read_password_from_stdin; +} + # Returns 1 if the message was sent, and 0 otherwise. # In actuality, the whole program dies when there # is an error sending a message. @@ -1194,18 +1250,7 @@ X-Mailer: git-send-email $gitversion }; if (!defined $smtp_authpass) { - - system "stty -echo"; - - do { - print "Password: "; - $_ = <STDIN>; - print "\n"; - } while (!defined $_); - - chomp($smtp_authpass = $_); - - system "stty echo"; + $smtp_authpass = read_password } $auth ||= $smtp->auth( $smtp_authuser, $smtp_authpass ) or die $smtp->message; -- 1.8.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html