git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Brandon Williams <bmwill@google.com>
To: Jeff King <peff@peff.net>
Cc: git@vger.kernel.org, sbeller@google.com, bburky@bburky.com,
	gitster@pobox.com, jrnieder@gmail.com
Subject: Re: [PATCH v9 5/5] transport: add from_user parameter to is_transport_allowed
Date: Wed, 14 Dec 2016 12:37:52 -0800	[thread overview]
Message-ID: <20161214203752.GD20063@google.com> (raw)
In-Reply-To: <20161214201323.GC20063@google.com>

On 12/14, Brandon Williams wrote:
> On 12/14, Jeff King wrote:
> > On Tue, Dec 13, 2016 at 05:40:37PM -0800, Brandon Williams wrote:
> > 
> > > Add the from_user parameter to the 'is_transport_allowed' function.
> > > This allows callers to query if a transport protocol is allowed, given
> > > that the caller knows that the protocol is coming from the user (1) or
> > > not from the user (0) such as redirects in libcurl.  If unknown a -1
> > > should be provided which falls back to reading `GIT_PROTOCOL_FROM_USER`
> > > to determine if the protocol came from the user.
> > 
> > I think your commit message is upside-down with respect to the purpose
> > of the patch. The end goal we want is for http to distinguish between
> > protocol restrictions for redirects versus initial requests. The rest is
> > an implementation detail. It's definitely still worth discussing that
> > implementation detail (though I think your in-code comments may be
> > sufficient), but I don't see the rationale discussed here at all.
> 
> I'll fix the commit message to better discuss the reasoning behind the
> change.
> 
> > > Signed-off-by: Brandon Williams <bmwill@google.com>
> > > ---
> > >  http.c      | 14 +++++++-------
> > >  transport.c |  8 +++++---
> > >  transport.h | 13 ++++++++++---
> > >  3 files changed, 22 insertions(+), 13 deletions(-)
> > 
> > I'm trying to think of a way to test this. I guess the case we are
> > covering here is when a server redirects, but the protocol is only
> > allowed from the user. So:
> > 
> > diff --git a/t/t5812-proto-disable-http.sh b/t/t5812-proto-disable-http.sh
> > index 044cc152f..d911afd24 100755
> > --- a/t/t5812-proto-disable-http.sh
> > +++ b/t/t5812-proto-disable-http.sh
> > @@ -30,5 +30,12 @@ test_expect_success 'curl limits redirects' '
> >  	test_must_fail git clone "$HTTPD_URL/loop-redir/smart/repo.git"
> >  '
> >  
> > +test_expect_success 'http can be limited to from-user' '
> > +	git -c protocol.http.allow=user \
> > +		clone "$HTTPD_URL/smart/repo.git" plain.git &&
> > +	test_must_fail git -c protocol.http.allow=user \
> > +		clone "$HTTPD_URL/smart-redir-perm/repo.git" redir.git
> > +'
> > +
> >  stop_httpd
> >  test_done
> > 
> > It's an oddball configuration, and you'd probably just set
> > http.followRedirects=false in practice, but it does correctly check this
> > case.
> 
> K I'll add this in as a test.
> 
> > > @@ -588,9 +588,9 @@ static CURL *get_curl_handle(void)
> > >  #endif
> > >  #if LIBCURL_VERSION_NUM >= 0x071304
> > >  	curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS,
> > > -			 get_curl_allowed_protocols());
> > > +			 get_curl_allowed_protocols(0));
> > >  	curl_easy_setopt(result, CURLOPT_PROTOCOLS,
> > > -			 get_curl_allowed_protocols());
> > > +			 get_curl_allowed_protocols(-1));
> > 
> > This covers internal redirects done by libcurl, but not the dumb-walker
> > http-alternates nonsense. We have to feed the URL from http-alternates
> > back to curl ourselves, so it uses CURLOPT_PROTOCOLS even though it
> > should count as "not from the user".
> > 
> > To fix that, I think we'd need something like:
> > 
> >   - get_curl_handle() stops setting these options, as it is done only
> >     once when the curl handle is initialized. Instead, the protocol
> >     restrictions should go into get_active_slot(), which is called for
> >     each request.  The values set would remain the same, and be the
> >     baseline.
> > 
> >   - the http-walker.c code would need to know when it's requesting from
> >     the base URL, and when it's an alternate. I think this would depend
> >     on the position of the "alt" in in the linked list it keeps.
> > 
> >   - when requesting from an alternate, http-walker would set
> >     CURLOPT_PROTOCOLS with get_curl_allowed_protocols(0)
> > 
> > I have to admit that it sounds like a fair bit of work for a pretty
> > obscure case. You'd have to:
> > 
> >   1. Turn http.allowRedirects to "true", to allow redirects even for
> >      non-initial contact.
> > 
> >   2. Turn one of protocol.{http,https,ftp,ftps}.allow to "user" to
> >      restrict it from being used in a redirect.
> > 
> > I'm tempted to punt on it and just do:
> > 
> >   if (http_follow_config == HTTP_FOLLOW_ALWAYS &&
> >       get_curl_allowed_protocols(0) != get_curl_allowed_protocols(-1))
> > 	die("user-only protocol restrictions not implemented for http-alternates");
> > 
> > which errs on the safe side. We could even shove that down into the case
> > where we actually see some alternates, like:
> > 
> > diff --git a/http-walker.c b/http-walker.c
> > index c2f81cd6a..5bcc850b1 100644
> > --- a/http-walker.c
> > +++ b/http-walker.c
> > @@ -160,6 +160,12 @@ static void prefetch(struct walker *walker, unsigned char *sha1)
> >  #endif
> >  }
> >  
> > +static void check_alternates_protocol_restrictions(void)
> > +{
> > +	if (get_curl_allowed_protocols(0) != get_curl_allowed_protocol(-1))
> > +		die("user-only protocol restrictions not implemented for http alternates");
> > +}
> > +
> >  static void process_alternates_response(void *callback_data)
> >  {
> >  	struct alternates_request *alt_req =
> > @@ -272,6 +278,7 @@ static void process_alternates_response(void *callback_data)
> >  			/* skip "objects\n" at end */
> >  			if (okay) {
> >  				struct strbuf target = STRBUF_INIT;
> > +				check_alternates_protocol_restrictions();
> >  				strbuf_add(&target, base, serverlen);
> >  				strbuf_add(&target, data + i, posn - i - 7);
> >  				warning("adding alternate object store: %s",
> > 
> > I find it unlikely that anybody would ever care, but at least we'd do
> > the safe thing. I dunno. Maybe I am just being lazy.
> 
> Well, that's unfortunate!  It does sound like a more full-proof solution
> to these dumb http alternates could be involved.  I don't think your
> simple "lazy" solution may be enough to not just die by default.
> 
> By default ftp/ftps will have a policy of "user only" which means they
> will be set by the call to get_curl_allowed_protocol(-1) but not set by
> get_curl_allowed_protocol(0).  This would result in the call to
> check_alternates_protocol_restrictions failing all the time unless the
> user explicitly sets ftp/ftps to "always" or "never".  If that is the
> desired behavior then your proposed solution would be fine, otherwise we
> may have to do the more involved approach.

Naively looking at the code (and your longer suggestion), is there a
reason why we couldn't simply have http-walker set CURLOPT_PROTOCOLS
with get_curl_allowed_protocols(0) in the fetch_alternates() function?
That way we just override the CURLOPT_PROTOCOLS value when alternates
are involved.
Like so:

diff --git a/http-walker.c b/http-walker.c
index c2f81cd..b284cec 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -339,6 +339,8 @@ static void fetch_alternates(struct walker *walker, const char *base)
 	curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer);
 	curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
 	curl_easy_setopt(slot->curl, CURLOPT_URL, url.buf);
+	curl_easy_setopt(slot->curl, CURLOPT_PROTOCOLS,
+			 get_curl_allowed_protocols(0));
 
 	alt_req.base = base;
 	alt_req.url = &url;

-- 
Brandon Williams

  parent reply	other threads:[~2016-12-14 20:37 UTC|newest]

Thread overview: 124+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-02 22:20 [PATCH] transport: add core.allowProtocol config option Brandon Williams
2016-11-02 22:41 ` Stefan Beller
2016-11-02 22:47   ` Brandon Williams
2016-11-02 23:05 ` Jeff King
2016-11-02 23:08   ` Jeff King
2016-11-02 23:34     ` Brandon Williams
2016-11-02 23:33   ` Brandon Williams
2016-11-02 23:46     ` Brandon Williams
2016-11-03  0:08       ` Jeff King
2016-11-03  0:22 ` Jonathan Nieder
2016-11-03  0:41   ` Blake Burkhart
2016-11-03  2:44   ` Junio C Hamano
2016-11-03 14:38   ` Jeff King
2016-11-03 17:25     ` Brandon Williams
2016-11-03 17:39       ` Stefan Beller
2016-11-03 17:51         ` Brandon Williams
2016-11-03 18:02           ` Jeff King
2016-11-03 18:08             ` Brandon Williams
2016-11-03 18:00         ` Jeff King
2016-11-03 17:53       ` Jeff King
2016-11-03 18:19         ` Brandon Williams
2016-11-03 18:25           ` Jeff King
2016-11-03 18:24         ` Jeff King
2016-11-03 18:45           ` Brandon Williams
2016-11-03 18:50             ` Jeff King
2016-11-03 18:56               ` Brandon Williams
2016-11-03  0:50 ` [PATCH v2] " Brandon Williams
2016-11-04 20:55 ` [PATCH v3] transport: add protocol policy " Brandon Williams
2016-11-04 20:58   ` Brandon Williams
2016-11-04 21:35     ` Stefan Beller
2016-11-04 23:09       ` Jeff King
2016-11-05  0:18         ` Brandon Williams
2016-11-04 22:38   ` Stefan Beller
2016-11-07 18:14     ` Brandon Williams
2016-11-04 23:06   ` Jeff King
2016-11-07 19:17     ` Brandon Williams
2016-11-07 19:35   ` [PATCH v4 1/2] lib-proto-disable: variable name fix Brandon Williams
2016-11-07 19:35     ` [PATCH v4 2/2] transport: add protocol policy config option Brandon Williams
2016-11-07 20:44       ` Jeff King
2016-11-07 21:02         ` Brandon Williams
2016-11-07 20:26     ` [PATCH v4 1/2] lib-proto-disable: variable name fix Jeff King
2016-11-07 20:40       ` Brandon Williams
2016-11-07 20:48         ` Jeff King
2016-11-08  3:32           ` Jacob Keller
2016-11-08 20:52             ` Junio C Hamano
2016-11-07 21:51     ` [PATCH v5 " Brandon Williams
2016-11-07 21:51       ` [PATCH v5 2/2] transport: add protocol policy config option Brandon Williams
2016-11-08 22:04         ` Jeff King
2016-11-08 22:05           ` Brandon Williams
2016-12-01 19:44       ` [PATCH v6 0/4] transport protocol policy configuration Brandon Williams
2016-12-01 19:44         ` [PATCH v6 1/4] lib-proto-disable: variable name fix Brandon Williams
2016-12-01 19:44         ` [PATCH v6 2/4] transport: add protocol policy config option Brandon Williams
2016-12-01 19:44         ` [PATCH v6 3/4] http: always warn if libcurl version is too old Brandon Williams
2016-12-01 19:44         ` [PATCH v6 4/4] transport: check if protocol can be used on a redirect Brandon Williams
2016-12-01 19:48           ` Brandon Williams
2016-12-01 19:49             ` Brandon Williams
2016-12-01 19:50           ` Jeff King
2016-12-01 19:54             ` Junio C Hamano
2016-12-01 19:59               ` Jeff King
2016-12-01 20:01                 ` Brandon Williams
2016-12-01 20:25         ` [PATCH v7 0/4] transport protocol policy configuration Brandon Williams
2016-12-01 20:25           ` [PATCH v7 1/4] lib-proto-disable: variable name fix Brandon Williams
2016-12-01 20:25           ` [PATCH v7 2/4] transport: add protocol policy config option Brandon Williams
2016-12-01 20:25           ` [PATCH v7 3/4] http: always warn if libcurl version is too old Brandon Williams
2016-12-01 20:25           ` [PATCH v7 4/4] transport: add from_user parameter to is_transport_allowed Brandon Williams
2016-12-01 21:40             ` Jeff King
2016-12-01 22:25               ` Junio C Hamano
2016-12-01 23:07               ` Brandon Williams
2016-12-01 23:26                 ` Brandon Williams
2016-12-02  0:13                   ` Jeff King
2016-12-02 17:33                     ` Brandon Williams
2016-12-01 23:34                 ` Junio C Hamano
2016-12-01 23:58                   ` Brandon Williams
2016-12-05 20:04                     ` Junio C Hamano
2016-12-05 22:22                       ` Brandon Williams
2016-12-05 23:19                         ` Junio C Hamano
2016-12-05 23:22                           ` Brandon Williams
2016-12-06 13:51                       ` Jeff King
2016-12-06 17:53                         ` Junio C Hamano
2016-12-06 18:10                           ` Jeff King
2016-12-06 18:24                             ` [PATCH v2] jk/http-walker-limit-redirect rebased to maint-2.9 Jeff King
2016-12-06 18:24                               ` [PATCH v2 1/6] http: simplify update_url_from_redirect Jeff King
2016-12-06 18:24                               ` [PATCH v2 2/6] http: always update the base URL for redirects Jeff King
2016-12-06 18:24                               ` [PATCH v2 3/6] remote-curl: rename shadowed options variable Jeff King
2016-12-06 18:24                               ` [PATCH v2 4/6] http: make redirects more obvious Jeff King
2016-12-06 18:24                               ` [PATCH v2 5/6] http: treat http-alternates like redirects Jeff King
2016-12-06 18:25                               ` [PATCH v2 6/6] http-walker: complain about non-404 loose object errors Jeff King
2016-12-06 22:24                         ` [PATCH v7 4/4] transport: add from_user parameter to is_transport_allowed Brandon Williams
2016-12-02  0:00           ` [PATCH v8 0/5] transport protocol policy configuration Brandon Williams
2016-12-02  0:00             ` [PATCH v8 1/5] lib-proto-disable: variable name fix Brandon Williams
2016-12-02  0:00             ` [PATCH v8 2/5] transport: add protocol policy config option Brandon Williams
2016-12-02  0:01             ` [PATCH v8 3/5] http: always warn if libcurl version is too old Brandon Williams
2016-12-02  0:01             ` [PATCH v8 4/5] http: create function to get curl allowed protocols Brandon Williams
2016-12-02  0:01             ` [PATCH v8 5/5] transport: add from_user parameter to is_transport_allowed Brandon Williams
2016-12-14  1:40             ` [PATCH v9 0/5] transport protocol policy configuration Brandon Williams
2016-12-14  1:40               ` [PATCH v9 1/5] lib-proto-disable: variable name fix Brandon Williams
2016-12-14  1:40               ` [PATCH v9 2/5] transport: add protocol policy config option Brandon Williams
2016-12-14  1:40               ` [PATCH v9 3/5] http: always warn if libcurl version is too old Brandon Williams
2016-12-14 16:01                 ` Jeff King
2016-12-14 17:56                   ` Brandon Williams
2016-12-14  1:40               ` [PATCH v9 4/5] http: create function to get curl allowed protocols Brandon Williams
2016-12-14 16:03                 ` Jeff King
2016-12-14 18:00                   ` Brandon Williams
2016-12-14  1:40               ` [PATCH v9 5/5] transport: add from_user parameter to is_transport_allowed Brandon Williams
2016-12-14 16:40                 ` Jeff King
2016-12-14 20:13                   ` Brandon Williams
2016-12-14 20:33                     ` Jeff King
2016-12-14 21:12                       ` Jeff King
2016-12-14 21:58                         ` Brandon Williams
     [not found]                       ` <CAP3OtXiOPbAkr5Mn+5tEmZZAZzJXQ4CvtpHCg=wt+k-bi6K2vA@mail.gmail.com>
     [not found]                         ` <CAP3OtXhH++szRws20MaHt-ftLBMUJuYiTmfL50mOFP4FA4Mn6Q@mail.gmail.com>
2016-12-14 22:52                           ` Jeff King
2016-12-14 20:37                     ` Brandon Williams [this message]
2016-12-14 20:41                       ` Jeff King
2016-12-14 20:50                         ` Brandon Williams
2016-12-14 22:39               ` [PATCH v10 0/6] transport protocol policy configuration Brandon Williams
2016-12-14 22:39                 ` [PATCH v10 1/6] lib-proto-disable: variable name fix Brandon Williams
2016-12-14 22:39                 ` [PATCH v10 2/6] http: always warn if libcurl version is too old Brandon Williams
2016-12-15  0:21                   ` Jeff King
2016-12-15 17:29                     ` Junio C Hamano
2016-12-14 22:39                 ` [PATCH v10 3/6] transport: add protocol policy config option Brandon Williams
2016-12-14 22:39                 ` [PATCH v10 4/6] http: create function to get curl allowed protocols Brandon Williams
2016-12-14 22:39                 ` [PATCH v10 5/6] transport: add from_user parameter to is_transport_allowed Brandon Williams
2016-12-14 22:39                 ` [PATCH v10 6/6] http: respect protocol.*.allow=user for http-alternates Brandon Williams
2016-12-14 23:25                 ` [PATCH v10 0/6] transport protocol policy configuration Junio C Hamano
2016-12-15  0:22                 ` 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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161214203752.GD20063@google.com \
    --to=bmwill@google.com \
    --cc=bburky@bburky.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jrnieder@gmail.com \
    --cc=peff@peff.net \
    --cc=sbeller@google.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).