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,218 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
-
5
- unless Gem::HAVE_OPENSSL
6
- warn "Skipping Gem::Security::Signer tests. openssl not found."
7
- end
8
-
9
- class TestGemSecuritySigner < Gem::TestCase
10
- ALTERNATE_KEY = load_key "alternate"
11
- CHILD_KEY = load_key "child"
12
- GRANDCHILD_KEY = load_key "grandchild"
13
-
14
- CHILD_CERT = load_cert "child"
15
- GRANDCHILD_CERT = load_cert "grandchild"
16
- EXPIRED_CERT = load_cert "expired"
17
-
18
- def setup
19
- super
20
-
21
- @cert_file = PUBLIC_CERT
22
- end
23
-
24
- def test_initialize
25
- signer = Gem::Security::Signer.new nil, nil
26
-
27
- assert_nil signer.key
28
- assert_nil signer.cert_chain
29
- end
30
-
31
- def test_initialize_cert_chain_empty
32
- signer = Gem::Security::Signer.new PUBLIC_KEY, []
33
-
34
- assert_empty signer.cert_chain
35
- end
36
-
37
- def test_initialize_cert_chain_mixed
38
- signer = Gem::Security::Signer.new nil, [@cert_file, CHILD_CERT]
39
-
40
- assert_equal [PUBLIC_CERT, CHILD_CERT].map {|c| c.to_pem },
41
- signer.cert_chain.map {|c| c.to_pem }
42
- end
43
-
44
- def test_initialize_cert_chain_invalid
45
- assert_raise OpenSSL::X509::CertificateError do
46
- Gem::Security::Signer.new nil, ["garbage"]
47
- end
48
- end
49
-
50
- def test_initialize_cert_chain_path
51
- signer = Gem::Security::Signer.new nil, [@cert_file]
52
-
53
- assert_equal [PUBLIC_CERT].map {|c| c.to_pem },
54
- signer.cert_chain.map {|c| c.to_pem }
55
- end
56
-
57
- def test_initialize_default
58
- FileUtils.mkdir_p File.join(Gem.user_home, ".gem")
59
-
60
- private_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem"
61
- Gem::Security.write PRIVATE_KEY, private_key_path
62
-
63
- public_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"
64
- Gem::Security.write PUBLIC_CERT, public_cert_path
65
-
66
- signer = Gem::Security::Signer.new nil, nil
67
-
68
- assert_equal PRIVATE_KEY.to_pem, signer.key.to_pem
69
- assert_equal [PUBLIC_CERT.to_pem], signer.cert_chain.map {|c| c.to_pem }
70
- end
71
-
72
- def test_initialize_key_path
73
- key_file = PRIVATE_KEY_PATH
74
-
75
- signer = Gem::Security::Signer.new key_file, nil
76
-
77
- assert_equal PRIVATE_KEY.to_s, signer.key.to_s
78
- end
79
-
80
- def test_initialize_encrypted_key_path
81
- key_file = ENCRYPTED_PRIVATE_KEY_PATH
82
-
83
- signer = Gem::Security::Signer.new key_file, nil, PRIVATE_KEY_PASSPHRASE
84
-
85
- assert_equal ENCRYPTED_PRIVATE_KEY.to_s, signer.key.to_s
86
- end
87
-
88
- def test_extract_name
89
- signer = Gem::Security::Signer.new nil, nil
90
-
91
- assert_equal "child@example", signer.extract_name(CHILD_CERT)
92
- end
93
-
94
- def test_load_cert_chain
95
- Gem::Security.trust_dir.trust_cert PUBLIC_CERT
96
-
97
- signer = Gem::Security::Signer.new nil, []
98
- signer.cert_chain.replace [CHILD_CERT]
99
-
100
- signer.load_cert_chain
101
-
102
- assert_equal [PUBLIC_CERT.to_pem, CHILD_CERT.to_pem],
103
- signer.cert_chain.map {|c| c.to_pem }
104
- end
105
-
106
- def test_load_cert_chain_broken
107
- Gem::Security.trust_dir.trust_cert CHILD_CERT
108
-
109
- signer = Gem::Security::Signer.new nil, []
110
- signer.cert_chain.replace [GRANDCHILD_CERT]
111
-
112
- signer.load_cert_chain
113
-
114
- assert_equal [CHILD_CERT.to_pem, GRANDCHILD_CERT.to_pem],
115
- signer.cert_chain.map {|c| c.to_pem }
116
- end
117
-
118
- def test_sign
119
- signer = Gem::Security::Signer.new PRIVATE_KEY, [PUBLIC_CERT]
120
-
121
- signature = signer.sign "hello"
122
-
123
- expected = <<-EXPECTED
124
- FmrCYxEXW3dgYYNMxPdS16VrdXT+d5nyXTVlRm64ZHSgMxMAaPtQJsVYv73m
125
- DWHTzNnLhhINSpgBMLh5a4atM52yxVdkPUTgqIH+LeIPBXn8xaP5JLmfDcmI
126
- tBpc/9DhS3v9iKCX40igAArFu7Gg3swbgQ61SP+U22LvG5nDQZQz3sudtsw3
127
- qKPykFVaYjrRwzvBdSdJ1PwlAsanSwcwS/GKPtmE/ykZ6X5XOx7wvCDL/zGy
128
- B8khkB8hDKC6moCzebmUxCBmTmXD0Wjzon+bf4MOriVE3a0ySGRvpr1mKR2+
129
- 9EaVo7pDJLEM487+xg1CAZHRhwshd6II00XEzG/jBQ==
130
- EXPECTED
131
-
132
- assert_equal expected, [signature].pack("m")
133
- end
134
-
135
- def test_sign_expired
136
- signer = Gem::Security::Signer.new PRIVATE_KEY, [EXPIRED_CERT]
137
-
138
- e = assert_raise Gem::Security::Exception do
139
- signer.sign "hello"
140
- end
141
-
142
- assert_match "certificate /CN=nobody/DC=example not valid after 1970-01-01 00:00:00 UTC", e.message
143
- end
144
-
145
- def test_sign_expired_auto_update
146
- pend if Gem.java_platform?
147
- FileUtils.mkdir_p File.join(Gem.user_home, ".gem"), :mode => 0o700
148
-
149
- private_key_path = File.join(Gem.user_home, ".gem", "gem-private_key.pem")
150
- Gem::Security.write PRIVATE_KEY, private_key_path
151
-
152
- cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"
153
- Gem::Security.write EXPIRED_CERT, cert_path
154
-
155
- signer = Gem::Security::Signer.new PRIVATE_KEY, [EXPIRED_CERT]
156
-
157
- signer.sign "hello"
158
-
159
- cert = OpenSSL::X509::Certificate.new File.read cert_path
160
-
161
- refute_equal EXPIRED_CERT.to_pem, cert.to_pem
162
- assert_in_delta Time.now, cert.not_before, 10
163
-
164
- expiry = EXPIRED_CERT.not_after.strftime "%Y%m%d%H%M%S"
165
-
166
- expired_path =
167
- File.join Gem.user_home, ".gem", "gem-public_cert.pem.expired.#{expiry}"
168
-
169
- assert_path_exist expired_path
170
- assert_equal EXPIRED_CERT.to_pem, File.read(expired_path)
171
- end
172
-
173
- def test_sign_expired_auto_update_exists
174
- FileUtils.mkdir_p File.join(Gem.user_home, ".gem"), :mode => 0o700
175
-
176
- expiry = EXPIRED_CERT.not_after.strftime "%Y%m%d%H%M%S"
177
- expired_path =
178
- File.join Gem.user_home, "gem-public_cert.pem.expired.#{expiry}"
179
-
180
- Gem::Security.write EXPIRED_CERT, expired_path
181
-
182
- private_key_path = File.join(Gem.user_home, "gem-private_key.pem")
183
- Gem::Security.write PRIVATE_KEY, private_key_path
184
-
185
- cert_path = File.join Gem.user_home, "gem-public_cert.pem"
186
- Gem::Security.write EXPIRED_CERT, cert_path
187
-
188
- signer = Gem::Security::Signer.new PRIVATE_KEY, [EXPIRED_CERT]
189
-
190
- e = assert_raise Gem::Security::Exception do
191
- signer.sign "hello"
192
- end
193
-
194
- assert_match %r{certificate /CN=nobody/DC=example not valid}, e.message
195
- end
196
-
197
- def test_sign_no_key
198
- signer = Gem::Security::Signer.new nil, nil
199
-
200
- assert_nil signer.sign "stuff"
201
- end
202
-
203
- def test_sign_wrong_key
204
- signer = Gem::Security::Signer.new ALTERNATE_KEY, [PUBLIC_CERT]
205
-
206
- assert_raise Gem::Security::Exception do
207
- signer.sign "hello"
208
- end
209
- end
210
-
211
- def test_sign_no_certs
212
- signer = Gem::Security::Signer.new ALTERNATE_KEY, []
213
-
214
- assert_raise Gem::Security::Exception do
215
- signer.sign "hello"
216
- end
217
- end
218
- end if Gem::HAVE_OPENSSL
@@ -1,99 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
-
5
- unless Gem::HAVE_OPENSSL
6
- warn "Skipping Gem::Security::TrustDir tests. openssl not found."
7
- end
8
-
9
- class TestGemSecurityTrustDir < Gem::TestCase
10
- CHILD_CERT = load_cert "child"
11
-
12
- def setup
13
- super
14
-
15
- @dest_dir = File.join @tempdir, "trust"
16
-
17
- @trust_dir = Gem::Security::TrustDir.new @dest_dir
18
- end
19
-
20
- def test_cert_path
21
- digest = OpenSSL::Digest.hexdigest Gem::Security::DIGEST_NAME, PUBLIC_CERT.subject.to_s
22
-
23
- expected = File.join @dest_dir, "cert-#{digest}.pem"
24
-
25
- assert_equal expected, @trust_dir.cert_path(PUBLIC_CERT)
26
- end
27
-
28
- def test_issuer_of
29
- assert_nil @trust_dir.issuer_of(CHILD_CERT)
30
-
31
- @trust_dir.trust_cert PUBLIC_CERT
32
-
33
- assert_equal PUBLIC_CERT.to_pem, @trust_dir.issuer_of(CHILD_CERT).to_pem
34
- end
35
-
36
- def test_load_certificate
37
- @trust_dir.trust_cert PUBLIC_CERT
38
-
39
- path = @trust_dir.cert_path PUBLIC_CERT
40
-
41
- assert_equal PUBLIC_CERT.to_pem, @trust_dir.load_certificate(path).to_pem
42
- end
43
-
44
- def test_name_path
45
- digest = OpenSSL::Digest.hexdigest Gem::Security::DIGEST_NAME, PUBLIC_CERT.subject.to_s
46
-
47
- expected = File.join @dest_dir, "cert-#{digest}.pem"
48
-
49
- assert_equal expected, @trust_dir.name_path(PUBLIC_CERT.subject)
50
- end
51
-
52
- def test_trust_cert
53
- @trust_dir.trust_cert PUBLIC_CERT
54
-
55
- trusted = @trust_dir.cert_path PUBLIC_CERT
56
-
57
- assert_path_exist trusted
58
-
59
- mask = 0o100600 & (~File.umask)
60
-
61
- assert_equal mask, File.stat(trusted).mode unless win_platform?
62
-
63
- assert_equal PUBLIC_CERT.to_pem, File.read(trusted)
64
- end
65
-
66
- def test_verify
67
- assert_path_not_exist @dest_dir
68
-
69
- @trust_dir.verify
70
-
71
- assert_path_exist @dest_dir
72
-
73
- mask = 0o40700 & (~File.umask)
74
- mask |= 0o200000 if RUBY_PLATFORM.include?("aix")
75
-
76
- assert_equal mask, File.stat(@dest_dir).mode unless win_platform?
77
- end
78
-
79
- def test_verify_file
80
- FileUtils.touch @dest_dir
81
-
82
- e = assert_raise Gem::Security::Exception do
83
- @trust_dir.verify
84
- end
85
-
86
- assert_equal "trust directory #{@dest_dir} is not a directory", e.message
87
- end
88
-
89
- def test_verify_wrong_permissions
90
- FileUtils.mkdir_p @dest_dir, :mode => 0o777
91
-
92
- @trust_dir.verify
93
-
94
- mask = 0o40700 & (~File.umask)
95
- mask |= 0o200000 if RUBY_PLATFORM.include?("aix")
96
-
97
- assert_equal mask, File.stat(@dest_dir).mode unless win_platform?
98
- end
99
- end if Gem::HAVE_OPENSSL
@@ -1,123 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require "rubygems/user_interaction"
5
- require "timeout"
6
-
7
- class TestGemSilentUI < Gem::TestCase
8
- def setup
9
- super
10
- @sui = Gem::SilentUI.new
11
- end
12
-
13
- def teardown
14
- @sui.close
15
- super
16
- end
17
-
18
- def test_ask
19
- value = nil
20
- out, err = capture_output do
21
- use_ui @sui do
22
- value = @sui.ask "Problem?"
23
- end
24
- end
25
-
26
- assert_empty out, "No output"
27
- assert_empty err, "No output"
28
-
29
- assert_nil value, "No value"
30
- end
31
-
32
- def test_ask_for_password
33
- value = nil
34
- out, err = capture_output do
35
- use_ui @sui do
36
- value = @sui.ask_for_password "Problem?"
37
- end
38
- end
39
-
40
- assert_empty out, "No output"
41
- assert_empty err, "No output"
42
-
43
- assert_nil value, "No value"
44
- end
45
-
46
- def test_ask_yes_no
47
- value = nil
48
- out, err = capture_output do
49
- use_ui @sui do
50
- assert_raise(Gem::OperationNotSupportedError) do
51
- @sui.ask_yes_no "Problem?"
52
- end
53
- end
54
- end
55
-
56
- assert_empty out, "No output"
57
- assert_empty err, "No output"
58
-
59
- out, err = capture_output do
60
- use_ui @sui do
61
- value = @sui.ask_yes_no "Problem?", true
62
- end
63
- end
64
-
65
- assert_empty out, "No output"
66
- assert_empty err, "No output"
67
-
68
- assert value, "Value is true"
69
-
70
- out, err = capture_output do
71
- use_ui @sui do
72
- value = @sui.ask_yes_no "Problem?", false
73
- end
74
- end
75
-
76
- assert_empty out, "No output"
77
- assert_empty err, "No output"
78
-
79
- assert_equal value, false, "Value is false"
80
- end
81
-
82
- def test_choose_from_list
83
- value = nil
84
- out, err = capture_output do
85
- use_ui @sui do
86
- value = @sui.choose_from_list "Problem?", %w[yes no]
87
- end
88
- end
89
-
90
- assert_empty out, "No output"
91
- assert_empty err, "No output"
92
-
93
- assert_equal [nil, nil], value, "Value is nil!"
94
- end
95
-
96
- def test_progress_reporter
97
- out, err = capture_output do
98
- use_ui @sui do
99
- @sui.progress_reporter 10, "hi"
100
- end
101
- end
102
-
103
- assert_empty out, "No output"
104
- assert_empty err, "No output"
105
- end
106
-
107
- def test_download_reporter
108
- out, err = capture_output do
109
- use_ui @sui do
110
- @sui.download_reporter.fetch "a.gem", 1024
111
- end
112
- end
113
-
114
- assert_empty out, "No output"
115
- assert_empty err, "No output"
116
- end
117
-
118
- def test_new_without_dev_null
119
- File.stub(:open, ->(path, mode) { raise Errno::ENOTCAPABLE if path == IO::NULL }) do
120
- Gem::SilentUI.new
121
- end
122
- end
123
- end
@@ -1,254 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require "rubygems/source"
5
- require "rubygems/indexer"
6
-
7
- class TestGemSource < Gem::TestCase
8
- def tuple(*args)
9
- Gem::NameTuple.new(*args)
10
- end
11
-
12
- def setup
13
- super
14
-
15
- @specs = spec_fetcher do |fetcher|
16
- fetcher.spec "a", "1.a"
17
- fetcher.gem "a", 1
18
- fetcher.spec "a", 2
19
- fetcher.spec "b", 2
20
- end
21
-
22
- @source = Gem::Source.new(@gem_repo)
23
- end
24
-
25
- def test_initialize_invalid_uri
26
- assert_raise URI::InvalidURIError do
27
- Gem::Source.new "git@example:a.git"
28
- end
29
- end
30
-
31
- def test_initialize_git
32
- repository = "git@example:a.git"
33
-
34
- source = Gem::Source::Git.new "a", repository, nil, false
35
-
36
- assert_equal repository, source.uri
37
- end
38
-
39
- def test_cache_dir_escapes_windows_paths
40
- uri = URI.parse("file:///C:/WINDOWS/Temp/gem_repo")
41
- root = Gem.spec_cache_dir
42
- cache_dir = @source.cache_dir(uri).gsub(root, "")
43
- assert cache_dir !~ /:/, "#{cache_dir} should not contain a :"
44
- end
45
-
46
- def test_dependency_resolver_set_bundler_api
47
- response = Net::HTTPResponse.new "1.1", 200, "OK"
48
- response.uri = URI("http://example")
49
-
50
- @fetcher.data[@gem_repo] = response
51
-
52
- set = @source.dependency_resolver_set
53
-
54
- assert_kind_of Gem::Resolver::APISet, set
55
- end
56
-
57
- def test_dependency_resolver_set_file_uri
58
- Gem::Indexer.new(@tempdir).generate_index
59
-
60
- source = Gem::Source.new "file://#{@tempdir}/"
61
-
62
- set = source.dependency_resolver_set
63
-
64
- assert_kind_of Gem::Resolver::IndexSet, set
65
- end
66
-
67
- def test_dependency_resolver_set_marshal_api
68
- set = @source.dependency_resolver_set
69
-
70
- assert_kind_of Gem::Resolver::IndexSet, set
71
- end
72
-
73
- def test_fetch_spec
74
- a1 = @specs["a-1"]
75
-
76
- spec_uri = "#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{a1.spec_name}"
77
-
78
- spec = @source.fetch_spec tuple("a", Gem::Version.new(1), "ruby")
79
- assert_equal a1.full_name, spec.full_name
80
-
81
- cache_dir = @source.cache_dir URI.parse(spec_uri)
82
-
83
- cache_file = File.join cache_dir, a1.spec_name
84
-
85
- assert File.exist?(cache_file)
86
- end
87
-
88
- def test_fetch_spec_cached
89
- a1 = @specs["a-1"]
90
-
91
- spec_uri = "#{@gem_repo}/#{Gem::MARSHAL_SPEC_DIR}#{a1.spec_name}"
92
- @fetcher.data["#{spec_uri}.rz"] = nil
93
-
94
- cache_dir = @source.cache_dir URI.parse(spec_uri)
95
- FileUtils.mkdir_p cache_dir
96
-
97
- cache_file = File.join cache_dir, a1.spec_name
98
-
99
- File.open cache_file, "wb" do |io|
100
- Marshal.dump a1, io
101
- end
102
-
103
- spec = @source.fetch_spec tuple("a", Gem::Version.new(1), "ruby")
104
- assert_equal a1.full_name, spec.full_name
105
- end
106
-
107
- def test_fetch_spec_platform
108
- specs = spec_fetcher do |fetcher|
109
- fetcher.legacy_platform
110
- end
111
-
112
- spec = @source.fetch_spec tuple("pl", Gem::Version.new(1), "i386-linux")
113
-
114
- assert_equal specs["pl-1-x86-linux"].full_name, spec.full_name
115
- end
116
-
117
- def test_fetch_spec_platform_ruby
118
- spec = @source.fetch_spec tuple("a", Gem::Version.new(1), nil)
119
- assert_equal @specs["a-1"].full_name, spec.full_name
120
-
121
- spec = @source.fetch_spec tuple("a", Gem::Version.new(1), "")
122
- assert_equal @specs["a-1"].full_name, spec.full_name
123
- end
124
-
125
- def test_load_specs
126
- released = @source.load_specs(:released).map {|spec| spec.full_name }
127
- assert_equal %W[a-2 a-1 b-2], released
128
-
129
- cache_dir = File.join Gem.spec_cache_dir, "gems.example.com%80"
130
- assert File.exist?(cache_dir), "#{cache_dir} does not exist"
131
-
132
- cache_file = File.join cache_dir, "specs.#{Gem.marshal_version}"
133
- assert File.exist?(cache_file)
134
- end
135
-
136
- def test_load_specs_cached
137
- latest_specs = @source.load_specs :latest
138
-
139
- # Make sure the cached version is actually different:
140
- latest_specs << Gem::NameTuple.new("cached", Gem::Version.new("1.0.0"), "ruby")
141
-
142
- @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = nil
143
- @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}"] =
144
- " " * Marshal.dump(latest_specs).length
145
-
146
- cache_dir = File.join Gem.spec_cache_dir, "gems.example.com%80"
147
-
148
- FileUtils.mkdir_p cache_dir
149
-
150
- cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
151
-
152
- File.open cache_file, "wb" do |io|
153
- Marshal.dump latest_specs, io
154
- end
155
-
156
- cached_specs = @source.load_specs :latest
157
-
158
- assert_equal latest_specs, cached_specs
159
- end
160
-
161
- def test_load_specs_cached_empty
162
- latest_specs = @source.load_specs :latest
163
-
164
- # Make sure the cached version is actually different:
165
- latest_specs << Gem::NameTuple.new("fixed", Gem::Version.new("1.0.0"), "ruby")
166
- # Setup valid data on the 'remote'
167
- @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] =
168
- util_gzip(Marshal.dump(latest_specs))
169
-
170
- cache_dir = File.join Gem.spec_cache_dir, "gems.example.com%80"
171
-
172
- FileUtils.mkdir_p cache_dir
173
-
174
- cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
175
-
176
- File.open cache_file, "wb" do |io|
177
- # Setup invalid data in the cache:
178
- io.write Marshal.dump(latest_specs)[0, 10]
179
- end
180
-
181
- fixed_specs = @source.load_specs :latest
182
-
183
- assert_equal latest_specs, fixed_specs
184
- end
185
-
186
- def test_load_specs_from_unavailable_uri
187
- src = Gem::Source.new("http://not-there.nothing")
188
-
189
- assert_raise Gem::RemoteFetcher::FetchError do
190
- src.load_specs :latest
191
- end
192
- end
193
-
194
- def test_spaceship
195
- remote = @source
196
- specific = Gem::Source::SpecificFile.new @specs["a-1"].cache_file
197
- installed = Gem::Source::Installed.new
198
- local = Gem::Source::Local.new
199
-
200
- assert_equal(0, remote.<=>(remote), "remote <=> remote")
201
-
202
- assert_equal(-1, remote.<=>(specific), "remote <=> specific")
203
- assert_equal(1, specific.<=>(remote), "specific <=> remote")
204
-
205
- assert_equal(-1, remote.<=>(local), "remote <=> local")
206
- assert_equal(1, local.<=>(remote), "local <=> remote")
207
-
208
- assert_equal(-1, remote.<=>(installed), "remote <=> installed")
209
- assert_equal(1, installed.<=>(remote), "installed <=> remote")
210
-
211
- no_uri = @source.dup
212
- no_uri.instance_variable_set :@uri, nil
213
-
214
- assert_equal(-1, remote.<=>(no_uri), "remote <=> no_uri")
215
- end
216
-
217
- def test_spaceship_order_is_preserved_when_uri_differs
218
- sourceA = Gem::Source.new "http://example.com/a"
219
- sourceB = Gem::Source.new "http://example.com/b"
220
-
221
- assert_equal(0, sourceA.<=>(sourceA), "sourceA <=> sourceA")
222
- assert_equal(1, sourceA.<=>(sourceB), "sourceA <=> sourceB")
223
- assert_equal(1, sourceB.<=>(sourceA), "sourceB <=> sourceA")
224
- end
225
-
226
- def test_update_cache_eh
227
- assert @source.update_cache?
228
- end
229
-
230
- def test_update_cache_eh_home_nonexistent
231
- FileUtils.rmdir Gem.user_home
232
-
233
- refute @source.update_cache?
234
- end
235
-
236
- def test_typo_squatting
237
- rubygems_source = Gem::Source.new("https://rubgems.org")
238
- assert rubygems_source.typo_squatting?("rubygems.org")
239
- assert rubygems_source.typo_squatting?("rubyagems.org")
240
- assert rubygems_source.typo_squatting?("rubyasgems.org")
241
- refute rubygems_source.typo_squatting?("rubysertgems.org")
242
- end
243
-
244
- def test_typo_squatting_false_positive
245
- rubygems_source = Gem::Source.new("https://rubygems.org")
246
- refute rubygems_source.typo_squatting?("rubygems.org")
247
- end
248
-
249
- def test_typo_squatting_custom_distance_threshold
250
- rubygems_source = Gem::Source.new("https://rubgems.org")
251
- distance_threshold = 5
252
- assert rubygems_source.typo_squatting?("rubysertgems.org", distance_threshold)
253
- end
254
- end