Browse Source

imap-send: use git-credential

git-imap-send was directly prompting for a password rather than using
git-credential. git-send-email, on the other hand, supports git-credential.

This is a necessary improvement for users that use two factor authentication, as
they should not be expected to remember all of their app specific passwords.

Signed-off-by: Dan Albert <danalbert@google.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Dan Albert 11 years ago committed by Junio C Hamano
parent
commit
791643a865
  1. 45
      imap-send.c

45
imap-send.c

@ -23,9 +23,9 @@ @@ -23,9 +23,9 @@
*/

#include "cache.h"
#include "credential.h"
#include "exec_cmd.h"
#include "run-command.h"
#include "prompt.h"
#ifdef NO_OPENSSL
typedef void *SSL;
#endif
@ -946,6 +946,7 @@ static int auth_cram_md5(struct imap_store *ctx, struct imap_cmd *cmd, const cha @@ -946,6 +946,7 @@ static int auth_cram_md5(struct imap_store *ctx, struct imap_cmd *cmd, const cha

static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
{
struct credential cred = CREDENTIAL_INIT;
struct imap_store *ctx;
struct imap *imap;
char *arg, *rsp;
@ -1096,25 +1097,23 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc) @@ -1096,25 +1097,23 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
}
#endif
imap_info("Logging in...\n");
if (!srvc->user) {
fprintf(stderr, "Skipping server %s, no user\n", srvc->host);
goto bail;
}
if (!srvc->pass) {
struct strbuf prompt = STRBUF_INIT;
strbuf_addf(&prompt, "Password (%s@%s): ", srvc->user, srvc->host);
arg = git_getpass(prompt.buf);
strbuf_release(&prompt);
if (!*arg) {
fprintf(stderr, "Skipping account %s@%s, no password\n", srvc->user, srvc->host);
goto bail;
}
/*
* getpass() returns a pointer to a static buffer. make a copy
* for long term storage.
*/
srvc->pass = xstrdup(arg);
if (!srvc->user || !srvc->pass) {
cred.protocol = xstrdup(srvc->use_ssl ? "imaps" : "imap");
cred.host = xstrdup(srvc->host);

if (srvc->user)
cred.username = xstrdup(srvc->user);
if (srvc->pass)
cred.password = xstrdup(srvc->pass);

credential_fill(&cred);

if (!srvc->user)
srvc->user = xstrdup(cred.username);
if (!srvc->pass)
srvc->pass = xstrdup(cred.password);
}

if (CAP(NOLOGIN)) {
fprintf(stderr, "Skipping account %s@%s, server forbids LOGIN\n", srvc->user, srvc->host);
goto bail;
@ -1153,10 +1152,18 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc) @@ -1153,10 +1152,18 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
}
} /* !preauth */

if (cred.username)
credential_approve(&cred);
credential_clear(&cred);

ctx->prefix = "";
return ctx;

bail:
if (cred.username)
credential_reject(&cred);
credential_clear(&cred);

imap_close_store(ctx);
return NULL;
}

Loading…
Cancel
Save