Michal Nazarewicz <m...@google.com> writes:

> From: Michal Nazarewicz <min...@mina86.com>
>
> 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 <min...@mina86.com>
> ---

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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to