From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Subject: [PATCH 08/14] look for credentials in config before prompting
Date: Mon, 18 Jul 2011 03:51:08 -0400 [thread overview]
Message-ID: <20110718075108.GH12341@sigill.intra.peff.net> (raw)
In-Reply-To: <20110718074642.GA11678@sigill.intra.peff.net>
When an http request receives a 401, we ask the user for
both a username and password. While it's generally not a
good idea for us to store the password in plaintext, having
to input the username each time is annoying, and can be
easily solved with a config variable.
This patch teaches the credential subsystem to look up items
in the git config file before prompting. Items are indexed
by the "unique" token passed to the credential system.
Signed-off-by: Jeff King <peff@peff.net>
---
credential.c | 38 ++++++++++++++++++++++++++++++++++++++
credential.h | 1 +
t/t0300-credentials.sh | 10 ++++++++++
t/t5550-http-fetch.sh | 8 ++++++++
4 files changed, 57 insertions(+), 0 deletions(-)
diff --git a/credential.c b/credential.c
index c403289..3a4104c 100644
--- a/credential.c
+++ b/credential.c
@@ -4,6 +4,43 @@
#include "string-list.h"
#include "run-command.h"
+static int credential_config_callback(const char *var, const char *value,
+ void *data)
+{
+ struct credential *c = data;
+
+ if (!value)
+ return 0;
+
+ var = skip_prefix(var, "credential.");
+ if (!var)
+ return 0;
+
+ var = skip_prefix(var, c->unique);
+ if (!var)
+ return 0;
+
+ if (*var != '.')
+ return 0;
+ var++;
+
+ if (!strcmp(var, "username")) {
+ if (!c->username)
+ c->username = xstrdup(value);
+ }
+ else if (!strcmp(var, "password")) {
+ free(c->password);
+ c->password = xstrdup(value);
+ }
+ return 0;
+}
+
+void credential_from_config(struct credential *c)
+{
+ if (c->unique)
+ git_config(credential_config_callback, c);
+}
+
static char *credential_ask_one(const char *what, const char *desc)
{
struct strbuf prompt = STRBUF_INIT;
@@ -26,6 +63,7 @@ static char *credential_ask_one(const char *what, const char *desc)
int credential_getpass(struct credential *c)
{
+ credential_from_config(c);
if (!c->username)
c->username = credential_ask_one("Username", c->description);
diff --git a/credential.h b/credential.h
index 383b720..30a0156 100644
--- a/credential.h
+++ b/credential.h
@@ -11,6 +11,7 @@ struct credential {
struct string_list;
int credential_getpass(struct credential *);
+void credential_from_config(struct credential *);
int credential_fill_gently(struct credential *, const struct string_list *methods);
void credential_fill(struct credential *, const struct string_list *methods);
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
index 447e983..68d838c 100755
--- a/t/t0300-credentials.sh
+++ b/t/t0300-credentials.sh
@@ -172,4 +172,14 @@ test_expect_success 'internal getpass does not ask for known username' '
EOF
'
+test_expect_success 'internal getpass can pull from config' '
+ git config credential.foo.username configured-username
+ check --unique=foo <<-\EOF
+ username=configured-username
+ password=askpass-result
+ --
+ askpass: Password:
+ EOF
+'
+
test_done
diff --git a/t/t5550-http-fetch.sh b/t/t5550-http-fetch.sh
index af3bc6b..c78baaf 100755
--- a/t/t5550-http-fetch.sh
+++ b/t/t5550-http-fetch.sh
@@ -85,6 +85,14 @@ test_expect_success 'http auth can request both user and pass' '
test_cmp askpass-expect-both askpass-query
'
+test_expect_success 'http auth can pull user from config' '
+ >askpass-query &&
+ echo user@host >askpass-response &&
+ git config --global credential.$HTTPD_PROTO:$HTTPD_DEST.username user@host &&
+ git clone "$HTTPD_URL/auth/repo.git" clone-auth-config &&
+ test_cmp askpass-expect-pass askpass-query
+'
+
test_expect_success 'fetch changes via http' '
echo content >>file &&
git commit -a -m two &&
--
1.7.6.rc1.12.g65e2
next prev parent reply other threads:[~2011-07-18 7:51 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-18 7:46 [RFC/PATCH 0/14] less annoying http authentication Jeff King
2011-07-18 7:48 ` [PATCH 01/14] parse-options: add OPT_STRING_LIST helper Jeff King
2011-07-18 7:48 ` [PATCH 02/14] url: decode buffers that are not NUL-terminated Jeff King
2011-07-20 22:16 ` Junio C Hamano
2011-07-18 7:49 ` [PATCH 03/14] improve httpd auth tests Jeff King
2011-07-18 7:49 ` [PATCH 04/14] remote-curl: don't retry auth failures with dumb protocol Jeff King
2011-07-18 7:50 ` [PATCH 05/14] http: retry authentication failures for all http requests Jeff King
2011-07-18 7:50 ` [PATCH 06/14] introduce credentials API Jeff King
2011-07-20 22:17 ` Junio C Hamano
2011-07-22 20:39 ` Jeff King
2011-07-22 21:42 ` Junio C Hamano
2011-07-22 22:16 ` Jeff King
2011-07-21 21:59 ` Junio C Hamano
2011-07-22 20:40 ` Jeff King
2011-07-18 7:50 ` [PATCH 07/14] http: use credential API to get passwords Jeff King
2011-07-18 7:51 ` Jeff King [this message]
2011-07-18 7:51 ` [PATCH 09/14] allow the user to configure credential helpers Jeff King
2011-07-18 7:52 ` [PATCH 10/14] http: use hostname in credential description Jeff King
2011-07-20 22:17 ` Junio C Hamano
2011-07-22 20:47 ` Jeff King
2011-07-22 22:01 ` Junio C Hamano
2011-07-22 22:13 ` Jeff King
2011-08-08 14:37 ` Ted Zlatanov
2011-08-08 17:16 ` Junio C Hamano
2011-08-19 12:01 ` Ted Zlatanov
2011-08-25 20:23 ` Jeff King
2011-08-26 15:29 ` Ted Zlatanov
2011-07-18 7:52 ` [PATCH 11/14] docs: end-user documentation for the credential subsystem Jeff King
2011-07-20 22:17 ` Junio C Hamano
2011-07-18 7:55 ` [PATCH 12/14] credentials: add "cache" helper Jeff King
2011-07-18 7:58 ` [PATCH 13/14] credentials: add "store" helper Jeff King
2011-07-18 7:58 ` [PATCH 14/14] credentials: add "getpass" helper Jeff King
2011-07-18 8:00 ` [RFC/PATCH 0/14] less annoying http authentication Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110718075108.GH12341@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).