Michal Nazarewicz <mpn@xxxxxxxxxx> writes: > From: Michal Nazarewicz <mina86@xxxxxxxxxx> > > If smtp_user is provided but smtp_pass is not, instead of > prompting for password, make git-send-email use git > credential command instead. > > Signed-off-by: Michal Nazarewicz <mina86@xxxxxxxxxx> > --- Nice ;-) I'd expect reviews on 4/5 from Peff and Matthiew which may result in either Reviewed-by:'s or another round, but everything else looks in good order. Thanks to all three of you for working on this. > Documentation/git-send-email.txt | 4 +-- > git-send-email.perl | 59 +++++++++++++++++++++++----------------- > 2 files changed, 36 insertions(+), 27 deletions(-) > > diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt > index 44a1f7c..0cffef8 100644 > --- a/Documentation/git-send-email.txt > +++ b/Documentation/git-send-email.txt > @@ -164,8 +164,8 @@ Sending > 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. > +specified (with '--smtp-pass' or 'sendemail.smtppass'), then > +a password is obtained using 'git-credential'. > > --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..76bbfc3 100755 > --- a/git-send-email.perl > +++ b/git-send-email.perl > @@ -1045,6 +1045,39 @@ sub maildomain { > return maildomain_net() || maildomain_mta() || 'localhost.localdomain'; > } > > +# Returns 1 if authentication succeeded or was not necessary > +# (smtp_user was not specified), and 0 otherwise. > + > +sub smtp_auth_maybe { > + if (!defined $smtp_authuser || $auth) { > + return 1; > + } > + > + # Workaround AUTH PLAIN/LOGIN interaction defect > + # with Authen::SASL::Cyrus > + eval { > + require Authen::SASL; > + Authen::SASL->import(qw(Perl)); > + }; > + > + # TODO: Authentication may fail not because credentials were > + # invalid but due to other reasons, in which we should not > + # reject credentials. > + $auth = Git::credential({ > + 'protocol' => 'smtp', > + 'host' => join(':', $smtp_server, $smtp_server_port), > + 'username' => $smtp_authuser, > + # if there's no password, "git credential fill" will > + # give us one, otherwise it'll just pass this one. > + 'password' => $smtp_authpass > + }, sub { > + my $cred = shift; > + return !!$smtp->auth($cred->{'username'}, $cred->{'password'}); > + }); > + > + return $auth; > +} > + > # Returns 1 if the message was sent, and 0 otherwise. > # In actuality, the whole program dies when there > # is an error sending a message. > @@ -1185,31 +1218,7 @@ X-Mailer: git-send-email $gitversion > defined $smtp_server_port ? " port=$smtp_server_port" : ""; > } > > - if (defined $smtp_authuser) { > - # Workaround AUTH PLAIN/LOGIN interaction defect > - # with Authen::SASL::Cyrus > - eval { > - require Authen::SASL; > - Authen::SASL->import(qw(Perl)); > - }; > - > - if (!defined $smtp_authpass) { > - > - system "stty -echo"; > - > - do { > - print "Password: "; > - $_ = <STDIN>; > - print "\n"; > - } while (!defined $_); > - > - chomp($smtp_authpass = $_); > - > - system "stty echo"; > - } > - > - $auth ||= $smtp->auth( $smtp_authuser, $smtp_authpass ) or die $smtp->message; > - } > + smtp_auth_maybe or die $smtp->message; > > $smtp->mail( $raw_from ) or die $smtp->message; > $smtp->to( @recipients ) or die $smtp->message; -- 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