rubygems-update 3.3.18 → 3.6.2

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 (832) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2182 -1067
  3. data/CODE_OF_CONDUCT.md +79 -28
  4. data/Manifest.txt +184 -290
  5. data/README.md +35 -19
  6. data/bundler/CHANGELOG.md +1003 -3
  7. data/bundler/README.md +3 -7
  8. data/bundler/bundler.gemspec +11 -11
  9. data/bundler/exe/bundle +5 -25
  10. data/bundler/lib/bundler/build_metadata.rb +3 -3
  11. data/bundler/lib/bundler/capistrano.rb +1 -1
  12. data/bundler/lib/bundler/checksum.rb +254 -0
  13. data/bundler/lib/bundler/ci_detector.rb +75 -0
  14. data/bundler/lib/bundler/cli/add.rb +7 -5
  15. data/bundler/lib/bundler/cli/binstubs.rb +10 -6
  16. data/bundler/lib/bundler/cli/cache.rb +1 -1
  17. data/bundler/lib/bundler/cli/check.rb +4 -4
  18. data/bundler/lib/bundler/cli/common.rb +11 -1
  19. data/bundler/lib/bundler/cli/config.rb +8 -7
  20. data/bundler/lib/bundler/cli/console.rb +2 -5
  21. data/bundler/lib/bundler/cli/doctor.rb +10 -12
  22. data/bundler/lib/bundler/cli/exec.rb +2 -1
  23. data/bundler/lib/bundler/cli/fund.rb +1 -1
  24. data/bundler/lib/bundler/cli/gem.rb +77 -53
  25. data/bundler/lib/bundler/cli/info.rb +4 -15
  26. data/bundler/lib/bundler/cli/init.rb +6 -2
  27. data/bundler/lib/bundler/cli/inject.rb +1 -1
  28. data/bundler/lib/bundler/cli/install.rb +27 -15
  29. data/bundler/lib/bundler/cli/issue.rb +1 -1
  30. data/bundler/lib/bundler/cli/lock.rb +54 -28
  31. data/bundler/lib/bundler/cli/open.rb +9 -9
  32. data/bundler/lib/bundler/cli/outdated.rb +34 -29
  33. data/bundler/lib/bundler/cli/platform.rb +7 -5
  34. data/bundler/lib/bundler/cli/plugin.rb +9 -15
  35. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  36. data/bundler/lib/bundler/cli/show.rb +4 -4
  37. data/bundler/lib/bundler/cli/update.rb +6 -5
  38. data/bundler/lib/bundler/cli/viz.rb +1 -1
  39. data/bundler/lib/bundler/cli.rb +258 -307
  40. data/bundler/lib/bundler/compact_index_client/cache.rb +55 -60
  41. data/bundler/lib/bundler/compact_index_client/cache_file.rb +148 -0
  42. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  43. data/bundler/lib/bundler/compact_index_client/parser.rb +84 -0
  44. data/bundler/lib/bundler/compact_index_client/updater.rb +71 -83
  45. data/bundler/lib/bundler/compact_index_client.rb +58 -80
  46. data/bundler/lib/bundler/constants.rb +9 -2
  47. data/bundler/lib/bundler/current_ruby.rb +11 -16
  48. data/bundler/lib/bundler/definition.rb +547 -228
  49. data/bundler/lib/bundler/dependency.rb +30 -87
  50. data/bundler/lib/bundler/digest.rb +3 -3
  51. data/bundler/lib/bundler/dsl.rb +115 -65
  52. data/bundler/lib/bundler/endpoint_specification.rb +27 -14
  53. data/bundler/lib/bundler/env.rb +5 -7
  54. data/bundler/lib/bundler/environment_preserver.rb +8 -25
  55. data/bundler/lib/bundler/errors.rb +85 -11
  56. data/bundler/lib/bundler/feature_flag.rb +1 -2
  57. data/bundler/lib/bundler/fetcher/base.rb +5 -3
  58. data/bundler/lib/bundler/fetcher/compact_index.rb +28 -43
  59. data/bundler/lib/bundler/fetcher/dependency.rb +3 -7
  60. data/bundler/lib/bundler/fetcher/downloader.rb +17 -16
  61. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  62. data/bundler/lib/bundler/fetcher/index.rb +2 -3
  63. data/bundler/lib/bundler/fetcher.rb +91 -74
  64. data/bundler/lib/bundler/force_platform.rb +16 -0
  65. data/bundler/lib/bundler/friendly_errors.rb +6 -9
  66. data/bundler/lib/bundler/gem_helper.rb +5 -6
  67. data/bundler/lib/bundler/gem_helpers.rb +45 -7
  68. data/bundler/lib/bundler/gem_version_promoter.rb +68 -109
  69. data/bundler/lib/bundler/graph.rb +9 -9
  70. data/bundler/lib/bundler/index.rb +69 -73
  71. data/bundler/lib/bundler/injector.rb +12 -13
  72. data/bundler/lib/bundler/inline.rb +40 -17
  73. data/bundler/lib/bundler/installer/gem_installer.rb +13 -12
  74. data/bundler/lib/bundler/installer/parallel_installer.rb +19 -66
  75. data/bundler/lib/bundler/installer/standalone.rb +29 -15
  76. data/bundler/lib/bundler/installer.rb +27 -77
  77. data/bundler/lib/bundler/lazy_specification.rb +134 -71
  78. data/bundler/lib/bundler/lockfile_generator.rb +13 -4
  79. data/bundler/lib/bundler/lockfile_parser.rb +134 -61
  80. data/bundler/lib/bundler/man/bundle-add.1 +46 -48
  81. data/bundler/lib/bundler/man/bundle-add.1.ronn +54 -22
  82. data/bundler/lib/bundler/man/bundle-binstubs.1 +10 -19
  83. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +6 -3
  84. data/bundler/lib/bundler/man/bundle-cache.1 +38 -25
  85. data/bundler/lib/bundler/man/bundle-cache.1.ronn +40 -4
  86. data/bundler/lib/bundler/man/bundle-check.1 +7 -14
  87. data/bundler/lib/bundler/man/bundle-check.1.ronn +7 -2
  88. data/bundler/lib/bundler/man/bundle-clean.1 +4 -11
  89. data/bundler/lib/bundler/man/bundle-clean.1.ronn +1 -1
  90. data/bundler/lib/bundler/man/bundle-config.1 +41 -220
  91. data/bundler/lib/bundler/man/bundle-config.1.ronn +27 -22
  92. data/bundler/lib/bundler/man/bundle-console.1 +33 -0
  93. data/bundler/lib/bundler/man/bundle-console.1.ronn +39 -0
  94. data/bundler/lib/bundler/man/bundle-doctor.1 +5 -19
  95. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +1 -1
  96. data/bundler/lib/bundler/man/bundle-env.1 +9 -0
  97. data/bundler/lib/bundler/man/bundle-env.1.ronn +10 -0
  98. data/bundler/lib/bundler/man/bundle-exec.1 +20 -78
  99. data/bundler/lib/bundler/man/bundle-exec.1.ronn +12 -10
  100. data/bundler/lib/bundler/man/bundle-fund.1 +22 -0
  101. data/bundler/lib/bundler/man/bundle-fund.1.ronn +25 -0
  102. data/bundler/lib/bundler/man/bundle-gem.1 +53 -81
  103. data/bundler/lib/bundler/man/bundle-gem.1.ronn +41 -9
  104. data/bundler/lib/bundler/man/bundle-help.1 +9 -0
  105. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  106. data/bundler/lib/bundler/man/bundle-info.1 +8 -11
  107. data/bundler/lib/bundler/man/bundle-info.1.ronn +9 -5
  108. data/bundler/lib/bundler/man/bundle-init.1 +7 -12
  109. data/bundler/lib/bundler/man/bundle-init.1.ronn +4 -1
  110. data/bundler/lib/bundler/man/bundle-inject.1 +17 -19
  111. data/bundler/lib/bundler/man/bundle-inject.1.ronn +12 -2
  112. data/bundler/lib/bundler/man/bundle-install.1 +42 -162
  113. data/bundler/lib/bundler/man/bundle-install.1.ronn +31 -49
  114. data/bundler/lib/bundler/man/bundle-issue.1 +45 -0
  115. data/bundler/lib/bundler/man/bundle-issue.1.ronn +37 -0
  116. data/bundler/lib/bundler/man/bundle-licenses.1 +9 -0
  117. data/bundler/lib/bundler/man/bundle-licenses.1.ronn +10 -0
  118. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  119. data/bundler/lib/bundler/man/bundle-list.1.ronn +4 -1
  120. data/bundler/lib/bundler/man/bundle-lock.1 +25 -34
  121. data/bundler/lib/bundler/man/bundle-lock.1.ronn +25 -4
  122. data/bundler/lib/bundler/man/bundle-open.1 +18 -18
  123. data/bundler/lib/bundler/man/bundle-open.1.ronn +10 -1
  124. data/bundler/lib/bundler/man/bundle-outdated.1 +22 -67
  125. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +20 -12
  126. data/bundler/lib/bundler/man/bundle-platform.1 +16 -28
  127. data/bundler/lib/bundler/man/bundle-platform.1.ronn +14 -7
  128. data/bundler/lib/bundler/man/bundle-plugin.1 +58 -0
  129. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +63 -0
  130. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  131. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +1 -1
  132. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  133. data/bundler/lib/bundler/man/bundle-remove.1.ronn +1 -1
  134. data/bundler/lib/bundler/man/bundle-show.1 +7 -11
  135. data/bundler/lib/bundler/man/bundle-show.1.ronn +4 -0
  136. data/bundler/lib/bundler/man/bundle-update.1 +30 -143
  137. data/bundler/lib/bundler/man/bundle-update.1.ronn +14 -6
  138. data/bundler/lib/bundler/man/bundle-version.1 +22 -0
  139. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  140. data/bundler/lib/bundler/man/bundle-viz.1 +9 -18
  141. data/bundler/lib/bundler/man/bundle-viz.1.ronn +9 -3
  142. data/bundler/lib/bundler/man/bundle.1 +17 -51
  143. data/bundler/lib/bundler/man/bundle.1.ronn +12 -7
  144. data/bundler/lib/bundler/man/gemfile.5 +77 -341
  145. data/bundler/lib/bundler/man/gemfile.5.ronn +73 -54
  146. data/bundler/lib/bundler/man/index.txt +8 -0
  147. data/bundler/lib/bundler/match_metadata.rb +17 -0
  148. data/bundler/lib/bundler/match_platform.rb +1 -1
  149. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  150. data/bundler/lib/bundler/materialization.rb +59 -0
  151. data/bundler/lib/bundler/mirror.rb +8 -10
  152. data/bundler/lib/bundler/plugin/api/source.rb +7 -5
  153. data/bundler/lib/bundler/plugin/events.rb +24 -0
  154. data/bundler/lib/bundler/plugin/index.rb +13 -5
  155. data/bundler/lib/bundler/plugin/installer/path.rb +18 -0
  156. data/bundler/lib/bundler/plugin/installer/rubygems.rb +0 -4
  157. data/bundler/lib/bundler/plugin/installer.rb +42 -19
  158. data/bundler/lib/bundler/plugin/source_list.rb +4 -4
  159. data/bundler/lib/bundler/plugin.rb +35 -7
  160. data/bundler/lib/bundler/process_lock.rb +10 -14
  161. data/bundler/lib/bundler/remote_specification.rb +17 -13
  162. data/bundler/lib/bundler/resolver/base.rb +117 -0
  163. data/bundler/lib/bundler/resolver/candidate.rb +82 -0
  164. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  165. data/bundler/lib/bundler/resolver/package.rb +90 -0
  166. data/bundler/lib/bundler/resolver/root.rb +25 -0
  167. data/bundler/lib/bundler/resolver/spec_group.rb +54 -67
  168. data/bundler/lib/bundler/resolver.rb +432 -329
  169. data/bundler/lib/bundler/retry.rb +2 -2
  170. data/bundler/lib/bundler/ruby_dsl.rb +42 -7
  171. data/bundler/lib/bundler/ruby_version.rb +23 -10
  172. data/bundler/lib/bundler/rubygems_ext.rb +286 -81
  173. data/bundler/lib/bundler/rubygems_gem_installer.rb +77 -68
  174. data/bundler/lib/bundler/rubygems_integration.rb +57 -155
  175. data/bundler/lib/bundler/runtime.rb +28 -17
  176. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  177. data/bundler/lib/bundler/self_manager.rb +50 -12
  178. data/bundler/lib/bundler/settings.rb +144 -58
  179. data/bundler/lib/bundler/setup.rb +13 -1
  180. data/bundler/lib/bundler/shared_helpers.rb +87 -36
  181. data/bundler/lib/bundler/source/git/git_proxy.rb +278 -80
  182. data/bundler/lib/bundler/source/git.rb +161 -68
  183. data/bundler/lib/bundler/source/metadata.rb +16 -16
  184. data/bundler/lib/bundler/source/path/installer.rb +1 -22
  185. data/bundler/lib/bundler/source/path.rb +16 -26
  186. data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
  187. data/bundler/lib/bundler/source/rubygems.rb +94 -154
  188. data/bundler/lib/bundler/source.rb +3 -1
  189. data/bundler/lib/bundler/source_list.rb +34 -4
  190. data/bundler/lib/bundler/spec_set.rb +195 -65
  191. data/bundler/lib/bundler/stub_specification.rb +34 -4
  192. data/bundler/lib/bundler/templates/Executable +1 -1
  193. data/bundler/lib/bundler/templates/Executable.bundler +6 -11
  194. data/bundler/lib/bundler/templates/Executable.standalone +2 -0
  195. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
  196. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  197. data/bundler/lib/bundler/templates/newgem/README.md.tt +11 -5
  198. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +19 -8
  199. data/bundler/lib/bundler/templates/newgem/bin/console.tt +0 -4
  200. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  201. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  202. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  203. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  204. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
  205. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  206. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -8
  207. data/bundler/lib/bundler/templates/newgem/gitignore.tt +3 -0
  208. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  209. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -4
  210. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  211. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  212. data/bundler/lib/bundler/ui/rg_proxy.rb +1 -1
  213. data/bundler/lib/bundler/ui/shell.rb +60 -15
  214. data/bundler/lib/bundler/ui/silent.rb +33 -6
  215. data/bundler/lib/bundler/uri_credentials_filter.rb +3 -3
  216. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  217. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  218. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  219. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  220. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +56 -7
  221. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -418
  222. data/bundler/lib/bundler/vendor/net-http-persistent/.document +1 -0
  223. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  224. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
  225. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
  226. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  227. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +102 -64
  228. data/bundler/lib/bundler/vendor/pub_grub/.document +1 -0
  229. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  230. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  231. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  232. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  233. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  234. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  235. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  236. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  237. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  238. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
  239. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  240. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  241. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  242. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  243. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  244. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  245. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  246. data/bundler/lib/bundler/vendor/securerandom/.document +1 -0
  247. data/bundler/lib/bundler/vendor/securerandom/COPYING +56 -0
  248. data/bundler/lib/bundler/vendor/securerandom/lib/securerandom.rb +102 -0
  249. data/bundler/lib/bundler/vendor/thor/.document +1 -0
  250. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  251. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  252. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  253. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +11 -15
  254. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  255. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  256. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  257. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  258. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  259. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  260. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +12 -1
  261. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  262. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  263. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +17 -1
  264. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  265. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +28 -9
  266. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +46 -7
  267. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  268. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  269. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +35 -159
  270. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
  271. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  272. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -46
  273. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +118 -0
  274. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  275. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  276. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  277. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  278. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  279. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +166 -8
  280. data/bundler/lib/bundler/vendor/tsort/.document +1 -0
  281. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  282. data/bundler/lib/bundler/vendor/uri/.document +1 -0
  283. data/bundler/lib/bundler/vendor/uri/COPYING +56 -0
  284. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +343 -148
  285. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +10 -4
  286. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +3 -2
  287. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +44 -33
  288. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  289. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  290. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  291. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  292. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  293. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +25 -12
  294. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +130 -38
  295. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  296. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  297. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  298. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +12 -11
  299. data/bundler/lib/bundler/vendored_net_http.rb +23 -0
  300. data/bundler/lib/bundler/vendored_persistent.rb +0 -36
  301. data/bundler/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  302. data/bundler/lib/bundler/vendored_securerandom.rb +12 -0
  303. data/bundler/lib/bundler/vendored_timeout.rb +12 -0
  304. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  305. data/bundler/lib/bundler/version.rb +5 -1
  306. data/bundler/lib/bundler/vlad.rb +1 -1
  307. data/bundler/lib/bundler/worker.rb +5 -7
  308. data/bundler/lib/bundler/yaml_serializer.rb +22 -13
  309. data/bundler/lib/bundler.rb +155 -148
  310. data/{bundler → doc/bundler}/UPGRADING.md +11 -4
  311. data/{CONTRIBUTING.md → doc/rubygems/CONTRIBUTING.md} +40 -17
  312. data/doc/rubygems/POLICIES.md +204 -0
  313. data/{test/rubygems/fake_certlib/openssl.rb → exe/gem} +5 -1
  314. data/{bin → exe}/update_rubygems +12 -10
  315. data/lib/rubygems/available_set.rb +8 -7
  316. data/lib/rubygems/basic_specification.rb +90 -52
  317. data/lib/rubygems/bundler_version_finder.rb +6 -6
  318. data/lib/rubygems/ci_detector.rb +75 -0
  319. data/lib/rubygems/command.rb +68 -64
  320. data/lib/rubygems/command_manager.rb +39 -24
  321. data/lib/rubygems/commands/build_command.rb +14 -19
  322. data/lib/rubygems/commands/cert_command.rb +39 -39
  323. data/lib/rubygems/commands/check_command.rb +30 -25
  324. data/lib/rubygems/commands/cleanup_command.rb +32 -43
  325. data/lib/rubygems/commands/contents_command.rb +33 -25
  326. data/lib/rubygems/commands/dependency_command.rb +22 -23
  327. data/lib/rubygems/commands/environment_command.rb +8 -9
  328. data/lib/rubygems/commands/exec_command.rb +247 -0
  329. data/lib/rubygems/commands/fetch_command.rb +25 -10
  330. data/lib/rubygems/commands/generate_index_command.rb +40 -74
  331. data/lib/rubygems/commands/help_command.rb +15 -14
  332. data/lib/rubygems/commands/info_command.rb +5 -5
  333. data/lib/rubygems/commands/install_command.rb +31 -38
  334. data/lib/rubygems/commands/list_command.rb +6 -5
  335. data/lib/rubygems/commands/lock_command.rb +6 -5
  336. data/lib/rubygems/commands/mirror_command.rb +4 -3
  337. data/lib/rubygems/commands/open_command.rb +11 -12
  338. data/lib/rubygems/commands/outdated_command.rb +6 -5
  339. data/lib/rubygems/commands/owner_command.rb +23 -22
  340. data/lib/rubygems/commands/pristine_command.rb +83 -62
  341. data/lib/rubygems/commands/push_command.rb +38 -13
  342. data/lib/rubygems/commands/query_command.rb +11 -11
  343. data/lib/rubygems/commands/rdoc_command.rb +23 -28
  344. data/lib/rubygems/commands/rebuild_command.rb +262 -0
  345. data/lib/rubygems/commands/search_command.rb +6 -5
  346. data/lib/rubygems/commands/server_command.rb +4 -3
  347. data/lib/rubygems/commands/setup_command.rb +137 -154
  348. data/lib/rubygems/commands/signin_command.rb +10 -9
  349. data/lib/rubygems/commands/signout_command.rb +8 -7
  350. data/lib/rubygems/commands/sources_command.rb +34 -33
  351. data/lib/rubygems/commands/specification_command.rb +25 -20
  352. data/lib/rubygems/commands/stale_command.rb +5 -4
  353. data/lib/rubygems/commands/uninstall_command.rb +66 -59
  354. data/lib/rubygems/commands/unpack_command.rb +23 -30
  355. data/lib/rubygems/commands/update_command.rb +62 -94
  356. data/lib/rubygems/commands/which_command.rb +9 -8
  357. data/lib/rubygems/commands/yank_command.rb +14 -13
  358. data/lib/rubygems/compatibility.rb +5 -6
  359. data/lib/rubygems/config_file.rb +160 -50
  360. data/lib/rubygems/core_ext/kernel_gem.rb +3 -10
  361. data/lib/rubygems/core_ext/kernel_require.rb +88 -114
  362. data/lib/rubygems/core_ext/kernel_warn.rb +30 -39
  363. data/lib/rubygems/core_ext/tcpsocket_init.rb +4 -2
  364. data/lib/rubygems/defaults.rb +53 -22
  365. data/lib/rubygems/dependency.rb +34 -36
  366. data/lib/rubygems/dependency_installer.rb +52 -56
  367. data/lib/rubygems/dependency_list.rb +8 -7
  368. data/lib/rubygems/deprecate.rb +80 -75
  369. data/lib/rubygems/doctor.rb +23 -22
  370. data/lib/rubygems/errors.rb +6 -8
  371. data/lib/rubygems/exceptions.rb +20 -18
  372. data/lib/rubygems/ext/build_error.rb +2 -1
  373. data/lib/rubygems/ext/builder.rb +56 -32
  374. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +9 -5
  375. data/lib/rubygems/ext/cargo_builder.rb +158 -131
  376. data/lib/rubygems/ext/cmake_builder.rb +9 -4
  377. data/lib/rubygems/ext/configure_builder.rb +9 -3
  378. data/lib/rubygems/ext/ext_conf_builder.rb +19 -15
  379. data/lib/rubygems/ext/rake_builder.rb +14 -7
  380. data/lib/rubygems/ext.rb +8 -7
  381. data/lib/rubygems/gem_runner.rb +23 -9
  382. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  383. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  384. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +80 -0
  385. data/lib/rubygems/gemcutter_utilities.rb +141 -63
  386. data/lib/rubygems/gemspec_helpers.rb +19 -0
  387. data/lib/rubygems/install_default_message.rb +3 -2
  388. data/lib/rubygems/install_message.rb +3 -2
  389. data/lib/rubygems/install_update_options.rb +72 -67
  390. data/lib/rubygems/installer.rb +148 -130
  391. data/lib/rubygems/installer_uninstaller_utils.rb +2 -4
  392. data/lib/rubygems/local_remote_options.rb +24 -28
  393. data/lib/rubygems/name_tuple.rb +10 -11
  394. data/lib/rubygems/package/digest_io.rb +2 -1
  395. data/lib/rubygems/package/file_source.rb +3 -2
  396. data/lib/rubygems/package/io_source.rb +1 -0
  397. data/lib/rubygems/package/old.rb +11 -10
  398. data/lib/rubygems/package/source.rb +1 -0
  399. data/lib/rubygems/package/tar_header.rb +125 -91
  400. data/lib/rubygems/package/tar_reader/entry.rb +106 -29
  401. data/lib/rubygems/package/tar_reader.rb +16 -39
  402. data/lib/rubygems/package/tar_writer.rb +29 -26
  403. data/lib/rubygems/package.rb +122 -84
  404. data/lib/rubygems/package_task.rb +7 -6
  405. data/lib/rubygems/path_support.rb +11 -11
  406. data/lib/rubygems/platform.rb +119 -70
  407. data/lib/rubygems/psych_tree.rb +6 -1
  408. data/lib/rubygems/query_utils.rb +46 -48
  409. data/lib/rubygems/rdoc.rb +13 -3
  410. data/lib/rubygems/remote_fetcher.rb +47 -39
  411. data/lib/rubygems/request/connection_pools.rb +6 -6
  412. data/lib/rubygems/request/http_pool.rb +2 -1
  413. data/lib/rubygems/request/https_pool.rb +1 -0
  414. data/lib/rubygems/request.rb +48 -44
  415. data/lib/rubygems/request_set/gem_dependency_api.rb +141 -144
  416. data/lib/rubygems/request_set/lockfile/parser.rb +31 -30
  417. data/lib/rubygems/request_set/lockfile/tokenizer.rb +24 -14
  418. data/lib/rubygems/request_set/lockfile.rb +11 -15
  419. data/lib/rubygems/request_set.rb +25 -23
  420. data/lib/rubygems/requirement.rb +30 -27
  421. data/lib/rubygems/resolver/activation_request.rb +7 -10
  422. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  423. data/lib/rubygems/resolver/api_set.rb +20 -13
  424. data/lib/rubygems/resolver/api_specification.rb +8 -7
  425. data/lib/rubygems/resolver/best_set.rb +5 -32
  426. data/lib/rubygems/resolver/composed_set.rb +4 -3
  427. data/lib/rubygems/resolver/conflict.rb +14 -21
  428. data/lib/rubygems/resolver/current_set.rb +1 -0
  429. data/lib/rubygems/resolver/dependency_request.rb +3 -2
  430. data/lib/rubygems/resolver/git_set.rb +2 -2
  431. data/lib/rubygems/resolver/git_specification.rb +7 -6
  432. data/lib/rubygems/resolver/index_set.rb +10 -9
  433. data/lib/rubygems/resolver/index_specification.rb +8 -6
  434. data/lib/rubygems/resolver/installed_specification.rb +6 -5
  435. data/lib/rubygems/resolver/installer_set.rb +19 -22
  436. data/lib/rubygems/resolver/local_specification.rb +4 -3
  437. data/lib/rubygems/resolver/lock_set.rb +6 -5
  438. data/lib/rubygems/resolver/lock_specification.rb +5 -4
  439. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  440. data/lib/rubygems/resolver/set.rb +1 -0
  441. data/lib/rubygems/resolver/source_set.rb +2 -0
  442. data/lib/rubygems/resolver/spec_specification.rb +8 -0
  443. data/lib/rubygems/resolver/specification.rb +2 -1
  444. data/lib/rubygems/resolver/stats.rb +2 -1
  445. data/lib/rubygems/resolver/vendor_set.rb +2 -1
  446. data/lib/rubygems/resolver/vendor_specification.rb +4 -3
  447. data/lib/rubygems/resolver.rb +51 -57
  448. data/lib/rubygems/s3_uri_signer.rb +18 -16
  449. data/lib/rubygems/safe_marshal/elements.rb +146 -0
  450. data/lib/rubygems/safe_marshal/reader.rb +325 -0
  451. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  452. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +428 -0
  453. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  454. data/lib/rubygems/safe_marshal.rb +74 -0
  455. data/lib/rubygems/safe_yaml.rb +14 -26
  456. data/lib/rubygems/security/policies.rb +48 -49
  457. data/lib/rubygems/security/policy.rb +25 -28
  458. data/lib/rubygems/security/signer.rb +16 -7
  459. data/lib/rubygems/security/trust_dir.rb +12 -13
  460. data/lib/rubygems/security.rb +40 -66
  461. data/lib/rubygems/security_option.rb +7 -6
  462. data/lib/rubygems/shellwords.rb +3 -0
  463. data/lib/rubygems/source/git.rb +34 -31
  464. data/lib/rubygems/source/installed.rb +4 -3
  465. data/lib/rubygems/source/local.rb +49 -49
  466. data/lib/rubygems/source/lock.rb +2 -3
  467. data/lib/rubygems/source/specific_file.rb +6 -4
  468. data/lib/rubygems/source/vendor.rb +1 -2
  469. data/lib/rubygems/source.rb +37 -31
  470. data/lib/rubygems/source_list.rb +8 -8
  471. data/lib/rubygems/spec_fetcher.rb +95 -66
  472. data/lib/rubygems/specification.rb +342 -404
  473. data/lib/rubygems/specification_policy.rb +147 -75
  474. data/lib/rubygems/specification_record.rb +212 -0
  475. data/lib/rubygems/stub_specification.rb +56 -30
  476. data/lib/rubygems/target_rbconfig.rb +50 -0
  477. data/lib/rubygems/text.rb +3 -4
  478. data/lib/rubygems/uninstaller.rb +67 -48
  479. data/lib/rubygems/update_suggestion.rb +56 -0
  480. data/lib/rubygems/uri.rb +10 -10
  481. data/lib/rubygems/uri_formatter.rb +2 -2
  482. data/lib/rubygems/user_interaction.rb +50 -40
  483. data/lib/rubygems/util/licenses.rb +310 -39
  484. data/lib/rubygems/util/list.rb +4 -1
  485. data/lib/rubygems/util.rb +19 -20
  486. data/lib/rubygems/validator.rb +15 -14
  487. data/lib/rubygems/vendor/molinillo/.document +1 -0
  488. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  489. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  490. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  491. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  492. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  493. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  494. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  495. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  496. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  497. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  498. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  499. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -3
  500. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  501. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  502. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  503. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/modules/ui.rb +1 -1
  504. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/resolution.rb +4 -4
  505. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/resolver.rb +1 -1
  506. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo/state.rb +1 -1
  507. data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/lib/molinillo.rb +2 -2
  508. data/lib/rubygems/vendor/net-http/.document +1 -0
  509. data/lib/rubygems/vendor/net-http/COPYING +56 -0
  510. data/lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb +34 -0
  511. data/lib/rubygems/vendor/net-http/lib/net/http/generic_request.rb +414 -0
  512. data/lib/rubygems/vendor/net-http/lib/net/http/header.rb +981 -0
  513. data/lib/rubygems/vendor/net-http/lib/net/http/proxy_delta.rb +17 -0
  514. data/lib/rubygems/vendor/net-http/lib/net/http/request.rb +88 -0
  515. data/lib/rubygems/vendor/net-http/lib/net/http/requests.rb +430 -0
  516. data/lib/rubygems/vendor/net-http/lib/net/http/response.rb +738 -0
  517. data/lib/rubygems/vendor/net-http/lib/net/http/responses.rb +1174 -0
  518. data/lib/rubygems/vendor/net-http/lib/net/http/status.rb +84 -0
  519. data/lib/rubygems/vendor/net-http/lib/net/http.rb +2580 -0
  520. data/lib/rubygems/vendor/net-http/lib/net/https.rb +23 -0
  521. data/lib/rubygems/vendor/net-protocol/.document +1 -0
  522. data/lib/rubygems/vendor/net-protocol/lib/net/protocol.rb +544 -0
  523. data/lib/rubygems/vendor/optparse/.document +1 -0
  524. data/lib/rubygems/vendor/optparse/COPYING +56 -0
  525. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +16 -0
  526. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +8 -3
  527. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  528. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +9 -0
  529. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +206 -83
  530. data/lib/rubygems/vendor/resolv/.document +1 -0
  531. data/lib/rubygems/vendor/resolv/COPYING +56 -0
  532. data/lib/rubygems/vendor/resolv/lib/resolv.rb +3455 -0
  533. data/lib/rubygems/vendor/securerandom/.document +1 -0
  534. data/lib/rubygems/vendor/securerandom/COPYING +56 -0
  535. data/lib/rubygems/vendor/securerandom/lib/securerandom.rb +102 -0
  536. data/lib/rubygems/vendor/timeout/.document +1 -0
  537. data/lib/rubygems/vendor/timeout/COPYING +56 -0
  538. data/lib/rubygems/vendor/timeout/lib/timeout.rb +198 -0
  539. data/lib/rubygems/vendor/tsort/.document +1 -0
  540. data/lib/rubygems/vendor/tsort/lib/tsort.rb +455 -0
  541. data/lib/rubygems/vendor/uri/.document +1 -0
  542. data/lib/rubygems/vendor/uri/COPYING +56 -0
  543. data/lib/rubygems/vendor/uri/lib/uri/common.rb +876 -0
  544. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  545. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  546. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1578 -0
  547. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  548. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  549. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  550. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  551. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  552. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  553. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +206 -0
  554. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  555. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  556. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  557. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  558. data/{bundler/lib/bundler → lib/rubygems}/vendored_molinillo.rb +0 -1
  559. data/lib/rubygems/vendored_net_http.rb +5 -0
  560. data/lib/rubygems/vendored_optparse.rb +3 -0
  561. data/lib/rubygems/vendored_securerandom.rb +3 -0
  562. data/lib/rubygems/vendored_timeout.rb +5 -0
  563. data/lib/rubygems/vendored_tsort.rb +3 -0
  564. data/lib/rubygems/version.rb +57 -45
  565. data/lib/rubygems/version_option.rb +6 -8
  566. data/lib/rubygems/yaml_serializer.rb +98 -0
  567. data/lib/rubygems.rb +191 -133
  568. data/rubygems-update.gemspec +16 -9
  569. data/setup.rb +12 -9
  570. metadata +233 -307
  571. data/POLICIES.md +0 -100
  572. data/bin/gem +0 -13
  573. data/bundler/lib/bundler/dep_proxy.rb +0 -55
  574. data/bundler/lib/bundler/templates/gems.rb +0 -5
  575. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
  576. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  577. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  578. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  579. data/bundler/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  580. data/bundler/lib/bundler/version_ranges.rb +0 -122
  581. data/lib/rubygems/indexer.rb +0 -427
  582. data/lib/rubygems/mock_gem_ui.rb +0 -85
  583. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  584. data/lib/rubygems/optparse.rb +0 -3
  585. data/lib/rubygems/resolver/molinillo/LICENSE +0 -9
  586. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  587. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  588. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  589. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  590. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  591. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  592. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  593. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  594. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  595. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  596. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  597. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  598. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +0 -143
  599. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  600. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  601. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +0 -67
  602. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +0 -839
  603. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +0 -46
  604. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +0 -58
  605. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +0 -11
  606. data/lib/rubygems/resolver/molinillo.rb +0 -2
  607. data/lib/rubygems/tsort/LICENSE.txt +0 -22
  608. data/lib/rubygems/tsort/lib/tsort.rb +0 -454
  609. data/lib/rubygems/tsort.rb +0 -3
  610. data/test/rubygems/alternate_cert.pem +0 -19
  611. data/test/rubygems/alternate_cert_32.pem +0 -19
  612. data/test/rubygems/alternate_key.pem +0 -27
  613. data/test/rubygems/bad_rake.rb +0 -2
  614. data/test/rubygems/ca_cert.pem +0 -77
  615. data/test/rubygems/child_cert.pem +0 -20
  616. data/test/rubygems/child_cert_32.pem +0 -20
  617. data/test/rubygems/child_key.pem +0 -27
  618. data/test/rubygems/client.pem +0 -107
  619. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  620. data/test/rubygems/data/gem-private_key.pem +0 -27
  621. data/test/rubygems/data/gem-public_cert.pem +0 -20
  622. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  623. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  624. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  625. data/test/rubygems/encrypted_private_key.pem +0 -30
  626. data/test/rubygems/expired_cert.pem +0 -19
  627. data/test/rubygems/foo/discover.rb +0 -1
  628. data/test/rubygems/future_cert.pem +0 -19
  629. data/test/rubygems/future_cert_32.pem +0 -19
  630. data/test/rubygems/good_rake.rb +0 -2
  631. data/test/rubygems/grandchild_cert.pem +0 -20
  632. data/test/rubygems/grandchild_cert_32.pem +0 -20
  633. data/test/rubygems/grandchild_key.pem +0 -27
  634. data/test/rubygems/helper.rb +0 -1622
  635. data/test/rubygems/installer_test_case.rb +0 -247
  636. data/test/rubygems/invalid_client.pem +0 -49
  637. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  638. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  639. data/test/rubygems/invalid_key.pem +0 -27
  640. data/test/rubygems/invalid_signer_cert.pem +0 -19
  641. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  642. data/test/rubygems/invalidchild_cert.pem +0 -20
  643. data/test/rubygems/invalidchild_cert_32.pem +0 -20
  644. data/test/rubygems/invalidchild_key.pem +0 -27
  645. data/test/rubygems/package/tar_test_case.rb +0 -139
  646. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  647. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  648. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
  649. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
  650. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
  651. data/test/rubygems/private3072_key.pem +0 -40
  652. data/test/rubygems/private_ec_key.pem +0 -9
  653. data/test/rubygems/private_key.pem +0 -27
  654. data/test/rubygems/public3072_cert.pem +0 -25
  655. data/test/rubygems/public_cert.pem +0 -20
  656. data/test/rubygems/public_cert_32.pem +0 -19
  657. data/test/rubygems/public_key.pem +0 -9
  658. data/test/rubygems/rubygems/commands/crash_command.rb +0 -4
  659. data/test/rubygems/rubygems_plugin.rb +0 -23
  660. data/test/rubygems/sff/discover.rb +0 -1
  661. data/test/rubygems/simple_gem.rb +0 -67
  662. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -7
  663. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  664. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -12
  665. data/test/rubygems/ssl_cert.pem +0 -80
  666. data/test/rubygems/ssl_key.pem +0 -27
  667. data/test/rubygems/test_bundled_ca.rb +0 -60
  668. data/test/rubygems/test_config.rb +0 -27
  669. data/test/rubygems/test_deprecate.rb +0 -157
  670. data/test/rubygems/test_exit.rb +0 -11
  671. data/test/rubygems/test_gem.rb +0 -2112
  672. data/test/rubygems/test_gem_available_set.rb +0 -129
  673. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -125
  674. data/test/rubygems/test_gem_command.rb +0 -400
  675. data/test/rubygems/test_gem_command_manager.rb +0 -334
  676. data/test/rubygems/test_gem_commands_build_command.rb +0 -727
  677. data/test/rubygems/test_gem_commands_cert_command.rb +0 -867
  678. data/test/rubygems/test_gem_commands_check_command.rb +0 -67
  679. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -291
  680. data/test/rubygems/test_gem_commands_contents_command.rb +0 -270
  681. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -227
  682. data/test/rubygems/test_gem_commands_environment_command.rb +0 -167
  683. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -257
  684. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -80
  685. data/test/rubygems/test_gem_commands_help_command.rb +0 -93
  686. data/test/rubygems/test_gem_commands_info_command.rb +0 -43
  687. data/test/rubygems/test_gem_commands_install_command.rb +0 -1553
  688. data/test/rubygems/test_gem_commands_list_command.rb +0 -32
  689. data/test/rubygems/test_gem_commands_lock_command.rb +0 -66
  690. data/test/rubygems/test_gem_commands_mirror.rb +0 -19
  691. data/test/rubygems/test_gem_commands_open_command.rb +0 -97
  692. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -49
  693. data/test/rubygems/test_gem_commands_owner_command.rb +0 -326
  694. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -659
  695. data/test/rubygems/test_gem_commands_push_command.rb +0 -477
  696. data/test/rubygems/test_gem_commands_query_command.rb +0 -857
  697. data/test/rubygems/test_gem_commands_search_command.rb +0 -15
  698. data/test/rubygems/test_gem_commands_server_command.rb +0 -19
  699. data/test/rubygems/test_gem_commands_setup_command.rb +0 -447
  700. data/test/rubygems/test_gem_commands_signin_command.rb +0 -219
  701. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  702. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  703. data/test/rubygems/test_gem_commands_specification_command.rb +0 -276
  704. data/test/rubygems/test_gem_commands_stale_command.rb +0 -42
  705. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -504
  706. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -223
  707. data/test/rubygems/test_gem_commands_update_command.rb +0 -835
  708. data/test/rubygems/test_gem_commands_which_command.rb +0 -84
  709. data/test/rubygems/test_gem_commands_yank_command.rb +0 -180
  710. data/test/rubygems/test_gem_config_file.rb +0 -504
  711. data/test/rubygems/test_gem_dependency.rb +0 -395
  712. data/test/rubygems/test_gem_dependency_installer.rb +0 -1155
  713. data/test/rubygems/test_gem_dependency_list.rb +0 -264
  714. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -26
  715. data/test/rubygems/test_gem_doctor.rb +0 -194
  716. data/test/rubygems/test_gem_ext_builder.rb +0 -338
  717. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  718. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +0 -243
  719. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +0 -10
  720. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/build.rb +0 -21
  721. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  722. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs +0 -27
  723. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  724. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -243
  725. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  726. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/build.rb +0 -21
  727. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -8
  728. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -39
  729. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -178
  730. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -33
  731. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -75
  732. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -83
  733. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -79
  734. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -230
  735. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -112
  736. data/test/rubygems/test_gem_gem_runner.rb +0 -113
  737. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -272
  738. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -59
  739. data/test/rubygems/test_gem_indexer.rb +0 -361
  740. data/test/rubygems/test_gem_install_update_options.rb +0 -207
  741. data/test/rubygems/test_gem_installer.rb +0 -2394
  742. data/test/rubygems/test_gem_local_remote_options.rb +0 -132
  743. data/test/rubygems/test_gem_name_tuple.rb +0 -42
  744. data/test/rubygems/test_gem_package.rb +0 -1178
  745. data/test/rubygems/test_gem_package_old.rb +0 -90
  746. data/test/rubygems/test_gem_package_tar_header.rb +0 -225
  747. data/test/rubygems/test_gem_package_tar_reader.rb +0 -87
  748. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -152
  749. data/test/rubygems/test_gem_package_tar_writer.rb +0 -330
  750. data/test/rubygems/test_gem_package_task.rb +0 -117
  751. data/test/rubygems/test_gem_path_support.rb +0 -138
  752. data/test/rubygems/test_gem_platform.rb +0 -391
  753. data/test/rubygems/test_gem_rdoc.rb +0 -136
  754. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1226
  755. data/test/rubygems/test_gem_request.rb +0 -541
  756. data/test/rubygems/test_gem_request_connection_pools.rb +0 -150
  757. data/test/rubygems/test_gem_request_set.rb +0 -671
  758. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -847
  759. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -468
  760. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -543
  761. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
  762. data/test/rubygems/test_gem_requirement.rb +0 -498
  763. data/test/rubygems/test_gem_resolver.rb +0 -791
  764. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -42
  765. data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
  766. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -166
  767. data/test/rubygems/test_gem_resolver_best_set.rb +0 -158
  768. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -43
  769. data/test/rubygems/test_gem_resolver_conflict.rb +0 -81
  770. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -82
  771. data/test/rubygems/test_gem_resolver_git_set.rb +0 -187
  772. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -113
  773. data/test/rubygems/test_gem_resolver_index_set.rb +0 -87
  774. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -92
  775. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -46
  776. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -275
  777. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -43
  778. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -61
  779. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -97
  780. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -18
  781. data/test/rubygems/test_gem_resolver_specification.rb +0 -62
  782. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -81
  783. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -81
  784. data/test/rubygems/test_gem_security.rb +0 -340
  785. data/test/rubygems/test_gem_security_policy.rb +0 -535
  786. data/test/rubygems/test_gem_security_signer.rb +0 -217
  787. data/test/rubygems/test_gem_security_trust_dir.rb +0 -98
  788. data/test/rubygems/test_gem_silent_ui.rb +0 -116
  789. data/test/rubygems/test_gem_source.rb +0 -253
  790. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -36
  791. data/test/rubygems/test_gem_source_git.rb +0 -303
  792. data/test/rubygems/test_gem_source_installed.rb +0 -34
  793. data/test/rubygems/test_gem_source_list.rb +0 -118
  794. data/test/rubygems/test_gem_source_local.rb +0 -106
  795. data/test/rubygems/test_gem_source_lock.rb +0 -112
  796. data/test/rubygems/test_gem_source_specific_file.rb +0 -75
  797. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -49
  798. data/test/rubygems/test_gem_source_vendor.rb +0 -29
  799. data/test/rubygems/test_gem_spec_fetcher.rb +0 -337
  800. data/test/rubygems/test_gem_specification.rb +0 -3756
  801. data/test/rubygems/test_gem_stream_ui.rb +0 -224
  802. data/test/rubygems/test_gem_stub_specification.rb +0 -277
  803. data/test/rubygems/test_gem_text.rb +0 -102
  804. data/test/rubygems/test_gem_uninstaller.rb +0 -674
  805. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -30
  806. data/test/rubygems/test_gem_uri.rb +0 -39
  807. data/test/rubygems/test_gem_uri_formatter.rb +0 -26
  808. data/test/rubygems/test_gem_util.rb +0 -90
  809. data/test/rubygems/test_gem_validator.rb +0 -42
  810. data/test/rubygems/test_gem_version.rb +0 -295
  811. data/test/rubygems/test_gem_version_option.rb +0 -164
  812. data/test/rubygems/test_kernel.rb +0 -129
  813. data/test/rubygems/test_project_sanity.rb +0 -20
  814. data/test/rubygems/test_remote_fetch_error.rb +0 -19
  815. data/test/rubygems/test_require.rb +0 -719
  816. data/test/rubygems/test_rubygems.rb +0 -74
  817. data/test/rubygems/utilities.rb +0 -371
  818. data/test/rubygems/wrong_key_cert.pem +0 -19
  819. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  820. data/test/test_changelog_generator.rb +0 -17
  821. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/connection_pool}/.document +0 -0
  822. /data/{lib/rubygems/tsort → bundler/lib/bundler/vendor/fileutils}/.document +0 -0
  823. /data/{lib/rubygems/optparse → bundler/lib/bundler/vendor/fileutils}/COPYING +0 -0
  824. /data/{MAINTAINERS.txt → doc/MAINTAINERS.txt} +0 -0
  825. /data/{UPGRADING.md → doc/rubygems/UPGRADING.md} +0 -0
  826. /data/{bundler/lib/bundler → lib/rubygems}/vendor/molinillo/LICENSE +0 -0
  827. /data/{bundler/lib/bundler/vendor/fileutils → lib/rubygems/vendor/net-protocol}/LICENSE.txt +0 -0
  828. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  829. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  830. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  831. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  832. /data/{bundler/lib/bundler/vendor/uri → lib/rubygems/vendor/tsort}/LICENSE.txt +0 -0
@@ -1,1226 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'helper'
3
-
4
- require 'webrick'
5
- require 'webrick/https' if Gem::HAVE_OPENSSL
6
-
7
- unless Gem::HAVE_OPENSSL
8
- warn 'Skipping Gem::RemoteFetcher tests. openssl not found.'
9
- end
10
-
11
- require 'rubygems/remote_fetcher'
12
- require 'rubygems/package'
13
-
14
- # = Testing Proxy Settings
15
- #
16
- # These tests check the proper proxy server settings by running two
17
- # web servers. The web server at http://localhost:#{SERVER_PORT}
18
- # represents the normal gem server and returns a gemspec with a rake
19
- # version of 0.4.11. The web server at http://localhost:#{PROXY_PORT}
20
- # represents the proxy server and returns a different dataset where
21
- # rake has version 0.4.2. This allows us to detect which server is
22
- # returning the data.
23
- #
24
- # Note that the proxy server is not a *real* proxy server. But our
25
- # software doesn't really care, as long as we hit the proxy URL when a
26
- # proxy is configured.
27
-
28
- class TestGemRemoteFetcher < Gem::TestCase
29
- include Gem::DefaultUserInteraction
30
-
31
- SERVER_DATA = <<-EOY.freeze
32
- --- !ruby/object:Gem::Cache
33
- gems:
34
- rake-0.4.11: !ruby/object:Gem::Specification
35
- rubygems_version: "0.7"
36
- specification_version: 1
37
- name: rake
38
- version: !ruby/object:Gem::Version
39
- version: 0.4.11
40
- date: 2004-11-12
41
- summary: Ruby based make-like utility.
42
- require_paths:
43
- - lib
44
- author: Jim Weirich
45
- email: jim@weirichhouse.org
46
- homepage: http://rake.rubyforge.org
47
- description: Rake is a Make-like program implemented in Ruby. Tasks and dependencies are specified in standard Ruby syntax.
48
- autorequire:
49
- bindir: bin
50
- has_rdoc: true
51
- required_ruby_version: !ruby/object:Gem::Version::Requirement
52
- requirements:
53
- -
54
- - ">"
55
- - !ruby/object:Gem::Version
56
- version: 0.0.0
57
- version:
58
- platform: ruby
59
- files:
60
- - README
61
- test_files: []
62
- library_stubs:
63
- rdoc_options:
64
- extra_rdoc_files:
65
- executables:
66
- - rake
67
- extensions: []
68
- requirements: []
69
- dependencies: []
70
- EOY
71
-
72
- PROXY_DATA = SERVER_DATA.gsub(/0.4.11/, '0.4.2')
73
-
74
- # Generated via:
75
- # x = OpenSSL::PKey::DH.new(2048) # wait a while...
76
- # x.to_s => pem
77
- TEST_KEY_DH2048 = OpenSSL::PKey::DH.new <<-_END_OF_PEM_
78
- -----BEGIN DH PARAMETERS-----
79
- MIIBCAKCAQEA3Ze2EHSfYkZLUn557torAmjBgPsqzbodaRaGZtgK1gEU+9nNJaFV
80
- G1JKhmGUiEDyIW7idsBpe4sX/Wqjnp48Lr8IeI/SlEzLdoGpf05iRYXC8Cm9o8aM
81
- cfmVgoSEAo9YLBpzoji2jHkO7Q5IPt4zxbTdlmmGFLc/GO9q7LGHhC+rcMcNTGsM
82
- 49AnILNn49pq4Y72jSwdmvq4psHZwwFBbPwLdw6bLUDDCN90jfqvYt18muwUxDiN
83
- NP0fuvVAIB158VnQ0liHSwcl6+9vE1mL0Jo/qEXQxl0+UdKDjaGfTsn6HIrwTnmJ
84
- PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
85
- -----END DH PARAMETERS-----
86
- _END_OF_PEM_
87
-
88
- def setup
89
- @proxies = %w[https_proxy http_proxy HTTP_PROXY http_proxy_user HTTP_PROXY_USER http_proxy_pass HTTP_PROXY_PASS no_proxy NO_PROXY]
90
- @old_proxies = @proxies.map {|k| ENV[k] }
91
- @proxies.each {|k| ENV[k] = nil }
92
-
93
- super
94
- start_servers
95
- self.enable_yaml = true
96
- self.enable_zip = false
97
-
98
- base_server_uri = "http://localhost:#{normal_server_port}"
99
- @proxy_uri = "http://localhost:#{proxy_server_port}"
100
-
101
- @server_uri = base_server_uri + "/yaml"
102
- @server_z_uri = base_server_uri + "/yaml.Z"
103
-
104
- @cache_dir = File.join @gemhome, "cache"
105
-
106
- # TODO: why does the remote fetcher need it written to disk?
107
- @a1, @a1_gem = util_gem 'a', '1' do |s|
108
- s.executables << 'a_bin'
109
- end
110
-
111
- @a1.loaded_from = File.join(@gemhome, 'specifications', @a1.full_name)
112
-
113
- Gem::RemoteFetcher.fetcher = nil
114
- @stub_ui = Gem::MockGemUi.new
115
- @fetcher = Gem::RemoteFetcher.fetcher
116
- end
117
-
118
- def teardown
119
- @fetcher.close_all
120
- stop_servers
121
- super
122
- Gem.configuration[:http_proxy] = nil
123
- @proxies.each_with_index {|k, i| ENV[k] = @old_proxies[i] }
124
- end
125
-
126
- def test_self_fetcher
127
- fetcher = Gem::RemoteFetcher.fetcher
128
- refute_nil fetcher
129
- assert_kind_of Gem::RemoteFetcher, fetcher
130
- end
131
-
132
- def test_self_fetcher_with_proxy
133
- proxy_uri = 'http://proxy.example.com'
134
- Gem.configuration[:http_proxy] = proxy_uri
135
- Gem::RemoteFetcher.fetcher = nil
136
-
137
- fetcher = Gem::RemoteFetcher.fetcher
138
-
139
- refute_nil fetcher
140
- assert_kind_of Gem::RemoteFetcher, fetcher
141
- assert_equal proxy_uri, fetcher.instance_variable_get(:@proxy).to_s
142
- end
143
-
144
- def test_fetch_path_bad_uri
145
- fetcher = Gem::RemoteFetcher.new nil
146
- @fetcher = fetcher
147
-
148
- e = assert_raise ArgumentError do
149
- @fetcher.fetch_path("gems.example.com/yaml", nil, true)
150
- end
151
-
152
- assert_equal 'uri scheme is invalid: nil', e.message
153
- end
154
-
155
- def test_no_proxy
156
- use_ui @stub_ui do
157
- assert_data_from_server @fetcher.fetch_path(@server_uri)
158
- response = @fetcher.fetch_path(@server_uri, nil, true)
159
- assert_equal SERVER_DATA.size, response['content-length'].to_i
160
- end
161
- end
162
-
163
- def test_cache_update_path
164
- uri = URI 'http://example/file'
165
- path = File.join @tempdir, 'file'
166
-
167
- fetcher = util_fuck_with_fetcher 'hello'
168
-
169
- data = fetcher.cache_update_path uri, path
170
-
171
- assert_equal 'hello', data
172
-
173
- assert_equal 'hello', File.read(path)
174
- end
175
-
176
- def test_cache_update_path_with_utf8_internal_encoding
177
- with_internal_encoding('UTF-8') do
178
- uri = URI 'http://example/file'
179
- path = File.join @tempdir, 'file'
180
- data = String.new("\xC8").force_encoding(Encoding::BINARY)
181
-
182
- fetcher = util_fuck_with_fetcher data
183
-
184
- written_data = fetcher.cache_update_path uri, path
185
-
186
- assert_equal data, written_data
187
- assert_equal data, File.binread(path)
188
- end
189
- end
190
-
191
- def test_cache_update_path_no_update
192
- uri = URI 'http://example/file'
193
- path = File.join @tempdir, 'file'
194
-
195
- fetcher = util_fuck_with_fetcher 'hello'
196
-
197
- data = fetcher.cache_update_path uri, path, false
198
-
199
- assert_equal 'hello', data
200
-
201
- assert_path_not_exist path
202
- end
203
-
204
- def util_fuck_with_fetcher(data, blow = false)
205
- fetcher = Gem::RemoteFetcher.fetcher
206
- fetcher.instance_variable_set :@test_data, data
207
-
208
- unless blow
209
- def fetcher.fetch_path(arg, *rest)
210
- @test_arg = arg
211
- @test_data
212
- end
213
- else
214
- def fetcher.fetch_path(arg, *rest)
215
- # OMG I'm such an ass
216
- class << self; remove_method :fetch_path; end
217
- def self.fetch_path(arg, *rest)
218
- @test_arg = arg
219
- @test_data
220
- end
221
-
222
- raise Gem::RemoteFetcher::FetchError.new("haha!", '')
223
- end
224
- end
225
-
226
- fetcher
227
- end
228
-
229
- def test_download
230
- a1_data = nil
231
- File.open @a1_gem, 'rb' do |fp|
232
- a1_data = fp.read
233
- end
234
-
235
- fetcher = util_fuck_with_fetcher a1_data
236
-
237
- a1_cache_gem = @a1.cache_file
238
- assert_equal a1_cache_gem, fetcher.download(@a1, 'http://gems.example.com')
239
- assert_equal("http://gems.example.com/gems/a-1.gem",
240
- fetcher.instance_variable_get(:@test_arg).to_s)
241
- assert File.exist?(a1_cache_gem)
242
- end
243
-
244
- def test_download_with_auth
245
- a1_data = nil
246
- File.open @a1_gem, 'rb' do |fp|
247
- a1_data = fp.read
248
- end
249
-
250
- fetcher = util_fuck_with_fetcher a1_data
251
-
252
- a1_cache_gem = @a1.cache_file
253
- assert_equal a1_cache_gem, fetcher.download(@a1, 'http://user:password@gems.example.com')
254
- assert_equal("http://user:password@gems.example.com/gems/a-1.gem",
255
- fetcher.instance_variable_get(:@test_arg).to_s)
256
- assert File.exist?(a1_cache_gem)
257
- end
258
-
259
- def test_download_with_token
260
- a1_data = nil
261
- File.open @a1_gem, 'rb' do |fp|
262
- a1_data = fp.read
263
- end
264
-
265
- fetcher = util_fuck_with_fetcher a1_data
266
-
267
- a1_cache_gem = @a1.cache_file
268
- assert_equal a1_cache_gem, fetcher.download(@a1, 'http://token@gems.example.com')
269
- assert_equal("http://token@gems.example.com/gems/a-1.gem",
270
- fetcher.instance_variable_get(:@test_arg).to_s)
271
- assert File.exist?(a1_cache_gem)
272
- end
273
-
274
- def test_download_with_x_oauth_basic
275
- a1_data = nil
276
- File.open @a1_gem, 'rb' do |fp|
277
- a1_data = fp.read
278
- end
279
-
280
- fetcher = util_fuck_with_fetcher a1_data
281
-
282
- a1_cache_gem = @a1.cache_file
283
- assert_equal a1_cache_gem, fetcher.download(@a1, 'http://token:x-oauth-basic@gems.example.com')
284
- assert_equal("http://token:x-oauth-basic@gems.example.com/gems/a-1.gem",
285
- fetcher.instance_variable_get(:@test_arg).to_s)
286
- assert File.exist?(a1_cache_gem)
287
- end
288
-
289
- def test_download_with_encoded_auth
290
- a1_data = nil
291
- File.open @a1_gem, 'rb' do |fp|
292
- a1_data = fp.read
293
- end
294
-
295
- fetcher = util_fuck_with_fetcher a1_data
296
-
297
- a1_cache_gem = @a1.cache_file
298
- assert_equal a1_cache_gem, fetcher.download(@a1, 'http://user:%25pas%25sword@gems.example.com')
299
- assert_equal("http://user:%25pas%25sword@gems.example.com/gems/a-1.gem",
300
- fetcher.instance_variable_get(:@test_arg).to_s)
301
- assert File.exist?(a1_cache_gem)
302
- end
303
-
304
- def test_download_cached
305
- FileUtils.mv @a1_gem, @cache_dir
306
-
307
- inst = Gem::RemoteFetcher.fetcher
308
-
309
- assert_equal @a1.cache_file, inst.download(@a1, 'http://gems.example.com')
310
- end
311
-
312
- def test_download_local
313
- FileUtils.mv @a1_gem, @tempdir
314
- local_path = File.join @tempdir, @a1.file_name
315
- inst = nil
316
-
317
- Dir.chdir @tempdir do
318
- inst = Gem::RemoteFetcher.fetcher
319
- end
320
-
321
- assert_equal @a1.cache_file, inst.download(@a1, local_path)
322
- end
323
-
324
- def test_download_local_space
325
- space_path = File.join @tempdir, 'space path'
326
- FileUtils.mkdir space_path
327
- FileUtils.mv @a1_gem, space_path
328
- local_path = File.join space_path, @a1.file_name
329
- inst = nil
330
-
331
- Dir.chdir @tempdir do
332
- inst = Gem::RemoteFetcher.fetcher
333
- end
334
-
335
- assert_equal @a1.cache_file, inst.download(@a1, local_path)
336
- end
337
-
338
- def test_download_install_dir
339
- a1_data = File.open @a1_gem, 'rb' do |fp|
340
- fp.read
341
- end
342
-
343
- fetcher = util_fuck_with_fetcher a1_data
344
-
345
- install_dir = File.join @tempdir, 'more_gems'
346
-
347
- a1_cache_gem = File.join install_dir, "cache", @a1.file_name
348
- FileUtils.mkdir_p(File.dirname(a1_cache_gem))
349
- actual = fetcher.download(@a1, 'http://gems.example.com', install_dir)
350
-
351
- assert_equal a1_cache_gem, actual
352
- assert_equal("http://gems.example.com/gems/a-1.gem",
353
- fetcher.instance_variable_get(:@test_arg).to_s)
354
-
355
- assert File.exist?(a1_cache_gem)
356
- end
357
-
358
- unless win_platform? || Process.uid.zero? # File.chmod doesn't work
359
- def test_download_local_read_only
360
- FileUtils.mv @a1_gem, @tempdir
361
- local_path = File.join @tempdir, @a1.file_name
362
- inst = nil
363
- FileUtils.chmod 0555, @a1.cache_dir
364
- FileUtils.mkdir_p File.join(Gem.user_dir, "cache") rescue nil
365
- FileUtils.chmod 0555, File.join(Gem.user_dir, "cache")
366
-
367
- Dir.chdir @tempdir do
368
- inst = Gem::RemoteFetcher.fetcher
369
- end
370
-
371
- assert_equal(File.join(@tempdir, @a1.file_name),
372
- inst.download(@a1, local_path))
373
- ensure
374
- FileUtils.chmod 0755, File.join(Gem.user_dir, "cache")
375
- FileUtils.chmod 0755, @a1.cache_dir
376
- end
377
-
378
- def test_download_read_only
379
- FileUtils.chmod 0555, @a1.cache_dir
380
- FileUtils.chmod 0555, @gemhome
381
-
382
- fetcher = util_fuck_with_fetcher File.read(@a1_gem)
383
- fetcher.download(@a1, 'http://gems.example.com')
384
- a1_cache_gem = File.join Gem.user_dir, "cache", @a1.file_name
385
- assert File.exist? a1_cache_gem
386
- ensure
387
- FileUtils.chmod 0755, @gemhome
388
- FileUtils.chmod 0755, @a1.cache_dir
389
- end
390
- end
391
-
392
- def test_download_platform_legacy
393
- original_platform = 'old-platform'
394
-
395
- e1, e1_gem = util_gem 'e', '1' do |s|
396
- s.platform = Gem::Platform::CURRENT
397
- s.instance_variable_set :@original_platform, original_platform
398
- end
399
- e1.loaded_from = File.join(@gemhome, 'specifications', e1.full_name)
400
-
401
- e1_data = nil
402
- File.open e1_gem, 'rb' do |fp|
403
- e1_data = fp.read
404
- end
405
-
406
- fetcher = util_fuck_with_fetcher e1_data, :blow_chunks
407
-
408
- e1_cache_gem = e1.cache_file
409
-
410
- assert_equal e1_cache_gem, fetcher.download(e1, 'http://gems.example.com')
411
-
412
- assert_equal("http://gems.example.com/gems/#{e1.original_name}.gem",
413
- fetcher.instance_variable_get(:@test_arg).to_s)
414
- assert File.exist?(e1_cache_gem)
415
- end
416
-
417
- def test_download_same_file
418
- FileUtils.mv @a1_gem, @tempdir
419
- local_path = File.join @tempdir, @a1.file_name
420
- inst = nil
421
-
422
- Dir.chdir @tempdir do
423
- inst = Gem::RemoteFetcher.fetcher
424
- end
425
-
426
- cache_path = @a1.cache_file
427
- FileUtils.mv local_path, cache_path
428
-
429
- gem = Gem::Package.new cache_path
430
-
431
- assert_equal cache_path, inst.download(gem.spec, cache_path)
432
- end
433
-
434
- def test_download_unsupported
435
- inst = Gem::RemoteFetcher.fetcher
436
-
437
- e = assert_raise ArgumentError do
438
- inst.download @a1, 'ftp://gems.rubyforge.org'
439
- end
440
-
441
- assert_equal 'unsupported URI scheme ftp', e.message
442
- end
443
-
444
- def test_download_to_cache
445
- @a2, @a2_gem = util_gem 'a', '2'
446
-
447
- util_setup_spec_fetcher @a1, @a2
448
- @fetcher.instance_variable_set :@a1, @a1
449
- @fetcher.instance_variable_set :@a2, @a2
450
- def @fetcher.fetch_path(uri, mtime = nil, head = false)
451
- case uri.request_uri
452
- when /#{@a1.spec_name}/ then
453
- Gem.deflate Marshal.dump @a1
454
- when /#{@a2.spec_name}/ then
455
- Gem.deflate Marshal.dump @a2
456
- else
457
- uri.to_s
458
- end
459
- end
460
-
461
- gem = Gem::RemoteFetcher.fetcher.download_to_cache dep 'a'
462
-
463
- assert_equal @a2.file_name, File.basename(gem)
464
- end
465
-
466
- def test_fetch_path_gzip
467
- fetcher = Gem::RemoteFetcher.new nil
468
- @fetcher = fetcher
469
-
470
- def fetcher.fetch_http(uri, mtime, head = nil)
471
- Gem::Util.gzip 'foo'
472
- end
473
-
474
- assert_equal 'foo', fetcher.fetch_path(@uri + 'foo.gz')
475
- end
476
-
477
- def test_fetch_path_gzip_unmodified
478
- fetcher = Gem::RemoteFetcher.new nil
479
- @fetcher = fetcher
480
-
481
- def fetcher.fetch_http(uri, mtime, head = nil)
482
- nil
483
- end
484
-
485
- assert_nil fetcher.fetch_path(@uri + 'foo.gz', Time.at(0))
486
- end
487
-
488
- def test_fetch_path_io_error
489
- fetcher = Gem::RemoteFetcher.new nil
490
- @fetcher = fetcher
491
-
492
- def fetcher.fetch_http(*)
493
- raise EOFError
494
- end
495
-
496
- url = 'http://example.com/uri'
497
-
498
- e = assert_raise Gem::RemoteFetcher::FetchError do
499
- fetcher.fetch_path url
500
- end
501
-
502
- assert_equal "EOFError: EOFError (#{url})", e.message
503
- assert_equal url, e.uri
504
- end
505
-
506
- def test_fetch_path_socket_error
507
- fetcher = Gem::RemoteFetcher.new nil
508
- @fetcher = fetcher
509
-
510
- def fetcher.fetch_http(uri, mtime, head = nil)
511
- raise SocketError
512
- end
513
-
514
- url = 'http://example.com/uri'
515
-
516
- e = assert_raise Gem::RemoteFetcher::FetchError do
517
- fetcher.fetch_path url
518
- end
519
-
520
- assert_equal "SocketError: SocketError (#{url})", e.message
521
- assert_equal url, e.uri
522
- end
523
-
524
- def test_fetch_path_system_call_error
525
- fetcher = Gem::RemoteFetcher.new nil
526
- @fetcher = fetcher
527
-
528
- def fetcher.fetch_http(uri, mtime = nil, head = nil)
529
- raise Errno::ECONNREFUSED, 'connect(2)'
530
- end
531
-
532
- url = 'http://example.com/uri'
533
-
534
- e = assert_raise Gem::RemoteFetcher::FetchError do
535
- fetcher.fetch_path url
536
- end
537
-
538
- assert_match %r{ECONNREFUSED:.*connect\(2\) \(#{Regexp.escape url}\)\z},
539
- e.message
540
- assert_equal url, e.uri
541
- end
542
-
543
- def test_fetch_path_timeout_error
544
- fetcher = Gem::RemoteFetcher.new nil
545
- @fetcher = fetcher
546
-
547
- def fetcher.fetch_http(uri, mtime = nil, head = nil)
548
- raise Timeout::Error, 'timed out'
549
- end
550
-
551
- url = 'http://example.com/uri'
552
-
553
- e = assert_raise Gem::RemoteFetcher::FetchError do
554
- fetcher.fetch_path url
555
- end
556
-
557
- assert_match %r{Timeout::Error: timed out \(#{Regexp.escape url}\)\z},
558
- e.message
559
- assert_equal url, e.uri
560
- end
561
-
562
- def test_fetch_path_getaddrinfo_error
563
- fetcher = Gem::RemoteFetcher.new nil
564
- @fetcher = fetcher
565
-
566
- def fetcher.fetch_http(uri, mtime = nil, head = nil)
567
- raise SocketError, 'getaddrinfo: nodename nor servname provided'
568
- end
569
-
570
- url = 'http://example.com/uri'
571
-
572
- e = assert_raise Gem::RemoteFetcher::FetchError do
573
- fetcher.fetch_path url
574
- end
575
-
576
- assert_match %r{SocketError: getaddrinfo: nodename nor servname provided \(#{Regexp.escape url}\)\z},
577
- e.message
578
- assert_equal url, e.uri
579
- end
580
-
581
- def test_fetch_path_openssl_ssl_sslerror
582
- fetcher = Gem::RemoteFetcher.new nil
583
- @fetcher = fetcher
584
-
585
- def fetcher.fetch_http(uri, mtime = nil, head = nil)
586
- raise OpenSSL::SSL::SSLError
587
- end
588
-
589
- url = 'http://example.com/uri'
590
-
591
- e = assert_raise Gem::RemoteFetcher::FetchError do
592
- fetcher.fetch_path url
593
- end
594
-
595
- assert_equal "OpenSSL::SSL::SSLError: OpenSSL::SSL::SSLError (#{url})", e.message
596
- assert_equal url, e.uri
597
- end
598
-
599
- def test_fetch_path_unmodified
600
- fetcher = Gem::RemoteFetcher.new nil
601
- @fetcher = fetcher
602
-
603
- def fetcher.fetch_http(uri, mtime, head = nil)
604
- nil
605
- end
606
-
607
- assert_nil fetcher.fetch_path(URI.parse(@gem_repo), Time.at(0))
608
- end
609
-
610
- def test_implicit_no_proxy
611
- use_ui @stub_ui do
612
- ENV['http_proxy'] = 'http://fakeurl:12345'
613
- fetcher = Gem::RemoteFetcher.new :no_proxy
614
- @fetcher = fetcher
615
- assert_data_from_server fetcher.fetch_path(@server_uri)
616
- end
617
- end
618
-
619
- def test_implicit_proxy
620
- use_ui @stub_ui do
621
- ENV['http_proxy'] = @proxy_uri
622
- fetcher = Gem::RemoteFetcher.new nil
623
- @fetcher = fetcher
624
- assert_data_from_proxy fetcher.fetch_path(@server_uri)
625
- end
626
- end
627
-
628
- def test_implicit_upper_case_proxy
629
- use_ui @stub_ui do
630
- ENV['HTTP_PROXY'] = @proxy_uri
631
- fetcher = Gem::RemoteFetcher.new nil
632
- @fetcher = fetcher
633
- assert_data_from_proxy fetcher.fetch_path(@server_uri)
634
- end
635
- end
636
-
637
- def test_implicit_proxy_no_env
638
- use_ui @stub_ui do
639
- fetcher = Gem::RemoteFetcher.new nil
640
- @fetcher = fetcher
641
- assert_data_from_server fetcher.fetch_path(@server_uri)
642
- end
643
- end
644
-
645
- def test_fetch_http
646
- fetcher = Gem::RemoteFetcher.new nil
647
- @fetcher = fetcher
648
- url = 'http://gems.example.com/redirect'
649
-
650
- def fetcher.request(uri, request_class, last_modified = nil)
651
- url = 'http://gems.example.com/redirect'
652
- unless defined? @requested
653
- @requested = true
654
- res = Net::HTTPMovedPermanently.new nil, 301, nil
655
- res.add_field 'Location', url
656
- res
657
- else
658
- res = Net::HTTPOK.new nil, 200, nil
659
- def res.body() 'real_path' end
660
- res
661
- end
662
- end
663
-
664
- data = fetcher.fetch_http URI.parse(url)
665
-
666
- assert_equal 'real_path', data
667
- end
668
-
669
- def test_fetch_http_redirects
670
- fetcher = Gem::RemoteFetcher.new nil
671
- @fetcher = fetcher
672
- url = 'http://gems.example.com/redirect'
673
-
674
- def fetcher.request(uri, request_class, last_modified = nil)
675
- url = 'http://gems.example.com/redirect'
676
- res = Net::HTTPMovedPermanently.new nil, 301, nil
677
- res.add_field 'Location', url
678
- res
679
- end
680
-
681
- e = assert_raise Gem::RemoteFetcher::FetchError do
682
- fetcher.fetch_http URI.parse(url)
683
- end
684
-
685
- assert_equal "too many redirects (#{url})", e.message
686
- end
687
-
688
- def test_fetch_http_redirects_without_location
689
- fetcher = Gem::RemoteFetcher.new nil
690
- @fetcher = fetcher
691
- url = 'http://gems.example.com/redirect'
692
-
693
- def fetcher.request(uri, request_class, last_modified = nil)
694
- res = Net::HTTPMovedPermanently.new nil, 301, nil
695
- res
696
- end
697
-
698
- e = assert_raise Gem::RemoteFetcher::FetchError do
699
- fetcher.fetch_http URI.parse(url)
700
- end
701
-
702
- assert_equal "redirecting but no redirect location was given (#{url})", e.message
703
- end
704
-
705
- def test_fetch_http_with_additional_headers
706
- ENV["http_proxy"] = @proxy_uri
707
- ENV["no_proxy"] = URI::parse(@server_uri).host
708
- fetcher = Gem::RemoteFetcher.new nil, nil, { "X-Captain" => "murphy" }
709
- @fetcher = fetcher
710
- assert_equal "murphy", fetcher.fetch_path(@server_uri)
711
- end
712
-
713
- def assert_fetch_s3(url, signature, token=nil, region='us-east-1', instance_profile_json=nil)
714
- fetcher = Gem::RemoteFetcher.new nil
715
- @fetcher = fetcher
716
- $fetched_uri = nil
717
- $instance_profile = instance_profile_json
718
-
719
- def fetcher.request(uri, request_class, last_modified = nil)
720
- $fetched_uri = uri
721
- res = Net::HTTPOK.new nil, 200, nil
722
- def res.body() 'success' end
723
- res
724
- end
725
-
726
- def fetcher.s3_uri_signer(uri)
727
- require 'json'
728
- s3_uri_signer = Gem::S3URISigner.new(uri)
729
- def s3_uri_signer.ec2_metadata_credentials_json
730
- JSON.parse($instance_profile)
731
- end
732
- # Running sign operation to make sure uri.query is not mutated
733
- s3_uri_signer.sign
734
- raise "URI query is not empty: #{uri.query}" unless uri.query.nil?
735
- s3_uri_signer
736
- end
737
-
738
- data = fetcher.fetch_s3 URI.parse(url)
739
-
740
- assert_equal "https://my-bucket.s3.#{region}.amazonaws.com/gems/specs.4.8.gz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=testuser%2F20190624%2F#{region}%2Fs3%2Faws4_request&X-Amz-Date=20190624T050641Z&X-Amz-Expires=86400#{token ? "&X-Amz-Security-Token=" + token : ""}&X-Amz-SignedHeaders=host&X-Amz-Signature=#{signature}", $fetched_uri.to_s
741
- assert_equal 'success', data
742
- ensure
743
- $fetched_uri = nil
744
- end
745
-
746
- def test_fetch_s3_config_creds
747
- Gem.configuration[:s3_source] = {
748
- 'my-bucket' => { :id => 'testuser', :secret => 'testpass' },
749
- }
750
- url = 's3://my-bucket/gems/specs.4.8.gz'
751
- Time.stub :now, Time.at(1561353581) do
752
- assert_fetch_s3 url, '20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b'
753
- end
754
- ensure
755
- Gem.configuration[:s3_source] = nil
756
- end
757
-
758
- def test_fetch_s3_config_creds_with_region
759
- Gem.configuration[:s3_source] = {
760
- 'my-bucket' => { :id => 'testuser', :secret => 'testpass', :region => 'us-west-2' },
761
- }
762
- url = 's3://my-bucket/gems/specs.4.8.gz'
763
- Time.stub :now, Time.at(1561353581) do
764
- assert_fetch_s3 url, '4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9', nil, 'us-west-2'
765
- end
766
- ensure
767
- Gem.configuration[:s3_source] = nil
768
- end
769
-
770
- def test_fetch_s3_config_creds_with_token
771
- Gem.configuration[:s3_source] = {
772
- 'my-bucket' => { :id => 'testuser', :secret => 'testpass', :security_token => 'testtoken' },
773
- }
774
- url = 's3://my-bucket/gems/specs.4.8.gz'
775
- Time.stub :now, Time.at(1561353581) do
776
- assert_fetch_s3 url, '935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c', 'testtoken'
777
- end
778
- ensure
779
- Gem.configuration[:s3_source] = nil
780
- end
781
-
782
- def test_fetch_s3_env_creds
783
- ENV['AWS_ACCESS_KEY_ID'] = 'testuser'
784
- ENV['AWS_SECRET_ACCESS_KEY'] = 'testpass'
785
- ENV['AWS_SESSION_TOKEN'] = nil
786
- Gem.configuration[:s3_source] = {
787
- 'my-bucket' => { :provider => 'env' },
788
- }
789
- url = 's3://my-bucket/gems/specs.4.8.gz'
790
- Time.stub :now, Time.at(1561353581) do
791
- assert_fetch_s3 url, '20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b'
792
- end
793
- ensure
794
- ENV.each_key {|key| ENV.delete(key) if key.start_with?('AWS') }
795
- Gem.configuration[:s3_source] = nil
796
- end
797
-
798
- def test_fetch_s3_env_creds_with_region
799
- ENV['AWS_ACCESS_KEY_ID'] = 'testuser'
800
- ENV['AWS_SECRET_ACCESS_KEY'] = 'testpass'
801
- ENV['AWS_SESSION_TOKEN'] = nil
802
- Gem.configuration[:s3_source] = {
803
- 'my-bucket' => { :provider => 'env', :region => 'us-west-2' },
804
- }
805
- url = 's3://my-bucket/gems/specs.4.8.gz'
806
- Time.stub :now, Time.at(1561353581) do
807
- assert_fetch_s3 url, '4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9', nil, 'us-west-2'
808
- end
809
- ensure
810
- ENV.each_key {|key| ENV.delete(key) if key.start_with?('AWS') }
811
- Gem.configuration[:s3_source] = nil
812
- end
813
-
814
- def test_fetch_s3_env_creds_with_token
815
- ENV['AWS_ACCESS_KEY_ID'] = 'testuser'
816
- ENV['AWS_SECRET_ACCESS_KEY'] = 'testpass'
817
- ENV['AWS_SESSION_TOKEN'] = 'testtoken'
818
- Gem.configuration[:s3_source] = {
819
- 'my-bucket' => { :provider => 'env' },
820
- }
821
- url = 's3://my-bucket/gems/specs.4.8.gz'
822
- Time.stub :now, Time.at(1561353581) do
823
- assert_fetch_s3 url, '935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c', 'testtoken'
824
- end
825
- ensure
826
- ENV.each_key {|key| ENV.delete(key) if key.start_with?('AWS') }
827
- Gem.configuration[:s3_source] = nil
828
- end
829
-
830
- def test_fetch_s3_url_creds
831
- url = 's3://testuser:testpass@my-bucket/gems/specs.4.8.gz'
832
- Time.stub :now, Time.at(1561353581) do
833
- assert_fetch_s3 url, '20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b'
834
- end
835
- end
836
-
837
- def test_fetch_s3_instance_profile_creds
838
- Gem.configuration[:s3_source] = {
839
- 'my-bucket' => { :provider => 'instance_profile' },
840
- }
841
-
842
- url = 's3://my-bucket/gems/specs.4.8.gz'
843
- Time.stub :now, Time.at(1561353581) do
844
- assert_fetch_s3 url, '20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b', nil, 'us-east-1',
845
- '{"AccessKeyId": "testuser", "SecretAccessKey": "testpass"}'
846
- end
847
- ensure
848
- Gem.configuration[:s3_source] = nil
849
- end
850
-
851
- def test_fetch_s3_instance_profile_creds_with_region
852
- Gem.configuration[:s3_source] = {
853
- 'my-bucket' => { :provider => 'instance_profile', :region => 'us-west-2' },
854
- }
855
-
856
- url = 's3://my-bucket/gems/specs.4.8.gz'
857
- Time.stub :now, Time.at(1561353581) do
858
- assert_fetch_s3 url, '4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9', nil, 'us-west-2',
859
- '{"AccessKeyId": "testuser", "SecretAccessKey": "testpass"}'
860
- end
861
- ensure
862
- Gem.configuration[:s3_source] = nil
863
- end
864
-
865
- def test_fetch_s3_instance_profile_creds_with_token
866
- Gem.configuration[:s3_source] = {
867
- 'my-bucket' => { :provider => 'instance_profile' },
868
- }
869
-
870
- url = 's3://my-bucket/gems/specs.4.8.gz'
871
- Time.stub :now, Time.at(1561353581) do
872
- assert_fetch_s3 url, '935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c', 'testtoken', 'us-east-1',
873
- '{"AccessKeyId": "testuser", "SecretAccessKey": "testpass", "Token": "testtoken"}'
874
- end
875
- ensure
876
- Gem.configuration[:s3_source] = nil
877
- end
878
-
879
- def refute_fetch_s3(url, expected_message)
880
- fetcher = Gem::RemoteFetcher.new nil
881
- @fetcher = fetcher
882
-
883
- e = assert_raise Gem::RemoteFetcher::FetchError do
884
- fetcher.fetch_s3 URI.parse(url)
885
- end
886
-
887
- assert_match expected_message, e.message
888
- end
889
-
890
- def test_fetch_s3_no_source_key
891
- url = 's3://my-bucket/gems/specs.4.8.gz'
892
- refute_fetch_s3 url, 'no s3_source key exists in .gemrc'
893
- end
894
-
895
- def test_fetch_s3_no_host
896
- Gem.configuration[:s3_source] = {
897
- 'my-bucket' => { :id => 'testuser', :secret => 'testpass' },
898
- }
899
-
900
- url = 's3://other-bucket/gems/specs.4.8.gz'
901
- refute_fetch_s3 url, 'no key for host other-bucket in s3_source in .gemrc'
902
- ensure
903
- Gem.configuration[:s3_source] = nil
904
- end
905
-
906
- def test_fetch_s3_no_id
907
- Gem.configuration[:s3_source] = { 'my-bucket' => { :secret => 'testpass' } }
908
-
909
- url = 's3://my-bucket/gems/specs.4.8.gz'
910
- refute_fetch_s3 url, 's3_source for my-bucket missing id or secret'
911
- ensure
912
- Gem.configuration[:s3_source] = nil
913
- end
914
-
915
- def test_fetch_s3_no_secret
916
- Gem.configuration[:s3_source] = { 'my-bucket' => { :id => 'testuser' } }
917
-
918
- url = 's3://my-bucket/gems/specs.4.8.gz'
919
- refute_fetch_s3 url, 's3_source for my-bucket missing id or secret'
920
- ensure
921
- Gem.configuration[:s3_source] = nil
922
- end
923
-
924
- def test_observe_no_proxy_env_single_host
925
- use_ui @stub_ui do
926
- ENV["http_proxy"] = @proxy_uri
927
- ENV["no_proxy"] = URI::parse(@server_uri).host
928
- fetcher = Gem::RemoteFetcher.new nil
929
- @fetcher = fetcher
930
- assert_data_from_server fetcher.fetch_path(@server_uri)
931
- end
932
- end
933
-
934
- def test_observe_no_proxy_env_list
935
- use_ui @stub_ui do
936
- ENV["http_proxy"] = @proxy_uri
937
- ENV["no_proxy"] = "fakeurl.com, #{URI::parse(@server_uri).host}"
938
- fetcher = Gem::RemoteFetcher.new nil
939
- @fetcher = fetcher
940
- assert_data_from_server fetcher.fetch_path(@server_uri)
941
- end
942
- end
943
-
944
- def test_request_block
945
- fetcher = Gem::RemoteFetcher.new nil
946
- @fetcher = fetcher
947
-
948
- assert_throws :block_called do
949
- fetcher.request URI('http://example'), Net::HTTP::Get do |req|
950
- assert_kind_of Net::HTTPGenericRequest, req
951
- throw :block_called
952
- end
953
- end
954
- end
955
-
956
- def test_yaml_error_on_size
957
- use_ui @stub_ui do
958
- self.enable_yaml = false
959
- fetcher = Gem::RemoteFetcher.new nil
960
- @fetcher = fetcher
961
- assert_error { fetcher.size }
962
- end
963
- end
964
-
965
- def test_ssl_connection
966
- ssl_server = start_ssl_server
967
- temp_ca_cert = File.join(__dir__, 'ca_cert.pem')
968
- with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher|
969
- fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
970
- end
971
- end
972
-
973
- def test_ssl_client_cert_auth_connection
974
- ssl_server = start_ssl_server({
975
- :SSLVerifyClient =>
976
- OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT })
977
-
978
- temp_ca_cert = File.join(__dir__, 'ca_cert.pem')
979
- temp_client_cert = File.join(__dir__, 'client.pem')
980
-
981
- with_configured_fetcher(
982
- ":ssl_ca_cert: #{temp_ca_cert}\n" +
983
- ":ssl_client_cert: #{temp_client_cert}\n") do |fetcher|
984
- fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
985
- end
986
- end
987
-
988
- def test_do_not_allow_invalid_client_cert_auth_connection
989
- ssl_server = start_ssl_server({
990
- :SSLVerifyClient =>
991
- OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT })
992
-
993
- temp_ca_cert = File.join(__dir__, 'ca_cert.pem')
994
- temp_client_cert = File.join(__dir__, 'invalid_client.pem')
995
-
996
- with_configured_fetcher(
997
- ":ssl_ca_cert: #{temp_ca_cert}\n" +
998
- ":ssl_client_cert: #{temp_client_cert}\n") do |fetcher|
999
- assert_raise Gem::RemoteFetcher::FetchError do
1000
- fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
1001
- end
1002
- end
1003
- end
1004
-
1005
- def test_do_not_allow_insecure_ssl_connection_by_default
1006
- ssl_server = start_ssl_server
1007
- with_configured_fetcher do |fetcher|
1008
- assert_raise Gem::RemoteFetcher::FetchError do
1009
- fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
1010
- end
1011
- end
1012
- end
1013
-
1014
- def test_ssl_connection_allow_verify_none
1015
- ssl_server = start_ssl_server
1016
- with_configured_fetcher(":ssl_verify_mode: 0") do |fetcher|
1017
- fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
1018
- end
1019
- end
1020
-
1021
- def test_do_not_follow_insecure_redirect
1022
- ssl_server = start_ssl_server
1023
- temp_ca_cert = File.join(__dir__, 'ca_cert.pem')
1024
- expected_error_message =
1025
- "redirecting to non-https resource: #{@server_uri} (https://localhost:#{ssl_server.config[:Port]}/insecure_redirect?to=#{@server_uri})"
1026
-
1027
- with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher|
1028
- err = assert_raise Gem::RemoteFetcher::FetchError do
1029
- fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/insecure_redirect?to=#{@server_uri}")
1030
- end
1031
-
1032
- assert_equal(err.message, expected_error_message)
1033
- end
1034
- end
1035
-
1036
- def test_nil_ca_cert
1037
- ssl_server = start_ssl_server
1038
- temp_ca_cert = nil
1039
-
1040
- with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher|
1041
- assert_raise Gem::RemoteFetcher::FetchError do
1042
- fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}")
1043
- end
1044
- end
1045
- end
1046
-
1047
- def with_configured_fetcher(config_str = nil, &block)
1048
- if config_str
1049
- temp_conf = File.join @tempdir, '.gemrc'
1050
- File.open temp_conf, 'w' do |fp|
1051
- fp.puts config_str
1052
- end
1053
- Gem.configuration = Gem::ConfigFile.new %W[--config-file #{temp_conf}]
1054
- end
1055
- fetcher = Gem::RemoteFetcher.new
1056
- yield fetcher
1057
- ensure
1058
- fetcher.close_all
1059
- Gem.configuration = nil
1060
- end
1061
-
1062
- def assert_error(exception_class=Exception)
1063
- got_exception = false
1064
-
1065
- begin
1066
- yield
1067
- rescue exception_class
1068
- got_exception = true
1069
- end
1070
-
1071
- assert got_exception, "Expected exception conforming to #{exception_class}"
1072
- end
1073
-
1074
- def assert_data_from_server(data)
1075
- assert_match(/0\.4\.11/, data, "Data is not from server")
1076
- end
1077
-
1078
- def assert_data_from_proxy(data)
1079
- assert_match(/0\.4\.2/, data, "Data is not from proxy")
1080
- end
1081
-
1082
- class NilLog < WEBrick::Log
1083
- def log(level, data) #Do nothing
1084
- end
1085
- end
1086
-
1087
- private
1088
-
1089
- attr_reader :normal_server, :proxy_server
1090
- attr_accessor :enable_zip, :enable_yaml
1091
-
1092
- def start_servers
1093
- @normal_server ||= start_server(SERVER_DATA)
1094
- @proxy_server ||= start_server(PROXY_DATA)
1095
- @enable_yaml = true
1096
- @enable_zip = false
1097
- @ssl_server = nil
1098
- @ssl_server_thread = nil
1099
- end
1100
-
1101
- def stop_servers
1102
- if @normal_server
1103
- @normal_server.kill.join
1104
- @normal_server = nil
1105
- end
1106
- if @proxy_server
1107
- @proxy_server.kill.join
1108
- @proxy_server = nil
1109
- end
1110
- if @ssl_server
1111
- @ssl_server.stop
1112
- @ssl_server = nil
1113
- end
1114
- if @ssl_server_thread
1115
- @ssl_server_thread.kill.join
1116
- @ssl_server_thread = nil
1117
- end
1118
- utils = WEBrick::Utils # TimeoutHandler is since 1.9
1119
- utils::TimeoutHandler.terminate if defined?(utils::TimeoutHandler.terminate)
1120
- end
1121
-
1122
- def normal_server_port
1123
- @normal_server[:server].config[:Port]
1124
- end
1125
-
1126
- def proxy_server_port
1127
- @proxy_server[:server].config[:Port]
1128
- end
1129
-
1130
- def start_ssl_server(config = {})
1131
- pend "starting this test server fails randomly on jruby" if Gem.java_platform?
1132
-
1133
- null_logger = NilLog.new
1134
- server = WEBrick::HTTPServer.new({
1135
- :Port => 0,
1136
- :Logger => null_logger,
1137
- :AccessLog => [],
1138
- :SSLEnable => true,
1139
- :SSLCACertificateFile => File.join(__dir__, 'ca_cert.pem'),
1140
- :SSLCertificate => cert('ssl_cert.pem'),
1141
- :SSLPrivateKey => key('ssl_key.pem'),
1142
- :SSLVerifyClient => nil,
1143
- :SSLCertName => nil,
1144
- }.merge(config))
1145
- server.mount_proc("/yaml") do |req, res|
1146
- res.body = "--- true\n"
1147
- end
1148
- server.mount_proc("/insecure_redirect") do |req, res|
1149
- res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, req.query['to'])
1150
- end
1151
- server.ssl_context.tmp_dh_callback = proc { TEST_KEY_DH2048 }
1152
- t = Thread.new do
1153
- begin
1154
- server.start
1155
- rescue Exception => ex
1156
- puts "ERROR during server thread: #{ex.message}"
1157
- raise
1158
- ensure
1159
- server.shutdown
1160
- end
1161
- end
1162
- while server.status != :Running
1163
- sleep 0.1
1164
- unless t.alive?
1165
- t.join
1166
- raise
1167
- end
1168
- end
1169
- @ssl_server = server
1170
- @ssl_server_thread = t
1171
- server
1172
- end
1173
-
1174
- def start_server(data)
1175
- null_logger = NilLog.new
1176
- s = WEBrick::HTTPServer.new(
1177
- :Port => 0,
1178
- :DocumentRoot => nil,
1179
- :Logger => null_logger,
1180
- :AccessLog => null_logger
1181
- )
1182
- s.mount_proc("/kill") {|req, res| s.shutdown }
1183
- s.mount_proc("/yaml") do |req, res|
1184
- if req["X-Captain"]
1185
- res.body = req["X-Captain"]
1186
- elsif @enable_yaml
1187
- res.body = data
1188
- res['Content-Type'] = 'text/plain'
1189
- res['content-length'] = data.size
1190
- else
1191
- res.status = "404"
1192
- res.body = "<h1>NOT FOUND</h1>"
1193
- res['Content-Type'] = 'text/html'
1194
- end
1195
- end
1196
- s.mount_proc("/yaml.Z") do |req, res|
1197
- if @enable_zip
1198
- res.body = Zlib::Deflate.deflate(data)
1199
- res['Content-Type'] = 'text/plain'
1200
- else
1201
- res.status = "404"
1202
- res.body = "<h1>NOT FOUND</h1>"
1203
- res['Content-Type'] = 'text/html'
1204
- end
1205
- end
1206
- th = Thread.new do
1207
- begin
1208
- s.start
1209
- rescue Exception => ex
1210
- abort "ERROR during server thread: #{ex.message}"
1211
- ensure
1212
- s.shutdown
1213
- end
1214
- end
1215
- th[:server] = s
1216
- th
1217
- end
1218
-
1219
- def cert(filename)
1220
- OpenSSL::X509::Certificate.new(File.read(File.join(__dir__, filename)))
1221
- end
1222
-
1223
- def key(filename)
1224
- OpenSSL::PKey::RSA.new(File.read(File.join(__dir__, filename)))
1225
- end
1226
- end if Gem::HAVE_OPENSSL