From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Subject: [PATCH 09/14] allow the user to configure credential helpers
Date: Mon, 18 Jul 2011 03:51:26 -0400 [thread overview]
Message-ID: <20110718075126.GI12341@sigill.intra.peff.net> (raw)
In-Reply-To: <20110718074642.GA11678@sigill.intra.peff.net>
The functionality for helpers is already there; we just need
to give the users a way to turn it on.
The new functionality is enabled whenever a caller of the
credentials API passes a NULL method list. This will enable
it for all current callers (i.e., the http code).
Signed-off-by: Jeff King <peff@peff.net>
---
Documentation/technical/api-credentials.txt | 5 ++-
config.c | 4 +++
credential.c | 31 +++++++++++++++++++++++---
credential.h | 2 +
t/t5550-http-fetch.sh | 13 +++++++++++
5 files changed, 49 insertions(+), 6 deletions(-)
diff --git a/Documentation/technical/api-credentials.txt b/Documentation/technical/api-credentials.txt
index 880db92..335a007 100644
--- a/Documentation/technical/api-credentials.txt
+++ b/Documentation/technical/api-credentials.txt
@@ -25,8 +25,9 @@ Data Structures
The credential functions take a `string_list` of methods for
acquiring credentials. Each string specifies an external
helper which will be run, in order, to acquire credentials,
- until both a username and password have been acquired. A NULL or
- empty methods list indicates that the internal
+ until both a username and password have been acquired. A NULL
+ parameter means to use the default list (as configured by
+ `credential.helper`); an empty list indicates that the internal
`credential_getpass` function should be used.
diff --git a/config.c b/config.c
index 1fc063b..ee643eb 100644
--- a/config.c
+++ b/config.c
@@ -9,6 +9,7 @@
#include "exec_cmd.h"
#include "strbuf.h"
#include "quote.h"
+#include "credential.h"
#define MAXNAME (256)
@@ -791,6 +792,9 @@ int git_default_config(const char *var, const char *value, void *dummy)
return 0;
}
+ if (!prefixcmp(var, "credential."))
+ return git_default_credential_config(var, value);
+
/* Add other config variables here and to Documentation/config.txt. */
return 0;
}
diff --git a/credential.c b/credential.c
index 3a4104c..744d105 100644
--- a/credential.c
+++ b/credential.c
@@ -4,6 +4,8 @@
#include "string-list.h"
#include "run-command.h"
+static struct string_list default_methods;
+
static int credential_config_callback(const char *var, const char *value,
void *data)
{
@@ -173,15 +175,18 @@ void credential_fill(struct credential *c, const struct string_list *methods)
{
struct strbuf err = STRBUF_INIT;
+ if (!methods)
+ methods = &default_methods;
+
if (!credential_fill_gently(c, methods))
return;
strbuf_addstr(&err, "unable to get credentials");
if (c->description)
strbuf_addf(&err, "for '%s'", c->description);
- if (methods && methods->nr == 1)
+ if (methods->nr == 1)
strbuf_addf(&err, "; tried '%s'", methods->items[0].string);
- else if (methods) {
+ else {
int i;
strbuf_addstr(&err, "; tried:");
for (i = 0; i < methods->nr; i++)
@@ -198,7 +203,10 @@ int credential_fill_gently(struct credential *c,
if (c->username && c->password)
return 0;
- if (!methods || !methods->nr)
+ if (!methods)
+ methods = &default_methods;
+
+ if (!methods->nr)
return credential_getpass(c);
for (i = 0; i < methods->nr; i++) {
@@ -214,7 +222,10 @@ void credential_reject(struct credential *c, const struct string_list *methods)
{
int i;
- if (methods && c->username) {
+ if (!methods)
+ methods = &default_methods;
+
+ if (c->username) {
for (i = 0; i < methods->nr; i++) {
/* ignore errors, there's nothing we can do */
credential_do(c, methods->items[i].string, "--reject");
@@ -226,3 +237,15 @@ void credential_reject(struct credential *c, const struct string_list *methods)
free(c->password);
c->password = NULL;
}
+
+int git_default_credential_config(const char *var, const char *value)
+{
+ if (!strcmp(var, "credential.helper")) {
+ if (!value)
+ return config_error_nonbool(var);
+ string_list_append(&default_methods, xstrdup(value));
+ return 0;
+ }
+
+ return 0;
+}
diff --git a/credential.h b/credential.h
index 30a0156..788ed8e 100644
--- a/credential.h
+++ b/credential.h
@@ -17,4 +17,6 @@ int credential_fill_gently(struct credential *, const struct string_list *method
void credential_fill(struct credential *, const struct string_list *methods);
void credential_reject(struct credential *, const struct string_list *methods);
+int git_default_credential_config(const char *var, const char *value);
+
#endif /* CREDENTIAL_H */
diff --git a/t/t5550-http-fetch.sh b/t/t5550-http-fetch.sh
index c78baaf..407e1cb 100755
--- a/t/t5550-http-fetch.sh
+++ b/t/t5550-http-fetch.sh
@@ -93,6 +93,19 @@ test_expect_success 'http auth can pull user from config' '
test_cmp askpass-expect-pass askpass-query
'
+test_expect_success 'http auth respects credential helpers' '
+ cat >credential-helper <<-\EOF &&
+ #!/bin/sh
+ echo username=user@host
+ echo password=user@host
+ EOF
+ chmod +x credential-helper &&
+ git config --global credential.helper "\"$PWD/credential-helper\"" &&
+ >askpass-query &&
+ git clone "$HTTPD_URL/auth/repo.git" clone-auth-helper &&
+ test_cmp askpass-expect-none 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 ` [PATCH 08/14] look for credentials in config before prompting Jeff King
2011-07-18 7:51 ` Jeff King [this message]
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=20110718075126.GI12341@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).