From: Junio C Hamano <gitster@pobox.com>
To: Moriyoshi Koizumi <mozo@mozo.jp>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] Support various HTTP authentication methods
Date: Thu, 29 Jan 2009 02:08:35 -0800 [thread overview]
Message-ID: <7v3af2h1b0.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <1233221532.21518.1.camel@lena.gsc.riken.jp> (Moriyoshi Koizumi's message of "Thu, 29 Jan 2009 18:32:12 +0900")
Moriyoshi Koizumi <mozo@mozo.jp> writes:
> Currently there is no way to specify the preferred authentication
> method for the HTTP backend and it always ends up with the CURL's
> default
> settings.
>
> This patch enables it if supported by CURL, adding a couple of new
"it" in "enables it" is a bit unclear...
> Signed-off-by: Moriyoshi Koizumi <mozo@mozo.jp>
> ---
> http.c | 105
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 105 insertions(+), 0 deletions(-)
Linewrapped and whitespace damaged patch that would not apply.
> diff --git a/http.c b/http.c
> index ee58799..889135f 100644
> --- a/http.c
> +++ b/http.c
> @@ -25,6 +25,12 @@ static long curl_low_speed_limit = -1;
> static long curl_low_speed_time = -1;
> static int curl_ftp_no_epsv = 0;
> static const char *curl_http_proxy = NULL;
> +#if LIBCURL_VERSION_NUM >= 0x070a06
> +static const char *curl_http_auth = NULL;
> +#endif
> +#if LIBCURL_VERSION_NUM >= 0x070a07
> +static const char *curl_http_proxy_auth = NULL;
> +#endif
I am not a cURL expert, so I'd take your word for these version
dependencies.
We do not initialize static scope pointers to "= NULL" nor variables to 0,
instead we let BSS take care of that for us. ftp_no_epsv we can see in
the context is doing unnecessary initialization that should be fixed.
> static struct curl_slist *pragma_header;
>
> @@ -153,11 +159,67 @@ static int http_options(const char *var, const
> char *value, void *cb)
> return git_config_string(&curl_http_proxy, var, value);
> return 0;
> }
> +#if LIBCURL_VERSION_NUM >= 0x070a06
> + if (!strcmp("http.auth", var)) {
> + if (curl_http_auth == NULL)
We tend to say "if (!pointer)".
I see you implemented "the first one wins" rule with this test, but I do
not think you want that. We first read $HOME/.gitconfig and then
repository specific $GIT_DIR/config, so it is often more useful to use
"the last one wins" rule.
> + return git_config_string(&curl_http_auth, var, value);
> + return 0;
> + }
> +#endif
> +#if LIBCURL_VERSION_NUM >= 0x070a07
> + if (!strcmp("http.proxy_auth", var)) {
> + if (curl_http_proxy_auth == NULL)
> + return git_config_string(&curl_http_proxy_auth, var, value);
> + return 0;
> + }
> +#endif
>
> /* Fall back on the default ones */
> return git_default_config(var, value, cb);
> }
>
> +#if LIBCURL_VERSION_NUM >= 0x070a06
> +static long get_curl_auth_bitmask(const char* auth_method)
> +{
> + char *buf = xmalloc(strlen(auth_method) + 1);
> + const unsigned char *p = (const unsigned char *)auth_method;
> + long mask = CURLAUTH_NONE;
Our isspace() is a sane_isspace(), so you do not have to play casting
games between signed vs unsigned char.
> + for (;;) {
> + char *q = buf;
> + while (*p && isspace(*p))
> + ++p;
> +
> + while (*p && *p != ',')
> + *q++ = tolower(*p++);
> +
> + while (--q >= buf && isspace(*(unsigned char *)q));
> + ++q;
> +
> + *q = '\0';
> +
> + if (strcmp(buf, "basic") == 0)
Say !strcmp(buf, "literal") like you did in the configuration parsing part
earlier.
> + mask |= CURLAUTH_BASIC;
> + else if (strcmp(buf, "digest") == 0)
> + mask |= CURLAUTH_DIGEST;
> + else if (strcmp(buf, "gss") == 0)
> + mask |= CURLAUTH_GSSNEGOTIATE;
> + else if (strcmp(buf, "ntlm") == 0)
> + mask |= CURLAUTH_NTLM;
> + else if (strcmp(buf, "any") == 0)
> + mask |= CURLAUTH_ANY;
> + else if (strcmp(buf, "anysafe") == 0)
> + mask |= CURLAUTH_ANYSAFE;
> +
> + if (!*p)
> + break;
> + ++p;
> + }
You leak "buf" here you forgot to free. The string you can possibly
accept is a known set with some maximum length, so you can use a on-stack
buf[] and reject any token longer than that maximum, right?
> + return mask;
> +}
> +#endif
> +
> static CURL* get_curl_handle(void)
> {
> CURL* result = curl_easy_init();
> @@ -210,6 +272,20 @@ static CURL* get_curl_handle(void)
> if (curl_http_proxy)
> curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy);
>
> + if (curl_http_auth) {
> + long n = get_curl_auth_bitmask(curl_http_auth);
> + curl_easy_setopt(result, CURLOPT_HTTPAUTH, n);
> + }
> +
> + if (curl_http_proxy) {
> + curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy);
> +
> + if (curl_http_proxy_auth) {
> + long n = get_curl_auth_bitmask(curl_http_proxy_auth);
> + curl_easy_setopt(result, CURLOPT_PROXYAUTH, n);
> + }
> + }
> +
This part does not have to be protected with the LIBCURL_VERSION_NUM
conditional? I somehow find it unlikely...
Instead of parsing the string every time a curl handle is asked for, how
about parsing them once and store the masks in two file scope static longs
in http_init() and use that value to easy_setopt() call here?
That way you can free the two strings much early without waiting for
http_cleanup(), too, right?
next prev parent reply other threads:[~2009-01-29 10:10 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-29 9:32 [PATCH] Support various HTTP authentication methods Moriyoshi Koizumi
2009-01-29 10:08 ` Junio C Hamano [this message]
2009-01-29 13:59 ` Moriyoshi Koizumi
2009-02-02 4:09 ` Moriyoshi Koizumi
2009-02-02 6:31 ` Junio C Hamano
2009-02-02 6:31 ` Junio C Hamano
2009-02-02 6:31 ` [PATCH 1/2] http.c: fix various style violations Junio C Hamano
2009-02-02 6:31 ` [PATCH 2/2] Support various HTTP authentication methods Junio C Hamano
2009-02-04 18:51 ` Aristotle Pagaltzis
2009-02-04 22:09 ` Daniel Stenberg
2009-02-04 23:25 ` Aristotle Pagaltzis
2009-02-05 8:11 ` Daniel Stenberg
2009-02-02 8:38 ` [PATCH] " Moriyoshi Koizumi
2009-01-29 10:18 ` Johannes Sixt
2009-01-29 14:02 ` Moriyoshi Koizumi
2009-01-29 14:08 ` Johannes Sixt
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=7v3af2h1b0.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=mozo@mozo.jp \
/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).