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

Re: [PATCH] transport: add core.allowProtocol config option

From
Jeff King <peff@peff.net>
Date
Nov 3, 2016, 14:38 UTC
Message-ID
<20161103143806.hce4msk3dhxtgpre@sigill.intra.peff.net>
In-Reply-To
<20161103002225.GA13369@google.com>
On Wed, Nov 02, 2016 at 05:22:25PM -0700, Jonathan Nieder wrote:
Show 5 quoted lines
> Another difficulty with setting GIT_ALLOW_PROTOCOL globally is that it
> requires copy/pasting the default value from upstream and then adding
> the values I want.  There's no straightforward way to get the current
> value and add to it, in case I want to benefit from future upstream
> fixes to the default list.

I agree that this is a big drawback of the current scheme, and it would be nice to be able to say "also allow".

Show 11 quoted lines
> That is, would it be possible to use something like
> 
> 	[protocol "sso"]
> 		allow = always
> 
> instead of
> 
> 	[core]
> 		allowProtocol = file:git:http:https:....:sso
> 
> ?
One complication is that the whitelist has multiple states:
  1. if it's not used at all, anything goes
  2. if it exists and has zero or more entries, only those entries are
     allowed

And then submodules are an exception to (1), because it's not anything goes. It's "this default safe whitelist".

So when does protocol.sso.allow kick in? We wouldn't want it to trigger case (2) for things like fetch (disabling other non-allowed protocols). Nor do I think we'd only want it for the submodule case, as I would assume that "protocol.sso.allow = false" should disable it.

So I think this probably needs to be a separate parallel system where each protocol can be white- or black-listed in a context-specific way. Like:

  protocol.X.allow = always | user | never

Where "user" specifies that the protocol is OK coming directly from the user, but not from other sources. And we default known-common-and-good ones like protocol.http.allow to "always", unknown ones (like "foo" which runs "remote-foo") to "user"), and possibly known-scary ones like "ext") to "never".

Then we need some way of telling git "you are in a context where the URL parameter is not coming from the user". Probably via the environment in GIT_PROTOCOL_FROM_USER or similar. Which git-submodule would sent when recursing clones, along with things like "go get".

In other words, stop asking git-submodule or "go get" to specify policy, and let them specify context that can be used to implement policy that the user specifies (and have git provide a sane default policy).

I think this would all take a backseat to GIT_ALLOW_PROTOCOL, for backwards compatibility, and then GIT_ALLOW_PROTOCOL could slowly die off over time.

Show 8 quoted lines
> That reminds me: external tools also set GIT_ALLOW_PROTOCOL when the
> user hasn't set it explicitly, like git-submodule.sh does.  E.g.
> repo <https://gerrit.googlesource.com/git-repo/+/466b8c4e/git_command.py#171>,
> mercurial <https://www.mercurial-scm.org/repo/hg/file/b032a7b676c6/mercurial/subrepo.py#l1404>.
> Other external tools consume GIT_ALLOW_PROTOCOL, like 'go get'
> <https://go.googlesource.com/go/+/55620a0e/src/cmd/go/vcs.go#64>.
> Can we make it more convenient for them to support this configuration
> too?

I think under my proposal above this ugliness just goes away, as all they have to do is say "trust my URLs less; they come from an automated source" without specifying policy themselves.

But we may still want...
Show 10 quoted lines
> An example approach would be a GIT_ALLOW_PROTOCOL var returned by
> "git var".
> 
> That way git-submodule.sh could do
> 
> 	: ${GIT_ALLOW_PROTOCOL=$(git var GIT_ALLOW_PROTOCOL)}
> 
> and it would just work.  Other tools could do the same, with a
> fallback to the current default until new enough git is in widespread
> use.

...some automated way to say "is this protocol supported"? I think it is not just "give me ALLOW_PROTOCOL" anymore, though, but "apply your rules to this protocol, and tell me if it is supported".

I don't think things like "go get" would need it, but you would if you had a porcelain built around git that was accessing a URL _not_ via git-fetch, but wanted to apply git's rules. That could come as a step 2 later, though.

-Peff
Previous: Junio C HamanoNext: Brandon Williams
Message 13 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.