git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v9 5/5] transport: add from_user parameter to is_transport_allowed

From
BWBrandon Williams <bmwill@google.com>
Date
Dec 14, 2016, 20:13 UTC
Message-ID
<20161214201323.GC20063@google.com>
In-Reply-To
<20161214164050.uxk434kzhw6au4c2@sigill.intra.peff.net>
On 12/14, Jeff King wrote:
Show 15 quoted lines
> 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.

Show 32 quoted lines
> > 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.
Show 76 quoted lines
> > @@ -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.

-- 
Brandon Williams
Previous: Jeff KingNext: Jeff King
Message 99 of 117 in “transport: add core.allowProtocol config option”
  1. transport: add core.allowProtocol config optionBrandon Williams, Nov 2, 2016
  2. Stefan BellerNov 2, 2016
  3. Brandon WilliamsNov 2, 2016
  4. Jeff KingNov 2, 2016
  5. Jeff KingNov 2, 2016
  6. Brandon WilliamsNov 2, 2016
  7. Brandon WilliamsNov 2, 2016
  8. Brandon WilliamsNov 2, 2016
  9. Jeff KingNov 3, 2016
  10. Jonathan NiederNov 3, 2016
  11. Blake BurkhartNov 3, 2016
  12. Junio C HamanoNov 3, 2016
  13. Jeff KingNov 3, 2016
  14. Brandon WilliamsNov 3, 2016
  15. Stefan BellerNov 3, 2016
  16. Brandon WilliamsNov 3, 2016
  17. Jeff KingNov 3, 2016
  18. Brandon WilliamsNov 3, 2016
  19. Jeff KingNov 3, 2016
  20. Jeff KingNov 3, 2016
  21. Brandon WilliamsNov 3, 2016
  22. Jeff KingNov 3, 2016
  23. Jeff KingNov 3, 2016
  24. Brandon WilliamsNov 3, 2016
  25. Jeff KingNov 3, 2016
  26. Brandon WilliamsNov 3, 2016
  27. transport: add core.allowProtocol config optionBrandon Williams, Nov 3, 2016
  28. transport: add protocol policy config optionBrandon Williams, Nov 4, 2016
  29. Brandon WilliamsNov 4, 2016
  30. Stefan BellerNov 4, 2016
  31. Jeff KingNov 4, 2016
  32. Brandon WilliamsNov 5, 2016
  33. Stefan BellerNov 4, 2016
  34. Brandon WilliamsNov 7, 2016
  35. Jeff KingNov 4, 2016
  36. Brandon WilliamsNov 7, 2016
  37. 1/2 lib-proto-disable: variable name fixBrandon Williams, Nov 7, 2016
  38. 2/2 transport: add protocol policy config optionBrandon Williams, Nov 7, 2016
  39. Jeff KingNov 7, 2016
  40. Brandon WilliamsNov 7, 2016
  41. Jeff KingNov 7, 2016
  42. Brandon WilliamsNov 7, 2016
  43. Jeff KingNov 7, 2016
  44. Jacob KellerNov 8, 2016
  45. Junio C HamanoNov 8, 2016
  46. 1/2 lib-proto-disable: variable name fixBrandon Williams, Nov 7, 2016
  47. 2/2 transport: add protocol policy config optionBrandon Williams, Nov 7, 2016
  48. Jeff KingNov 8, 2016
  49. Brandon WilliamsNov 8, 2016
  50. 0/4 transport protocol policy configurationBrandon Williams, Dec 1, 2016
  51. 4/4 transport: check if protocol can be used on a redirectBrandon Williams, Dec 1, 2016
  52. 4/4 transport: check if protocol can be used on a redirectBrandon Williams, Dec 1, 2016
  53. Brandon WilliamsDec 1, 2016
  54. Jeff KingDec 1, 2016
  55. Junio C HamanoDec 1, 2016
  56. Jeff KingDec 1, 2016
  57. Brandon WilliamsDec 1, 2016
  58. 2/4 transport: add protocol policy config optionBrandon Williams, Dec 1, 2016
  59. 1/4 lib-proto-disable: variable name fixBrandon Williams, Dec 1, 2016
  60. 3/4 http: always warn if libcurl version is too oldBrandon Williams, Dec 1, 2016
  61. 0/4 transport protocol policy configurationBrandon Williams, Dec 1, 2016
  62. 3/4 http: always warn if libcurl version is too oldBrandon Williams, Dec 1, 2016
  63. 1/4 lib-proto-disable: variable name fixBrandon Williams, Dec 1, 2016
  64. 2/4 transport: add protocol policy config optionBrandon Williams, Dec 1, 2016
  65. 4/4 transport: add from_user parameter to is_transport_allowedBrandon Williams, Dec 1, 2016
  66. Jeff KingDec 1, 2016
  67. Junio C HamanoDec 1, 2016
  68. Brandon WilliamsDec 1, 2016
  69. Brandon WilliamsDec 1, 2016
  70. Jeff KingDec 2, 2016
  71. Brandon WilliamsDec 2, 2016
  72. Junio C HamanoDec 1, 2016
  73. Brandon WilliamsDec 1, 2016
  74. Junio C HamanoDec 5, 2016
  75. Brandon WilliamsDec 5, 2016
  76. Junio C HamanoDec 5, 2016
  77. Brandon WilliamsDec 5, 2016
  78. Jeff KingDec 6, 2016
  79. Junio C HamanoDec 6, 2016
  80. Jeff KingDec 6, 2016
  81. Brandon WilliamsDec 6, 2016
  82. 0/5 transport protocol policy configurationBrandon Williams, Dec 2, 2016
  83. 1/5 lib-proto-disable: variable name fixBrandon Williams, Dec 2, 2016
  84. 3/5 http: always warn if libcurl version is too oldBrandon Williams, Dec 2, 2016
  85. 5/5 transport: add from_user parameter to is_transport_allowedBrandon Williams, Dec 2, 2016
  86. 2/5 transport: add protocol policy config optionBrandon Williams, Dec 2, 2016
  87. 4/5 http: create function to get curl allowed protocolsBrandon Williams, Dec 2, 2016
  88. 0/5 transport protocol policy configurationBrandon Williams, Dec 14, 2016
  89. 1/5 lib-proto-disable: variable name fixBrandon Williams, Dec 14, 2016
  90. 2/5 transport: add protocol policy config optionBrandon Williams, Dec 14, 2016
  91. 3/5 http: always warn if libcurl version is too oldBrandon Williams, Dec 14, 2016
  92. Jeff KingDec 14, 2016
  93. Brandon WilliamsDec 14, 2016
  94. 4/5 http: create function to get curl allowed protocolsBrandon Williams, Dec 14, 2016
  95. Jeff KingDec 14, 2016
  96. Brandon WilliamsDec 14, 2016
  97. 5/5 transport: add from_user parameter to is_transport_allowedBrandon Williams, Dec 14, 2016
  98. Jeff KingDec 14, 2016
  99. Brandon WilliamsDec 14, 2016
  100. Jeff KingDec 14, 2016
  101. Jeff KingDec 14, 2016
  102. Brandon WilliamsDec 14, 2016
  103. Brandon WilliamsDec 14, 2016
  104. Jeff KingDec 14, 2016
  105. Brandon WilliamsDec 14, 2016
  106. 0/6 transport protocol policy configurationBrandon Williams, Dec 14, 2016
  107. 2/6 http: always warn if libcurl version is too oldBrandon Williams, Dec 14, 2016
  108. Jeff KingDec 15, 2016
  109. Junio C HamanoDec 15, 2016
  110. 3/6 transport: add protocol policy config optionBrandon Williams, Dec 14, 2016
  111. 5/6 transport: add from_user parameter to is_transport_allowedBrandon Williams, Dec 14, 2016
  112. 6/6 http: respect protocol.*.allow=user for http-alternatesBrandon Williams, Dec 14, 2016
  113. 4/6 http: create function to get curl allowed protocolsBrandon Williams, Dec 14, 2016
  114. 1/6 lib-proto-disable: variable name fixBrandon Williams, Dec 14, 2016
  115. Junio C HamanoDec 14, 2016
  116. Jeff KingDec 15, 2016
  117. Jeff KingDec 14, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.