rubygems-update 3.4.21 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +132 -2
  3. data/Manifest.txt +39 -221
  4. data/README.md +1 -3
  5. data/bundler/CHANGELOG.md +74 -0
  6. data/bundler/README.md +1 -2
  7. data/bundler/bundler.gemspec +4 -2
  8. data/bundler/exe/bundle +1 -10
  9. data/bundler/lib/bundler/build_metadata.rb +3 -3
  10. data/bundler/lib/bundler/capistrano.rb +1 -1
  11. data/bundler/lib/bundler/checksum.rb +245 -0
  12. data/bundler/lib/bundler/ci_detector.rb +75 -0
  13. data/bundler/lib/bundler/cli/add.rb +3 -3
  14. data/bundler/lib/bundler/cli/binstubs.rb +4 -4
  15. data/bundler/lib/bundler/cli/cache.rb +1 -1
  16. data/bundler/lib/bundler/cli/check.rb +1 -1
  17. data/bundler/lib/bundler/cli/common.rb +9 -1
  18. data/bundler/lib/bundler/cli/config.rb +8 -7
  19. data/bundler/lib/bundler/cli/console.rb +3 -2
  20. data/bundler/lib/bundler/cli/doctor.rb +2 -2
  21. data/bundler/lib/bundler/cli/exec.rb +1 -1
  22. data/bundler/lib/bundler/cli/gem.rb +31 -23
  23. data/bundler/lib/bundler/cli/info.rb +2 -13
  24. data/bundler/lib/bundler/cli/install.rb +5 -4
  25. data/bundler/lib/bundler/cli/issue.rb +1 -1
  26. data/bundler/lib/bundler/cli/lock.rb +4 -4
  27. data/bundler/lib/bundler/cli/open.rb +1 -1
  28. data/bundler/lib/bundler/cli/outdated.rb +6 -6
  29. data/bundler/lib/bundler/cli/plugin.rb +7 -14
  30. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  31. data/bundler/lib/bundler/cli/show.rb +2 -2
  32. data/bundler/lib/bundler/cli/update.rb +5 -5
  33. data/bundler/lib/bundler/cli.rb +215 -263
  34. data/bundler/lib/bundler/compact_index_client/cache.rb +29 -9
  35. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  36. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  37. data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
  38. data/bundler/lib/bundler/compact_index_client.rb +14 -7
  39. data/bundler/lib/bundler/constants.rb +1 -1
  40. data/bundler/lib/bundler/current_ruby.rb +5 -21
  41. data/bundler/lib/bundler/definition.rb +43 -16
  42. data/bundler/lib/bundler/dependency.rb +16 -12
  43. data/bundler/lib/bundler/digest.rb +2 -2
  44. data/bundler/lib/bundler/dsl.rb +43 -25
  45. data/bundler/lib/bundler/endpoint_specification.rb +6 -2
  46. data/bundler/lib/bundler/env.rb +1 -3
  47. data/bundler/lib/bundler/errors.rb +58 -0
  48. data/bundler/lib/bundler/fetcher/base.rb +3 -1
  49. data/bundler/lib/bundler/fetcher/compact_index.rb +4 -4
  50. data/bundler/lib/bundler/fetcher/downloader.rb +13 -11
  51. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  52. data/bundler/lib/bundler/fetcher/index.rb +1 -1
  53. data/bundler/lib/bundler/fetcher.rb +28 -25
  54. data/bundler/lib/bundler/friendly_errors.rb +5 -5
  55. data/bundler/lib/bundler/gem_helper.rb +1 -1
  56. data/bundler/lib/bundler/gem_helpers.rb +12 -2
  57. data/bundler/lib/bundler/graph.rb +9 -9
  58. data/bundler/lib/bundler/index.rb +1 -2
  59. data/bundler/lib/bundler/injector.rb +1 -1
  60. data/bundler/lib/bundler/inline.rb +3 -3
  61. data/bundler/lib/bundler/installer/gem_installer.rb +10 -10
  62. data/bundler/lib/bundler/installer/parallel_installer.rb +16 -8
  63. data/bundler/lib/bundler/installer/standalone.rb +2 -3
  64. data/bundler/lib/bundler/installer.rb +9 -9
  65. data/bundler/lib/bundler/lazy_specification.rb +28 -17
  66. data/bundler/lib/bundler/lockfile_generator.rb +9 -0
  67. data/bundler/lib/bundler/lockfile_parser.rb +81 -10
  68. data/bundler/lib/bundler/man/bundle-add.1 +3 -26
  69. data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
  70. data/bundler/lib/bundler/man/bundle-cache.1 +3 -24
  71. data/bundler/lib/bundler/man/bundle-check.1 +3 -12
  72. data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
  73. data/bundler/lib/bundler/man/bundle-config.1 +20 -211
  74. data/bundler/lib/bundler/man/bundle-config.1.ronn +6 -0
  75. data/bundler/lib/bundler/man/bundle-console.1 +4 -22
  76. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
  77. data/bundler/lib/bundler/man/bundle-exec.1 +12 -73
  78. data/bundler/lib/bundler/man/bundle-gem.1 +13 -49
  79. data/bundler/lib/bundler/man/bundle-help.1 +3 -7
  80. data/bundler/lib/bundler/man/bundle-info.1 +3 -9
  81. data/bundler/lib/bundler/man/bundle-init.1 +3 -12
  82. data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
  83. data/bundler/lib/bundler/man/bundle-install.1 +27 -125
  84. data/bundler/lib/bundler/man/bundle-install.1.ronn +1 -0
  85. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  86. data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
  87. data/bundler/lib/bundler/man/bundle-open.1 +7 -27
  88. data/bundler/lib/bundler/man/bundle-outdated.1 +3 -55
  89. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +1 -0
  90. data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
  91. data/bundler/lib/bundler/man/bundle-plugin.1 +3 -29
  92. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  93. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  94. data/bundler/lib/bundler/man/bundle-show.1 +3 -10
  95. data/bundler/lib/bundler/man/bundle-update.1 +18 -137
  96. data/bundler/lib/bundler/man/bundle-version.1 +3 -16
  97. data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
  98. data/bundler/lib/bundler/man/bundle.1 +5 -44
  99. data/bundler/lib/bundler/man/gemfile.5 +24 -301
  100. data/bundler/lib/bundler/man/gemfile.5.ronn +4 -0
  101. data/bundler/lib/bundler/match_metadata.rb +4 -0
  102. data/bundler/lib/bundler/match_platform.rb +1 -1
  103. data/bundler/lib/bundler/plugin/api/source.rb +3 -2
  104. data/bundler/lib/bundler/plugin/index.rb +8 -0
  105. data/bundler/lib/bundler/plugin/installer.rb +1 -1
  106. data/bundler/lib/bundler/plugin.rb +12 -5
  107. data/bundler/lib/bundler/resolver/base.rb +1 -1
  108. data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
  109. data/bundler/lib/bundler/resolver/spec_group.rb +1 -4
  110. data/bundler/lib/bundler/resolver.rb +16 -16
  111. data/bundler/lib/bundler/ruby_dsl.rb +20 -12
  112. data/bundler/lib/bundler/ruby_version.rb +1 -1
  113. data/bundler/lib/bundler/rubygems_ext.rb +27 -54
  114. data/bundler/lib/bundler/rubygems_gem_installer.rb +23 -58
  115. data/bundler/lib/bundler/rubygems_integration.rb +25 -94
  116. data/bundler/lib/bundler/runtime.rb +2 -2
  117. data/bundler/lib/bundler/self_manager.rb +23 -7
  118. data/bundler/lib/bundler/settings.rb +27 -7
  119. data/bundler/lib/bundler/setup.rb +4 -1
  120. data/bundler/lib/bundler/shared_helpers.rb +35 -13
  121. data/bundler/lib/bundler/source/git/git_proxy.rb +22 -14
  122. data/bundler/lib/bundler/source/git.rb +4 -3
  123. data/bundler/lib/bundler/source/metadata.rb +16 -16
  124. data/bundler/lib/bundler/source/path.rb +7 -6
  125. data/bundler/lib/bundler/source/rubygems.rb +21 -14
  126. data/bundler/lib/bundler/source.rb +2 -0
  127. data/bundler/lib/bundler/spec_set.rb +43 -12
  128. data/bundler/lib/bundler/stub_specification.rb +1 -0
  129. data/bundler/lib/bundler/templates/Executable.bundler +1 -1
  130. data/bundler/lib/bundler/templates/newgem/README.md.tt +3 -3
  131. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -6
  132. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  133. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  134. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  135. data/bundler/lib/bundler/ui/shell.rb +2 -2
  136. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  137. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  138. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  139. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  140. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  141. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  142. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +36 -36
  143. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  144. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  145. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  146. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +8 -10
  147. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  148. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  149. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  150. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  151. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  152. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  153. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  154. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  155. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  156. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
  157. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  158. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
  159. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +44 -6
  160. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  161. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  162. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +26 -150
  163. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +4 -46
  164. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  165. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -45
  166. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
  167. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  168. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  169. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  170. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  171. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  172. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  173. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +155 -8
  174. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  175. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  176. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  177. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  178. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  179. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  180. data/bundler/lib/bundler/vendored_persistent.rb +0 -4
  181. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  182. data/bundler/lib/bundler/version.rb +1 -1
  183. data/bundler/lib/bundler/vlad.rb +1 -1
  184. data/bundler/lib/bundler/yaml_serializer.rb +9 -4
  185. data/bundler/lib/bundler.rb +38 -35
  186. data/lib/rubygems/available_set.rb +4 -4
  187. data/lib/rubygems/basic_specification.rb +35 -37
  188. data/lib/rubygems/bundler_version_finder.rb +4 -4
  189. data/lib/rubygems/ci_detector.rb +75 -0
  190. data/lib/rubygems/command.rb +15 -17
  191. data/lib/rubygems/command_manager.rb +5 -4
  192. data/lib/rubygems/commands/build_command.rb +2 -2
  193. data/lib/rubygems/commands/cert_command.rb +2 -3
  194. data/lib/rubygems/commands/check_command.rb +4 -4
  195. data/lib/rubygems/commands/cleanup_command.rb +12 -14
  196. data/lib/rubygems/commands/contents_command.rb +5 -5
  197. data/lib/rubygems/commands/dependency_command.rb +4 -5
  198. data/lib/rubygems/commands/environment_command.rb +3 -5
  199. data/lib/rubygems/commands/exec_command.rb +1 -1
  200. data/lib/rubygems/commands/fetch_command.rb +2 -2
  201. data/lib/rubygems/commands/generate_index_command.rb +39 -74
  202. data/lib/rubygems/commands/help_command.rb +4 -4
  203. data/lib/rubygems/commands/info_command.rb +2 -2
  204. data/lib/rubygems/commands/install_command.rb +8 -16
  205. data/lib/rubygems/commands/list_command.rb +2 -2
  206. data/lib/rubygems/commands/lock_command.rb +1 -1
  207. data/lib/rubygems/commands/open_command.rb +1 -1
  208. data/lib/rubygems/commands/owner_command.rb +1 -1
  209. data/lib/rubygems/commands/pristine_command.rb +13 -15
  210. data/lib/rubygems/commands/push_command.rb +2 -2
  211. data/lib/rubygems/commands/query_command.rb +4 -5
  212. data/lib/rubygems/commands/rdoc_command.rb +2 -2
  213. data/lib/rubygems/commands/search_command.rb +2 -2
  214. data/lib/rubygems/commands/setup_command.rb +33 -36
  215. data/lib/rubygems/commands/sources_command.rb +12 -12
  216. data/lib/rubygems/commands/specification_command.rb +10 -10
  217. data/lib/rubygems/commands/stale_command.rb +1 -1
  218. data/lib/rubygems/commands/uninstall_command.rb +13 -14
  219. data/lib/rubygems/commands/unpack_command.rb +7 -7
  220. data/lib/rubygems/commands/update_command.rb +11 -13
  221. data/lib/rubygems/commands/which_command.rb +1 -1
  222. data/lib/rubygems/commands/yank_command.rb +1 -1
  223. data/lib/rubygems/compatibility.rb +5 -6
  224. data/lib/rubygems/config_file.rb +7 -7
  225. data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
  226. data/lib/rubygems/core_ext/kernel_require.rb +20 -49
  227. data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
  228. data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
  229. data/lib/rubygems/defaults.rb +15 -3
  230. data/lib/rubygems/dependency.rb +12 -14
  231. data/lib/rubygems/dependency_installer.rb +30 -31
  232. data/lib/rubygems/dependency_list.rb +1 -1
  233. data/lib/rubygems/deprecate.rb +16 -15
  234. data/lib/rubygems/doctor.rb +6 -6
  235. data/lib/rubygems/errors.rb +2 -6
  236. data/lib/rubygems/exceptions.rb +2 -1
  237. data/lib/rubygems/ext/builder.rb +15 -10
  238. data/lib/rubygems/ext/cargo_builder.rb +5 -5
  239. data/lib/rubygems/ext/ext_conf_builder.rb +2 -4
  240. data/lib/rubygems/ext/rake_builder.rb +1 -1
  241. data/lib/rubygems/gem_runner.rb +4 -4
  242. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
  243. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
  244. data/lib/rubygems/gemcutter_utilities.rb +18 -19
  245. data/lib/rubygems/install_update_options.rb +18 -19
  246. data/lib/rubygems/installer.rb +66 -45
  247. data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
  248. data/lib/rubygems/local_remote_options.rb +8 -11
  249. data/lib/rubygems/name_tuple.rb +7 -9
  250. data/lib/rubygems/net/http.rb +3 -0
  251. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  252. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  253. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  254. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  255. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  256. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  257. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  258. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  259. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  260. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  261. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  262. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  263. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  264. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  265. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  266. data/lib/rubygems/optparse/lib/optparse.rb +39 -17
  267. data/lib/rubygems/package/digest_io.rb +1 -1
  268. data/lib/rubygems/package/old.rb +2 -2
  269. data/lib/rubygems/package/tar_header.rb +45 -39
  270. data/lib/rubygems/package/tar_reader/entry.rb +5 -4
  271. data/lib/rubygems/package/tar_reader.rb +14 -5
  272. data/lib/rubygems/package/tar_writer.rb +20 -18
  273. data/lib/rubygems/package.rb +28 -27
  274. data/lib/rubygems/package_task.rb +2 -2
  275. data/lib/rubygems/path_support.rb +10 -11
  276. data/lib/rubygems/platform.rb +65 -48
  277. data/lib/rubygems/query_utils.rb +7 -9
  278. data/lib/rubygems/remote_fetcher.rb +17 -17
  279. data/lib/rubygems/request/connection_pools.rb +3 -3
  280. data/lib/rubygems/request.rb +20 -17
  281. data/lib/rubygems/request_set/gem_dependency_api.rb +120 -123
  282. data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
  283. data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
  284. data/lib/rubygems/request_set/lockfile.rb +6 -11
  285. data/lib/rubygems/request_set.rb +5 -5
  286. data/lib/rubygems/requirement.rb +7 -7
  287. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  288. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  289. data/lib/rubygems/resolver/activation_request.rb +1 -3
  290. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  291. data/lib/rubygems/resolver/best_set.rb +1 -1
  292. data/lib/rubygems/resolver/composed_set.rb +1 -1
  293. data/lib/rubygems/resolver/conflict.rb +4 -12
  294. data/lib/rubygems/resolver/index_set.rb +4 -4
  295. data/lib/rubygems/resolver/index_specification.rb +2 -2
  296. data/lib/rubygems/resolver/installer_set.rb +5 -6
  297. data/lib/rubygems/resolver/lock_set.rb +1 -1
  298. data/lib/rubygems/resolver.rb +6 -13
  299. data/lib/rubygems/s3_uri_signer.rb +6 -6
  300. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  301. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  302. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  303. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  304. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  305. data/lib/rubygems/safe_marshal.rb +74 -0
  306. data/lib/rubygems/safe_yaml.rb +5 -28
  307. data/lib/rubygems/security/policies.rb +36 -38
  308. data/lib/rubygems/security/policy.rb +7 -11
  309. data/lib/rubygems/security/signer.rb +1 -1
  310. data/lib/rubygems/security/trust_dir.rb +4 -4
  311. data/lib/rubygems/security.rb +8 -22
  312. data/lib/rubygems/source/git.rb +1 -3
  313. data/lib/rubygems/source/installed.rb +0 -2
  314. data/lib/rubygems/source/local.rb +7 -9
  315. data/lib/rubygems/source/lock.rb +1 -3
  316. data/lib/rubygems/source/specific_file.rb +0 -1
  317. data/lib/rubygems/source/vendor.rb +0 -2
  318. data/lib/rubygems/source.rb +12 -12
  319. data/lib/rubygems/source_list.rb +5 -5
  320. data/lib/rubygems/spec_fetcher.rb +31 -31
  321. data/lib/rubygems/specification.rb +145 -150
  322. data/lib/rubygems/specification_policy.rb +61 -31
  323. data/lib/rubygems/stub_specification.rb +4 -5
  324. data/lib/rubygems/text.rb +1 -2
  325. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  326. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  327. data/lib/rubygems/timeout.rb +3 -0
  328. data/lib/rubygems/tsort/lib/tsort.rb +3 -0
  329. data/lib/rubygems/uninstaller.rb +9 -11
  330. data/lib/rubygems/update_suggestion.rb +5 -18
  331. data/lib/rubygems/uri_formatter.rb +1 -1
  332. data/lib/rubygems/user_interaction.rb +17 -23
  333. data/lib/rubygems/util/licenses.rb +113 -35
  334. data/lib/rubygems/util/list.rb +3 -1
  335. data/lib/rubygems/util.rb +2 -4
  336. data/lib/rubygems/validator.rb +6 -4
  337. data/lib/rubygems/version.rb +35 -29
  338. data/lib/rubygems/version_option.rb +2 -5
  339. data/lib/rubygems/yaml_serializer.rb +9 -4
  340. data/lib/rubygems.rb +42 -42
  341. data/rubygems-update.gemspec +4 -4
  342. data/setup.rb +2 -2
  343. metadata +43 -225
  344. data/lib/rubygems/indexer.rb +0 -428
  345. data/lib/rubygems/mock_gem_ui.rb +0 -86
  346. data/test/rubygems/alternate_cert.pem +0 -19
  347. data/test/rubygems/alternate_cert_32.pem +0 -19
  348. data/test/rubygems/alternate_key.pem +0 -27
  349. data/test/rubygems/bad_rake.rb +0 -3
  350. data/test/rubygems/bundler_test_gem.rb +0 -424
  351. data/test/rubygems/ca_cert.pem +0 -77
  352. data/test/rubygems/child_cert.pem +0 -19
  353. data/test/rubygems/child_cert_32.pem +0 -19
  354. data/test/rubygems/child_key.pem +0 -27
  355. data/test/rubygems/client.pem +0 -107
  356. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  357. data/test/rubygems/data/gem-private_key.pem +0 -27
  358. data/test/rubygems/data/gem-public_cert.pem +0 -20
  359. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  360. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  361. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  362. data/test/rubygems/encrypted_private_key.pem +0 -30
  363. data/test/rubygems/expired_cert.pem +0 -19
  364. data/test/rubygems/fake_certlib/openssl.rb +0 -9
  365. data/test/rubygems/foo/discover.rb +0 -1
  366. data/test/rubygems/future_cert.pem +0 -19
  367. data/test/rubygems/future_cert_32.pem +0 -19
  368. data/test/rubygems/good_rake.rb +0 -3
  369. data/test/rubygems/grandchild_cert.pem +0 -19
  370. data/test/rubygems/grandchild_cert_32.pem +0 -19
  371. data/test/rubygems/grandchild_key.pem +0 -27
  372. data/test/rubygems/helper.rb +0 -1649
  373. data/test/rubygems/installer_test_case.rb +0 -248
  374. data/test/rubygems/invalid_client.pem +0 -49
  375. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  376. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  377. data/test/rubygems/invalid_key.pem +0 -27
  378. data/test/rubygems/invalid_signer_cert.pem +0 -19
  379. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  380. data/test/rubygems/invalidchild_cert.pem +0 -19
  381. data/test/rubygems/invalidchild_cert_32.pem +0 -19
  382. data/test/rubygems/invalidchild_key.pem +0 -27
  383. data/test/rubygems/multifactor_auth_utilities.rb +0 -111
  384. data/test/rubygems/package/tar_test_case.rb +0 -175
  385. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  386. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  387. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  388. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
  389. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
  390. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
  391. data/test/rubygems/private3072_key.pem +0 -40
  392. data/test/rubygems/private_ec_key.pem +0 -9
  393. data/test/rubygems/private_key.pem +0 -27
  394. data/test/rubygems/public3072_cert.pem +0 -25
  395. data/test/rubygems/public_cert.pem +0 -20
  396. data/test/rubygems/public_cert_32.pem +0 -19
  397. data/test/rubygems/public_key.pem +0 -9
  398. data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
  399. data/test/rubygems/rubygems_plugin.rb +0 -24
  400. data/test/rubygems/sff/discover.rb +0 -1
  401. data/test/rubygems/simple_gem.rb +0 -68
  402. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  403. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  404. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
  405. data/test/rubygems/ssl_cert.pem +0 -80
  406. data/test/rubygems/ssl_key.pem +0 -27
  407. data/test/rubygems/test_bundled_ca.rb +0 -61
  408. data/test/rubygems/test_config.rb +0 -28
  409. data/test/rubygems/test_deprecate.rb +0 -158
  410. data/test/rubygems/test_exit.rb +0 -17
  411. data/test/rubygems/test_gem.rb +0 -1799
  412. data/test/rubygems/test_gem_available_set.rb +0 -130
  413. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
  414. data/test/rubygems/test_gem_command.rb +0 -403
  415. data/test/rubygems/test_gem_command_manager.rb +0 -400
  416. data/test/rubygems/test_gem_commands_build_command.rb +0 -739
  417. data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
  418. data/test/rubygems/test_gem_commands_check_command.rb +0 -68
  419. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
  420. data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
  421. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
  422. data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
  423. data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
  424. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
  425. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
  426. data/test/rubygems/test_gem_commands_help_command.rb +0 -94
  427. data/test/rubygems/test_gem_commands_info_command.rb +0 -70
  428. data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
  429. data/test/rubygems/test_gem_commands_list_command.rb +0 -33
  430. data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
  431. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  432. data/test/rubygems/test_gem_commands_open_command.rb +0 -101
  433. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
  434. data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
  435. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
  436. data/test/rubygems/test_gem_commands_push_command.rb +0 -603
  437. data/test/rubygems/test_gem_commands_query_command.rb +0 -858
  438. data/test/rubygems/test_gem_commands_search_command.rb +0 -16
  439. data/test/rubygems/test_gem_commands_server_command.rb +0 -20
  440. data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
  441. data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
  442. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  443. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  444. data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
  445. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  446. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -522
  447. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
  448. data/test/rubygems/test_gem_commands_update_command.rb +0 -836
  449. data/test/rubygems/test_gem_commands_which_command.rb +0 -85
  450. data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
  451. data/test/rubygems/test_gem_config_file.rb +0 -551
  452. data/test/rubygems/test_gem_dependency.rb +0 -398
  453. data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
  454. data/test/rubygems/test_gem_dependency_list.rb +0 -265
  455. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
  456. data/test/rubygems/test_gem_doctor.rb +0 -195
  457. data/test/rubygems/test_gem_ext_builder.rb +0 -337
  458. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  459. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  460. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
  461. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
  462. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
  463. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
  464. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  465. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
  466. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  467. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
  468. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
  469. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
  470. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
  471. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
  472. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
  473. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
  474. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
  475. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
  476. data/test/rubygems/test_gem_gem_runner.rb +0 -119
  477. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
  478. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
  479. data/test/rubygems/test_gem_indexer.rb +0 -381
  480. data/test/rubygems/test_gem_install_update_options.rb +0 -208
  481. data/test/rubygems/test_gem_installer.rb +0 -2512
  482. data/test/rubygems/test_gem_local_remote_options.rb +0 -133
  483. data/test/rubygems/test_gem_name_tuple.rb +0 -43
  484. data/test/rubygems/test_gem_package.rb +0 -1306
  485. data/test/rubygems/test_gem_package_old.rb +0 -91
  486. data/test/rubygems/test_gem_package_tar_header.rb +0 -226
  487. data/test/rubygems/test_gem_package_tar_reader.rb +0 -135
  488. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
  489. data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
  490. data/test/rubygems/test_gem_package_task.rb +0 -118
  491. data/test/rubygems/test_gem_path_support.rb +0 -139
  492. data/test/rubygems/test_gem_platform.rb +0 -497
  493. data/test/rubygems/test_gem_rdoc.rb +0 -137
  494. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
  495. data/test/rubygems/test_gem_request.rb +0 -547
  496. data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
  497. data/test/rubygems/test_gem_request_set.rb +0 -672
  498. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
  499. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
  500. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
  501. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
  502. data/test/rubygems/test_gem_requirement.rb +0 -505
  503. data/test/rubygems/test_gem_resolver.rb +0 -859
  504. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
  505. data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
  506. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
  507. data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
  508. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
  509. data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
  510. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
  511. data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
  512. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  513. data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
  514. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
  515. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
  516. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
  517. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
  518. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
  519. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
  520. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
  521. data/test/rubygems/test_gem_resolver_specification.rb +0 -63
  522. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
  523. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
  524. data/test/rubygems/test_gem_security.rb +0 -341
  525. data/test/rubygems/test_gem_security_policy.rb +0 -535
  526. data/test/rubygems/test_gem_security_signer.rb +0 -218
  527. data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
  528. data/test/rubygems/test_gem_silent_ui.rb +0 -123
  529. data/test/rubygems/test_gem_source.rb +0 -254
  530. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
  531. data/test/rubygems/test_gem_source_git.rb +0 -310
  532. data/test/rubygems/test_gem_source_installed.rb +0 -35
  533. data/test/rubygems/test_gem_source_list.rb +0 -119
  534. data/test/rubygems/test_gem_source_local.rb +0 -107
  535. data/test/rubygems/test_gem_source_lock.rb +0 -113
  536. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  537. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
  538. data/test/rubygems/test_gem_source_vendor.rb +0 -30
  539. data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
  540. data/test/rubygems/test_gem_specification.rb +0 -3856
  541. data/test/rubygems/test_gem_stream_ui.rb +0 -255
  542. data/test/rubygems/test_gem_stub_specification.rb +0 -278
  543. data/test/rubygems/test_gem_text.rb +0 -103
  544. data/test/rubygems/test_gem_uninstaller.rb +0 -675
  545. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
  546. data/test/rubygems/test_gem_update_suggestion.rb +0 -209
  547. data/test/rubygems/test_gem_uri.rb +0 -41
  548. data/test/rubygems/test_gem_uri_formatter.rb +0 -27
  549. data/test/rubygems/test_gem_util.rb +0 -91
  550. data/test/rubygems/test_gem_validator.rb +0 -42
  551. data/test/rubygems/test_gem_version.rb +0 -305
  552. data/test/rubygems/test_gem_version_option.rb +0 -165
  553. data/test/rubygems/test_kernel.rb +0 -124
  554. data/test/rubygems/test_project_sanity.rb +0 -49
  555. data/test/rubygems/test_remote_fetch_error.rb +0 -20
  556. data/test/rubygems/test_require.rb +0 -732
  557. data/test/rubygems/test_rubygems.rb +0 -76
  558. data/test/rubygems/test_webauthn_listener.rb +0 -143
  559. data/test/rubygems/test_webauthn_listener_response.rb +0 -93
  560. data/test/rubygems/test_webauthn_poller.rb +0 -124
  561. data/test/rubygems/utilities.rb +0 -436
  562. data/test/rubygems/wrong_key_cert.pem +0 -19
  563. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  564. data/test/test_changelog_generator.rb +0 -17
@@ -1,547 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require "rubygems/request"
5
- require "ostruct"
6
-
7
- unless Gem::HAVE_OPENSSL
8
- warn "Skipping Gem::Request tests. openssl not found."
9
- end
10
-
11
- class TestGemRequest < Gem::TestCase
12
- CA_CERT_FILE = cert_path "ca"
13
- CHILD_CERT = load_cert "child"
14
- EXPIRED_CERT = load_cert "expired"
15
- PUBLIC_CERT = load_cert "public"
16
- PUBLIC_CERT_FILE = cert_path "public"
17
- SSL_CERT = load_cert "ssl"
18
-
19
- def make_request(uri, request_class, last_modified, proxy)
20
- Gem::Request.create_with_proxy uri, request_class, last_modified, proxy
21
- end
22
-
23
- # This method is same code as Base64.encode64
24
- # We should not use Base64.encode64 because we need to avoid gem activation.
25
- def base64_encode64(bin)
26
- [bin].pack("m")
27
- end
28
-
29
- def setup
30
- @proxies = %w[http_proxy https_proxy HTTP_PROXY http_proxy_user HTTP_PROXY_USER http_proxy_pass HTTP_PROXY_PASS no_proxy NO_PROXY]
31
- @old_proxies = @proxies.map {|k| ENV[k] }
32
- @proxies.each {|k| ENV[k] = nil }
33
-
34
- super
35
-
36
- @proxy_uri = "http://localhost:1234"
37
- @uri = URI("http://example")
38
-
39
- @request = make_request @uri, nil, nil, nil
40
- end
41
-
42
- def teardown
43
- super
44
- Gem.configuration[:http_proxy] = nil
45
- @proxies.each_with_index {|k, i| ENV[k] = @old_proxies[i] }
46
- end
47
-
48
- def test_initialize_proxy
49
- proxy_uri = "http://proxy.example.com"
50
-
51
- request = make_request @uri, nil, nil, proxy_uri
52
-
53
- assert_equal proxy_uri, request.proxy_uri.to_s
54
- end
55
-
56
- def test_initialize_proxy_URI
57
- proxy_uri = "http://proxy.example.com"
58
-
59
- request = make_request @uri, nil, nil, URI(proxy_uri)
60
-
61
- assert_equal proxy_uri, request.proxy_uri.to_s
62
- end
63
-
64
- def test_initialize_proxy_ENV
65
- ENV["http_proxy"] = @proxy_uri
66
- ENV["http_proxy_user"] = "foo"
67
- ENV["http_proxy_pass"] = "bar"
68
-
69
- request = make_request @uri, nil, nil, nil
70
-
71
- proxy = request.proxy_uri
72
-
73
- assert_equal "foo", proxy.user
74
- assert_equal "bar", proxy.password
75
- end
76
-
77
- def test_initialize_proxy_ENV_https
78
- ENV["https_proxy"] = @proxy_uri
79
-
80
- request = make_request URI("https://example"), nil, nil, nil
81
-
82
- proxy = request.proxy_uri
83
-
84
- assert_equal URI(@proxy_uri), proxy
85
- end
86
-
87
- def test_proxy_ENV
88
- ENV["http_proxy"] = "http://proxy"
89
- ENV["https_proxy"] = ""
90
-
91
- request = make_request URI("https://example"), nil, nil, nil
92
-
93
- proxy = request.proxy_uri
94
-
95
- assert_nil proxy
96
- end
97
-
98
- def test_configure_connection_for_https
99
- connection = Net::HTTP.new "localhost", 443
100
-
101
- request = Class.new(Gem::Request) do
102
- def self.get_cert_files
103
- [TestGemRequest::PUBLIC_CERT_FILE]
104
- end
105
- end.create_with_proxy URI("https://example"), nil, nil, nil
106
-
107
- Gem::Request.configure_connection_for_https connection, request.cert_files
108
-
109
- cert_store = connection.cert_store
110
-
111
- assert cert_store.verify CHILD_CERT
112
- end
113
-
114
- def test_configure_connection_for_https_ssl_ca_cert
115
- ssl_ca_cert = Gem.configuration.ssl_ca_cert
116
- Gem.configuration.ssl_ca_cert = CA_CERT_FILE
117
-
118
- connection = Net::HTTP.new "localhost", 443
119
-
120
- request = Class.new(Gem::Request) do
121
- def self.get_cert_files
122
- [TestGemRequest::PUBLIC_CERT_FILE]
123
- end
124
- end.create_with_proxy URI("https://example"), nil, nil, nil
125
-
126
- Gem::Request.configure_connection_for_https connection, request.cert_files
127
-
128
- cert_store = connection.cert_store
129
-
130
- assert cert_store.verify CHILD_CERT
131
- assert cert_store.verify SSL_CERT
132
- ensure
133
- Gem.configuration.ssl_ca_cert = ssl_ca_cert
134
- end
135
-
136
- def test_get_proxy_from_env_fallback
137
- ENV["http_proxy"] = @proxy_uri
138
- request = make_request @uri, nil, nil, nil
139
- proxy = request.proxy_uri
140
-
141
- assert_equal URI(@proxy_uri), proxy
142
- end
143
-
144
- def test_get_proxy_from_env_https
145
- ENV["https_proxy"] = @proxy_uri
146
- uri = URI("https://example")
147
- request = make_request uri, nil, nil, nil
148
-
149
- proxy = request.proxy_uri
150
-
151
- assert_equal URI(@proxy_uri), proxy
152
- end
153
-
154
- def test_get_proxy_from_env_domain
155
- ENV["http_proxy"] = @proxy_uri
156
- ENV["http_proxy_user"] = 'foo\user'
157
- ENV["http_proxy_pass"] = "my bar"
158
- request = make_request @uri, nil, nil, nil
159
-
160
- proxy = request.proxy_uri
161
-
162
- assert_equal 'foo\user', Gem::UriFormatter.new(proxy.user).unescape
163
- assert_equal "my bar", Gem::UriFormatter.new(proxy.password).unescape
164
- end
165
-
166
- def test_get_proxy_from_env_escape
167
- ENV["http_proxy"] = @proxy_uri
168
- ENV["http_proxy_user"] = "foo@user"
169
- ENV["http_proxy_pass"] = "my@bar"
170
- request = make_request @uri, nil, nil, nil
171
-
172
- proxy = request.proxy_uri
173
-
174
- assert_equal "foo%40user", proxy.user
175
- assert_equal "my%40bar", proxy.password
176
- end
177
-
178
- def test_get_proxy_from_env_normalize
179
- ENV["HTTP_PROXY"] = "fakeurl:12345"
180
- request = make_request @uri, nil, nil, nil
181
-
182
- assert_equal "http://fakeurl:12345", request.proxy_uri.to_s
183
- end
184
-
185
- def test_get_proxy_from_env_empty
186
- ENV["HTTP_PROXY"] = ""
187
- ENV.delete "http_proxy"
188
- request = make_request @uri, nil, nil, nil
189
-
190
- assert_nil request.proxy_uri
191
- end
192
-
193
- def test_fetch
194
- uri = Gem::Uri.new(URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}")
195
- response = util_stub_net_http(:body => :junk, :code => 200) do
196
- @request = make_request(uri, Net::HTTP::Get, nil, nil)
197
-
198
- @request.fetch
199
- end
200
-
201
- assert_equal 200, response.code
202
- assert_equal :junk, response.body
203
- end
204
-
205
- def test_fetch_basic_auth
206
- Gem.configuration.verbose = :really
207
- uri = Gem::Uri.new(URI.parse "https://user:pass@example.rubygems/specs.#{Gem.marshal_version}")
208
- conn = util_stub_net_http(:body => :junk, :code => 200) do |c|
209
- use_ui @ui do
210
- @request = make_request(uri, Net::HTTP::Get, nil, nil)
211
- @request.fetch
212
- end
213
- c
214
- end
215
-
216
- auth_header = conn.payload["Authorization"]
217
- assert_equal "Basic #{base64_encode64("user:pass")}".strip, auth_header
218
- assert_includes @ui.output, "GET https://user:REDACTED@example.rubygems/specs.#{Gem.marshal_version}"
219
- end
220
-
221
- def test_fetch_basic_auth_encoded
222
- Gem.configuration.verbose = :really
223
- uri = Gem::Uri.new(URI.parse "https://user:%7BDEScede%7Dpass@example.rubygems/specs.#{Gem.marshal_version}")
224
-
225
- conn = util_stub_net_http(:body => :junk, :code => 200) do |c|
226
- use_ui @ui do
227
- @request = make_request(uri, Net::HTTP::Get, nil, nil)
228
- @request.fetch
229
- end
230
- c
231
- end
232
-
233
- auth_header = conn.payload["Authorization"]
234
- assert_equal "Basic #{base64_encode64("user:{DEScede}pass")}".strip, auth_header
235
- assert_includes @ui.output, "GET https://user:REDACTED@example.rubygems/specs.#{Gem.marshal_version}"
236
- end
237
-
238
- def test_fetch_basic_oauth_encoded
239
- Gem.configuration.verbose = :really
240
- uri = Gem::Uri.new(URI.parse "https://%7BDEScede%7Dpass:x-oauth-basic@example.rubygems/specs.#{Gem.marshal_version}")
241
-
242
- conn = util_stub_net_http(:body => :junk, :code => 200) do |c|
243
- use_ui @ui do
244
- @request = make_request(uri, Net::HTTP::Get, nil, nil)
245
- @request.fetch
246
- end
247
- c
248
- end
249
-
250
- auth_header = conn.payload["Authorization"]
251
- assert_equal "Basic #{base64_encode64("{DEScede}pass:x-oauth-basic")}".strip, auth_header
252
- assert_includes @ui.output, "GET https://REDACTED:x-oauth-basic@example.rubygems/specs.#{Gem.marshal_version}"
253
- end
254
-
255
- def test_fetch_head
256
- uri = Gem::Uri.new(URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}")
257
- response = util_stub_net_http(:body => "", :code => 200) do |conn|
258
- @request = make_request(uri, Net::HTTP::Get, nil, nil)
259
- @request.fetch
260
- end
261
-
262
- assert_equal 200, response.code
263
- assert_equal "", response.body
264
- end
265
-
266
- def test_fetch_unmodified
267
- uri = Gem::Uri.new(URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}")
268
- t = Time.utc(2013, 1, 2, 3, 4, 5)
269
- conn, response = util_stub_net_http(:body => "", :code => 304) do |c|
270
- @request = make_request(uri, Net::HTTP::Get, t, nil)
271
- [c, @request.fetch]
272
- end
273
-
274
- assert_equal 304, response.code
275
- assert_equal "", response.body
276
-
277
- modified_header = conn.payload["if-modified-since"]
278
-
279
- assert_equal "Wed, 02 Jan 2013 03:04:05 GMT", modified_header
280
- end
281
-
282
- def test_user_agent
283
- ua = make_request(@uri, nil, nil, nil).user_agent
284
-
285
- assert_match %r{^RubyGems/\S+ \S+ Ruby/\S+ \(.*?\)}, ua
286
- assert_match %r{RubyGems/#{Regexp.escape Gem::VERSION}}, ua
287
- assert_match %r{ #{Regexp.escape Gem::Platform.local.to_s} }, ua
288
- assert_match %r{Ruby/#{Regexp.escape RUBY_VERSION}}, ua
289
- assert_match %r{\(#{Regexp.escape RUBY_RELEASE_DATE} }, ua
290
- end
291
-
292
- def test_user_agent_engine
293
- util_save_version
294
-
295
- Object.send :remove_const, :RUBY_ENGINE
296
- Object.send :const_set, :RUBY_ENGINE, "vroom"
297
-
298
- ua = make_request(@uri, nil, nil, nil).user_agent
299
-
300
- assert_match %r{\) vroom}, ua
301
- ensure
302
- util_restore_version
303
- end
304
-
305
- def test_user_agent_engine_ruby
306
- util_save_version
307
-
308
- Object.send :remove_const, :RUBY_ENGINE
309
- Object.send :const_set, :RUBY_ENGINE, "ruby"
310
-
311
- ua = make_request(@uri, nil, nil, nil).user_agent
312
-
313
- assert_match %r{\)}, ua
314
- ensure
315
- util_restore_version
316
- end
317
-
318
- def test_user_agent_patchlevel
319
- util_save_version
320
-
321
- Object.send :remove_const, :RUBY_PATCHLEVEL
322
- Object.send :const_set, :RUBY_PATCHLEVEL, 5
323
-
324
- ua = make_request(@uri, nil, nil, nil).user_agent
325
-
326
- assert_match %r{ patchlevel 5\)}, ua
327
- ensure
328
- util_restore_version
329
- end
330
-
331
- def test_user_agent_revision
332
- util_save_version
333
-
334
- Object.send :remove_const, :RUBY_PATCHLEVEL
335
- Object.send :const_set, :RUBY_PATCHLEVEL, -1
336
- Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION)
337
- Object.send :const_set, :RUBY_REVISION, 6
338
-
339
- ua = make_request(@uri, nil, nil, nil).user_agent
340
-
341
- assert_match %r{ revision 6\)}, ua
342
- assert_match %r{Ruby/#{Regexp.escape RUBY_VERSION}dev}, ua
343
- ensure
344
- util_restore_version
345
- end
346
-
347
- def test_user_agent_revision_missing
348
- util_save_version
349
-
350
- Object.send :remove_const, :RUBY_PATCHLEVEL
351
- Object.send :const_set, :RUBY_PATCHLEVEL, -1
352
- Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION)
353
-
354
- ua = make_request(@uri, nil, nil, nil).user_agent
355
-
356
- assert_match %r{\(#{Regexp.escape RUBY_RELEASE_DATE}\)}, ua
357
- ensure
358
- util_restore_version
359
- end
360
-
361
- def test_verify_certificate
362
- pend if Gem.java_platform?
363
-
364
- error_number = OpenSSL::X509::V_ERR_OUT_OF_MEM
365
-
366
- store = OpenSSL::X509::Store.new
367
- context = OpenSSL::X509::StoreContext.new store
368
- context.error = error_number
369
-
370
- use_ui @ui do
371
- Gem::Request.verify_certificate context
372
- end
373
-
374
- assert_equal "ERROR: SSL verification error at depth 0: out of memory (#{error_number})\n",
375
- @ui.error
376
- end
377
-
378
- def test_verify_certificate_extra_message
379
- pend if Gem.java_platform?
380
-
381
- error_number = OpenSSL::X509::V_ERR_INVALID_CA
382
-
383
- store = OpenSSL::X509::Store.new
384
- context = OpenSSL::X509::StoreContext.new store
385
- context.error = error_number
386
-
387
- use_ui @ui do
388
- Gem::Request.verify_certificate context
389
- end
390
-
391
- expected = <<-ERROR
392
- ERROR: SSL verification error at depth 0: invalid CA certificate (#{error_number})
393
- ERROR: Certificate is an invalid CA certificate
394
- ERROR
395
-
396
- assert_equal expected, @ui.error
397
- end
398
-
399
- def test_verify_certificate_message_CERT_HAS_EXPIRED
400
- error_number = OpenSSL::X509::V_ERR_CERT_HAS_EXPIRED
401
-
402
- message =
403
- Gem::Request.verify_certificate_message error_number, EXPIRED_CERT
404
-
405
- assert_equal "Certificate #{EXPIRED_CERT.subject} expired at #{EXPIRED_CERT.not_before.iso8601}",
406
- message
407
- end
408
-
409
- def test_verify_certificate_message_CERT_NOT_YET_VALID
410
- error_number = OpenSSL::X509::V_ERR_CERT_NOT_YET_VALID
411
-
412
- message =
413
- Gem::Request.verify_certificate_message error_number, EXPIRED_CERT
414
-
415
- assert_equal "Certificate #{EXPIRED_CERT.subject} not valid until #{EXPIRED_CERT.not_before.iso8601}",
416
- message
417
- end
418
-
419
- def test_verify_certificate_message_CERT_REJECTED
420
- error_number = OpenSSL::X509::V_ERR_CERT_REJECTED
421
-
422
- message =
423
- Gem::Request.verify_certificate_message error_number, CHILD_CERT
424
-
425
- assert_equal "Certificate #{CHILD_CERT.subject} is rejected",
426
- message
427
- end
428
-
429
- def test_verify_certificate_message_CERT_UNTRUSTED
430
- error_number = OpenSSL::X509::V_ERR_CERT_UNTRUSTED
431
-
432
- message =
433
- Gem::Request.verify_certificate_message error_number, CHILD_CERT
434
-
435
- assert_equal "Certificate #{CHILD_CERT.subject} is not trusted",
436
- message
437
- end
438
-
439
- def test_verify_certificate_message_DEPTH_ZERO_SELF_SIGNED_CERT
440
- error_number = OpenSSL::X509::V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
441
-
442
- message =
443
- Gem::Request.verify_certificate_message error_number, CHILD_CERT
444
-
445
- assert_equal "Certificate #{CHILD_CERT.issuer} is not trusted",
446
- message
447
- end
448
-
449
- def test_verify_certificate_message_INVALID_CA
450
- error_number = OpenSSL::X509::V_ERR_INVALID_CA
451
-
452
- message =
453
- Gem::Request.verify_certificate_message error_number, CHILD_CERT
454
-
455
- assert_equal "Certificate #{CHILD_CERT.subject} is an invalid CA certificate",
456
- message
457
- end
458
-
459
- def test_verify_certificate_message_INVALID_PURPOSE
460
- error_number = OpenSSL::X509::V_ERR_INVALID_PURPOSE
461
-
462
- message =
463
- Gem::Request.verify_certificate_message error_number, CHILD_CERT
464
-
465
- assert_equal "Certificate #{CHILD_CERT.subject} has an invalid purpose",
466
- message
467
- end
468
-
469
- def test_verify_certificate_message_SELF_SIGNED_CERT_IN_CHAIN
470
- error_number = OpenSSL::X509::V_ERR_SELF_SIGNED_CERT_IN_CHAIN
471
-
472
- message =
473
- Gem::Request.verify_certificate_message error_number, EXPIRED_CERT
474
-
475
- assert_equal "Root certificate is not trusted (#{EXPIRED_CERT.subject})",
476
- message
477
- end
478
-
479
- def test_verify_certificate_message_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
480
- error_number = OpenSSL::X509::V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
481
-
482
- message =
483
- Gem::Request.verify_certificate_message error_number, EXPIRED_CERT
484
-
485
- assert_equal "You must add #{EXPIRED_CERT.issuer} to your local trusted store",
486
- message
487
- end
488
-
489
- def test_verify_certificate_message_UNABLE_TO_VERIFY_LEAF_SIGNATURE
490
- error_number = OpenSSL::X509::V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE
491
-
492
- message =
493
- Gem::Request.verify_certificate_message error_number, EXPIRED_CERT
494
-
495
- assert_equal "Cannot verify certificate issued by #{EXPIRED_CERT.issuer}",
496
- message
497
- end
498
-
499
- def util_restore_version
500
- Object.send :remove_const, :RUBY_ENGINE
501
- Object.send :const_set, :RUBY_ENGINE, @orig_RUBY_ENGINE if
502
- defined?(@orig_RUBY_ENGINE)
503
-
504
- Object.send :remove_const, :RUBY_PATCHLEVEL
505
- Object.send :const_set, :RUBY_PATCHLEVEL, @orig_RUBY_PATCHLEVEL
506
-
507
- Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION)
508
- Object.send :const_set, :RUBY_REVISION, @orig_RUBY_REVISION if
509
- defined?(@orig_RUBY_REVISION)
510
- end
511
-
512
- def util_save_version
513
- @orig_RUBY_ENGINE = RUBY_ENGINE
514
- @orig_RUBY_PATCHLEVEL = RUBY_PATCHLEVEL
515
- @orig_RUBY_REVISION = RUBY_REVISION if defined? RUBY_REVISION
516
- end
517
-
518
- def util_stub_net_http(hash)
519
- old_client = Gem::Request::ConnectionPools.client
520
- conn = Conn.new OpenStruct.new(hash)
521
- Gem::Request::ConnectionPools.client = conn
522
- yield conn
523
- ensure
524
- Gem::Request::ConnectionPools.client = old_client
525
- end
526
-
527
- class Conn
528
- attr_accessor :payload
529
-
530
- def new(*args); self; end
531
- def use_ssl=(bool); end
532
- def verify_callback=(setting); end
533
- def verify_mode=(setting); end
534
- def cert_store=(setting); end
535
- def start; end
536
-
537
- def initialize(response)
538
- @response = response
539
- self.payload = nil
540
- end
541
-
542
- def request(req)
543
- self.payload = req
544
- @response
545
- end
546
- end
547
- end if Gem::HAVE_OPENSSL
@@ -1,152 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require "rubygems/request"
5
- require "timeout"
6
-
7
- class TestGemRequestConnectionPool < Gem::TestCase
8
- class FakeHttp
9
- def initialize(*args)
10
- end
11
-
12
- def start
13
- end
14
- end
15
-
16
- def setup
17
- super
18
- @old_client = Gem::Request::ConnectionPools.client
19
- Gem::Request::ConnectionPools.client = FakeHttp
20
-
21
- @proxy = URI "http://proxy.example"
22
- end
23
-
24
- def teardown
25
- Gem::Request::ConnectionPools.client = @old_client
26
- super
27
- end
28
-
29
- def test_to_proxy_substring
30
- pools = Gem::Request::ConnectionPools.new nil, []
31
-
32
- env_no_proxy = %w[
33
- ems.example
34
- ]
35
-
36
- no_proxy = pools.send :no_proxy?, "rubygems.example", env_no_proxy
37
-
38
- refute no_proxy, "mismatch"
39
- end
40
-
41
- def test_to_proxy_empty_string
42
- pools = Gem::Request::ConnectionPools.new nil, []
43
-
44
- env_no_proxy = [""]
45
-
46
- no_proxy = pools.send :no_proxy?, "ems.example", env_no_proxy
47
-
48
- refute no_proxy, "mismatch"
49
- end
50
-
51
- def test_checkout_same_connection
52
- uri = URI.parse("http://example/some_endpoint")
53
-
54
- pools = Gem::Request::ConnectionPools.new nil, []
55
- pool = pools.pool_for uri
56
- conn = pool.checkout
57
- pool.checkin conn
58
-
59
- assert_equal conn, pool.checkout
60
- end
61
-
62
- def test_to_proxy_eh
63
- pools = Gem::Request::ConnectionPools.new nil, []
64
-
65
- env_no_proxy = %w[
66
- 1.no-proxy.example
67
- 2.no-proxy.example
68
- ]
69
-
70
- no_proxy = pools.send :no_proxy?, "2.no-proxy.example", env_no_proxy
71
-
72
- assert no_proxy, "match"
73
-
74
- no_proxy = pools.send :no_proxy?, "proxy.example", env_no_proxy
75
-
76
- refute no_proxy, "mismatch"
77
- end
78
-
79
- def test_to_proxy_eh_wildcard
80
- pools = Gem::Request::ConnectionPools.new nil, []
81
-
82
- env_no_proxy = %w[
83
- .no-proxy.example
84
- ]
85
-
86
- no_proxy = pools.send :no_proxy?, "2.no-proxy.example", env_no_proxy
87
-
88
- assert no_proxy, "wildcard matching subdomain"
89
-
90
- no_proxy = pools.send :no_proxy?, "no-proxy.example", env_no_proxy
91
-
92
- assert no_proxy, "wildcard matching dotless domain"
93
-
94
- no_proxy = pools.send :no_proxy?, "proxy.example", env_no_proxy
95
-
96
- refute no_proxy, "wildcard mismatch"
97
- end
98
-
99
- def test_net_http_args
100
- pools = Gem::Request::ConnectionPools.new nil, []
101
-
102
- net_http_args = pools.send :net_http_args, URI("http://example"), nil
103
-
104
- assert_equal ["example", 80], net_http_args
105
- end
106
-
107
- def test_net_http_args_ipv6
108
- pools = Gem::Request::ConnectionPools.new nil, []
109
-
110
- net_http_args = pools.send :net_http_args, URI("http://[::1]"), nil
111
-
112
- assert_equal ["::1", 80], net_http_args
113
- end
114
-
115
- def test_net_http_args_proxy
116
- pools = Gem::Request::ConnectionPools.new nil, []
117
-
118
- net_http_args = pools.send :net_http_args, URI("http://example"), @proxy
119
-
120
- assert_equal ["example", 80, "proxy.example", 80, nil, nil], net_http_args
121
- end
122
-
123
- def test_net_http_args_no_proxy
124
- orig_no_proxy = ENV["no_proxy"]
125
- ENV["no_proxy"] = "example"
126
-
127
- pools = Gem::Request::ConnectionPools.new nil, []
128
-
129
- net_http_args = pools.send :net_http_args, URI("http://example"), @proxy
130
-
131
- assert_equal ["example", 80, nil, nil], net_http_args
132
-
133
- ensure
134
- ENV["no_proxy"] = orig_no_proxy
135
- end
136
-
137
- def test_thread_waits_for_connection
138
- uri = URI.parse("http://example/some_endpoint")
139
- pools = Gem::Request::ConnectionPools.new nil, []
140
- pool = pools.pool_for uri
141
-
142
- pool.checkout
143
-
144
- Thread.new do
145
- assert_raise(Timeout::Error) do
146
- Timeout.timeout(1) do
147
- pool.checkout
148
- end
149
- end
150
- end.join
151
- end
152
- end