From: Moriyoshi Koizumi <mozo@mozo.jp>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] Support various HTTP authentication methods
Date: Thu, 29 Jan 2009 22:59:27 +0900 [thread overview]
Message-ID: <4981B63F.4040100@mozo.jp> (raw)
In-Reply-To: <7v3af2h1b0.fsf@gitster.siamese.dyndns.org>
First thank you for the advice. I am not familiar to the code base and
definitely doing something wrong.
Junio C Hamano wrote:
> Moriyoshi Koizumi <mozo@mozo.jp> writes:
>> This patch enables it if supported by CURL, adding a couple of new
>
> "it" in "enables it" is a bit unclear...
I was a bit in a rush and I thought I got to get this done before I went
home. This patch dnables various HTTP authentication methods namely
basic, digest, GSS and NTLM that are supported by cURL. cURL tries to
use basic authentication if the option is not explicitly provided.
> Linewrapped and whitespace damaged patch that would not apply.
Sorry for the crap. I'll try to send the correct one next week.
> 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.
Right.
>> +#if LIBCURL_VERSION_NUM >= 0x070a06
>> + if (!strcmp("http.auth", var)) {
>> + if (curl_http_auth == NULL)
>
> We tend to say "if (!pointer)".
I'll fix this too.
> 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.
The environment variables win over gitconfigs. I thought that's what I
implemented and what we want.
> 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.
I tend to like this way, and the reason for the inconsistency between
them is that the earlier one is pasted from the nearby code. I'm
willing to fix this as well if I should.
>
>> + 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?
That one is really silly and shameful :-( I first thought I could go
with the on-stack buffer, but I eventually did this because the input
might contain an indefinite set of tokens, and thought safer to alloc it.
>> + 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...
The block that starts with if (curl_http_proxy_auth) {} should've been
enclosed by the conditinals. The leading part had been there in the
first place.
> 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 has to be the way to go, but the question is where I am supposed to
parse the strings and store them to the globals?
>
> That way you can free the two strings much early without waiting for
> http_cleanup(), too, right?
Regards,
Moriyoshi
next prev parent reply other threads:[~2009-01-29 13:53 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
2009-01-29 13:59 ` Moriyoshi Koizumi [this message]
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=4981B63F.4040100@mozo.jp \
--to=mozo@mozo.jp \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.