rubygems-update 3.4.22 → 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 (528) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +99 -2
  3. data/Manifest.txt +34 -221
  4. data/README.md +1 -3
  5. data/bundler/CHANGELOG.md +53 -0
  6. data/bundler/bundler.gemspec +4 -2
  7. data/bundler/exe/bundle +1 -10
  8. data/bundler/lib/bundler/build_metadata.rb +3 -3
  9. data/bundler/lib/bundler/capistrano.rb +1 -1
  10. data/bundler/lib/bundler/checksum.rb +245 -0
  11. data/bundler/lib/bundler/ci_detector.rb +75 -0
  12. data/bundler/lib/bundler/cli/add.rb +3 -3
  13. data/bundler/lib/bundler/cli/binstubs.rb +4 -4
  14. data/bundler/lib/bundler/cli/cache.rb +1 -1
  15. data/bundler/lib/bundler/cli/check.rb +1 -1
  16. data/bundler/lib/bundler/cli/common.rb +9 -1
  17. data/bundler/lib/bundler/cli/config.rb +8 -7
  18. data/bundler/lib/bundler/cli/console.rb +3 -2
  19. data/bundler/lib/bundler/cli/doctor.rb +2 -2
  20. data/bundler/lib/bundler/cli/exec.rb +1 -1
  21. data/bundler/lib/bundler/cli/gem.rb +28 -23
  22. data/bundler/lib/bundler/cli/info.rb +2 -13
  23. data/bundler/lib/bundler/cli/install.rb +5 -4
  24. data/bundler/lib/bundler/cli/issue.rb +1 -1
  25. data/bundler/lib/bundler/cli/lock.rb +4 -4
  26. data/bundler/lib/bundler/cli/open.rb +1 -1
  27. data/bundler/lib/bundler/cli/outdated.rb +6 -6
  28. data/bundler/lib/bundler/cli/plugin.rb +7 -14
  29. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  30. data/bundler/lib/bundler/cli/show.rb +2 -2
  31. data/bundler/lib/bundler/cli/update.rb +5 -5
  32. data/bundler/lib/bundler/cli.rb +215 -263
  33. data/bundler/lib/bundler/compact_index_client/cache.rb +29 -9
  34. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  35. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  36. data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
  37. data/bundler/lib/bundler/compact_index_client.rb +14 -7
  38. data/bundler/lib/bundler/constants.rb +1 -1
  39. data/bundler/lib/bundler/current_ruby.rb +5 -21
  40. data/bundler/lib/bundler/definition.rb +42 -15
  41. data/bundler/lib/bundler/dependency.rb +16 -12
  42. data/bundler/lib/bundler/digest.rb +2 -2
  43. data/bundler/lib/bundler/dsl.rb +43 -25
  44. data/bundler/lib/bundler/endpoint_specification.rb +5 -1
  45. data/bundler/lib/bundler/env.rb +1 -3
  46. data/bundler/lib/bundler/errors.rb +43 -0
  47. data/bundler/lib/bundler/fetcher/base.rb +3 -1
  48. data/bundler/lib/bundler/fetcher/compact_index.rb +4 -4
  49. data/bundler/lib/bundler/fetcher/downloader.rb +13 -11
  50. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  51. data/bundler/lib/bundler/fetcher/index.rb +1 -1
  52. data/bundler/lib/bundler/fetcher.rb +28 -25
  53. data/bundler/lib/bundler/friendly_errors.rb +5 -5
  54. data/bundler/lib/bundler/gem_helper.rb +1 -1
  55. data/bundler/lib/bundler/gem_helpers.rb +5 -2
  56. data/bundler/lib/bundler/graph.rb +9 -9
  57. data/bundler/lib/bundler/index.rb +1 -2
  58. data/bundler/lib/bundler/injector.rb +1 -1
  59. data/bundler/lib/bundler/inline.rb +3 -3
  60. data/bundler/lib/bundler/installer/gem_installer.rb +5 -5
  61. data/bundler/lib/bundler/installer/parallel_installer.rb +16 -8
  62. data/bundler/lib/bundler/installer/standalone.rb +2 -3
  63. data/bundler/lib/bundler/installer.rb +9 -9
  64. data/bundler/lib/bundler/lazy_specification.rb +24 -17
  65. data/bundler/lib/bundler/lockfile_generator.rb +9 -0
  66. data/bundler/lib/bundler/lockfile_parser.rb +81 -10
  67. data/bundler/lib/bundler/man/bundle-add.1 +3 -26
  68. data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
  69. data/bundler/lib/bundler/man/bundle-cache.1 +3 -24
  70. data/bundler/lib/bundler/man/bundle-check.1 +3 -12
  71. data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
  72. data/bundler/lib/bundler/man/bundle-config.1 +20 -211
  73. data/bundler/lib/bundler/man/bundle-config.1.ronn +6 -0
  74. data/bundler/lib/bundler/man/bundle-console.1 +4 -22
  75. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
  76. data/bundler/lib/bundler/man/bundle-exec.1 +12 -73
  77. data/bundler/lib/bundler/man/bundle-gem.1 +13 -49
  78. data/bundler/lib/bundler/man/bundle-help.1 +3 -7
  79. data/bundler/lib/bundler/man/bundle-info.1 +3 -9
  80. data/bundler/lib/bundler/man/bundle-init.1 +3 -12
  81. data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
  82. data/bundler/lib/bundler/man/bundle-install.1 +27 -125
  83. data/bundler/lib/bundler/man/bundle-install.1.ronn +1 -0
  84. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  85. data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
  86. data/bundler/lib/bundler/man/bundle-open.1 +7 -27
  87. data/bundler/lib/bundler/man/bundle-outdated.1 +3 -55
  88. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +1 -0
  89. data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
  90. data/bundler/lib/bundler/man/bundle-plugin.1 +3 -29
  91. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  92. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  93. data/bundler/lib/bundler/man/bundle-show.1 +3 -10
  94. data/bundler/lib/bundler/man/bundle-update.1 +18 -137
  95. data/bundler/lib/bundler/man/bundle-version.1 +3 -16
  96. data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
  97. data/bundler/lib/bundler/man/bundle.1 +5 -44
  98. data/bundler/lib/bundler/man/gemfile.5 +24 -301
  99. data/bundler/lib/bundler/man/gemfile.5.ronn +4 -0
  100. data/bundler/lib/bundler/match_metadata.rb +4 -0
  101. data/bundler/lib/bundler/match_platform.rb +1 -1
  102. data/bundler/lib/bundler/plugin/api/source.rb +3 -2
  103. data/bundler/lib/bundler/plugin/installer.rb +1 -1
  104. data/bundler/lib/bundler/plugin.rb +3 -3
  105. data/bundler/lib/bundler/resolver/base.rb +1 -1
  106. data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
  107. data/bundler/lib/bundler/resolver/spec_group.rb +1 -4
  108. data/bundler/lib/bundler/resolver.rb +16 -16
  109. data/bundler/lib/bundler/ruby_dsl.rb +20 -12
  110. data/bundler/lib/bundler/ruby_version.rb +1 -1
  111. data/bundler/lib/bundler/rubygems_ext.rb +24 -50
  112. data/bundler/lib/bundler/rubygems_gem_installer.rb +6 -56
  113. data/bundler/lib/bundler/rubygems_integration.rb +25 -94
  114. data/bundler/lib/bundler/runtime.rb +2 -2
  115. data/bundler/lib/bundler/self_manager.rb +23 -7
  116. data/bundler/lib/bundler/settings.rb +27 -7
  117. data/bundler/lib/bundler/setup.rb +4 -1
  118. data/bundler/lib/bundler/shared_helpers.rb +35 -13
  119. data/bundler/lib/bundler/source/git/git_proxy.rb +15 -15
  120. data/bundler/lib/bundler/source/git.rb +4 -3
  121. data/bundler/lib/bundler/source/metadata.rb +15 -15
  122. data/bundler/lib/bundler/source/path.rb +7 -6
  123. data/bundler/lib/bundler/source/rubygems.rb +21 -14
  124. data/bundler/lib/bundler/source.rb +2 -0
  125. data/bundler/lib/bundler/spec_set.rb +38 -10
  126. data/bundler/lib/bundler/stub_specification.rb +1 -0
  127. data/bundler/lib/bundler/templates/Executable.bundler +1 -1
  128. data/bundler/lib/bundler/templates/newgem/README.md.tt +3 -3
  129. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -6
  130. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  131. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  132. data/bundler/lib/bundler/ui/shell.rb +1 -1
  133. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  134. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  135. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  136. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +3 -3
  137. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +2 -2
  138. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  139. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +35 -35
  140. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  141. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  142. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  143. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  144. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  145. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  146. data/bundler/lib/bundler/vendored_persistent.rb +0 -4
  147. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  148. data/bundler/lib/bundler/version.rb +1 -1
  149. data/bundler/lib/bundler/vlad.rb +1 -1
  150. data/bundler/lib/bundler/yaml_serializer.rb +3 -3
  151. data/bundler/lib/bundler.rb +38 -27
  152. data/lib/rubygems/available_set.rb +4 -4
  153. data/lib/rubygems/basic_specification.rb +35 -37
  154. data/lib/rubygems/bundler_version_finder.rb +4 -4
  155. data/lib/rubygems/ci_detector.rb +75 -0
  156. data/lib/rubygems/command.rb +13 -15
  157. data/lib/rubygems/command_manager.rb +5 -4
  158. data/lib/rubygems/commands/build_command.rb +2 -2
  159. data/lib/rubygems/commands/cert_command.rb +1 -2
  160. data/lib/rubygems/commands/check_command.rb +4 -4
  161. data/lib/rubygems/commands/cleanup_command.rb +12 -14
  162. data/lib/rubygems/commands/contents_command.rb +4 -4
  163. data/lib/rubygems/commands/dependency_command.rb +4 -5
  164. data/lib/rubygems/commands/environment_command.rb +1 -3
  165. data/lib/rubygems/commands/exec_command.rb +1 -1
  166. data/lib/rubygems/commands/fetch_command.rb +2 -2
  167. data/lib/rubygems/commands/generate_index_command.rb +39 -74
  168. data/lib/rubygems/commands/help_command.rb +3 -3
  169. data/lib/rubygems/commands/info_command.rb +2 -2
  170. data/lib/rubygems/commands/install_command.rb +8 -16
  171. data/lib/rubygems/commands/list_command.rb +2 -2
  172. data/lib/rubygems/commands/lock_command.rb +1 -1
  173. data/lib/rubygems/commands/open_command.rb +1 -1
  174. data/lib/rubygems/commands/owner_command.rb +1 -1
  175. data/lib/rubygems/commands/pristine_command.rb +13 -15
  176. data/lib/rubygems/commands/push_command.rb +2 -2
  177. data/lib/rubygems/commands/query_command.rb +4 -5
  178. data/lib/rubygems/commands/rdoc_command.rb +2 -2
  179. data/lib/rubygems/commands/search_command.rb +2 -2
  180. data/lib/rubygems/commands/setup_command.rb +31 -34
  181. data/lib/rubygems/commands/sources_command.rb +12 -12
  182. data/lib/rubygems/commands/specification_command.rb +10 -10
  183. data/lib/rubygems/commands/stale_command.rb +1 -1
  184. data/lib/rubygems/commands/uninstall_command.rb +9 -10
  185. data/lib/rubygems/commands/unpack_command.rb +4 -4
  186. data/lib/rubygems/commands/update_command.rb +10 -12
  187. data/lib/rubygems/commands/which_command.rb +1 -1
  188. data/lib/rubygems/commands/yank_command.rb +1 -1
  189. data/lib/rubygems/compatibility.rb +5 -6
  190. data/lib/rubygems/config_file.rb +4 -4
  191. data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
  192. data/lib/rubygems/core_ext/kernel_require.rb +19 -48
  193. data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
  194. data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
  195. data/lib/rubygems/defaults.rb +15 -3
  196. data/lib/rubygems/dependency.rb +12 -14
  197. data/lib/rubygems/dependency_installer.rb +29 -30
  198. data/lib/rubygems/dependency_list.rb +1 -1
  199. data/lib/rubygems/deprecate.rb +16 -15
  200. data/lib/rubygems/doctor.rb +5 -5
  201. data/lib/rubygems/errors.rb +2 -6
  202. data/lib/rubygems/exceptions.rb +2 -1
  203. data/lib/rubygems/ext/builder.rb +15 -10
  204. data/lib/rubygems/ext/cargo_builder.rb +5 -5
  205. data/lib/rubygems/ext/ext_conf_builder.rb +1 -3
  206. data/lib/rubygems/gem_runner.rb +4 -4
  207. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
  208. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
  209. data/lib/rubygems/gemcutter_utilities.rb +18 -19
  210. data/lib/rubygems/install_update_options.rb +18 -19
  211. data/lib/rubygems/installer.rb +59 -33
  212. data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
  213. data/lib/rubygems/local_remote_options.rb +7 -10
  214. data/lib/rubygems/name_tuple.rb +7 -9
  215. data/lib/rubygems/net/http.rb +3 -0
  216. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  217. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  218. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  219. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  220. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  221. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  222. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  223. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  224. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  225. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  226. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  227. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  228. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  229. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  230. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  231. data/lib/rubygems/optparse/lib/optparse.rb +39 -17
  232. data/lib/rubygems/package/old.rb +2 -2
  233. data/lib/rubygems/package/tar_header.rb +45 -39
  234. data/lib/rubygems/package/tar_reader/entry.rb +5 -4
  235. data/lib/rubygems/package/tar_reader.rb +5 -3
  236. data/lib/rubygems/package/tar_writer.rb +19 -17
  237. data/lib/rubygems/package.rb +27 -26
  238. data/lib/rubygems/package_task.rb +2 -2
  239. data/lib/rubygems/path_support.rb +9 -10
  240. data/lib/rubygems/platform.rb +60 -45
  241. data/lib/rubygems/query_utils.rb +7 -9
  242. data/lib/rubygems/remote_fetcher.rb +15 -15
  243. data/lib/rubygems/request/connection_pools.rb +3 -3
  244. data/lib/rubygems/request.rb +20 -17
  245. data/lib/rubygems/request_set/gem_dependency_api.rb +119 -122
  246. data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
  247. data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
  248. data/lib/rubygems/request_set/lockfile.rb +6 -11
  249. data/lib/rubygems/request_set.rb +5 -5
  250. data/lib/rubygems/requirement.rb +7 -7
  251. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  252. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  253. data/lib/rubygems/resolver/activation_request.rb +1 -3
  254. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  255. data/lib/rubygems/resolver/best_set.rb +1 -1
  256. data/lib/rubygems/resolver/composed_set.rb +1 -1
  257. data/lib/rubygems/resolver/conflict.rb +4 -12
  258. data/lib/rubygems/resolver/index_set.rb +4 -4
  259. data/lib/rubygems/resolver/index_specification.rb +2 -2
  260. data/lib/rubygems/resolver/installer_set.rb +5 -6
  261. data/lib/rubygems/resolver/lock_set.rb +1 -1
  262. data/lib/rubygems/resolver.rb +3 -10
  263. data/lib/rubygems/s3_uri_signer.rb +6 -6
  264. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  265. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  266. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  267. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  268. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  269. data/lib/rubygems/safe_marshal.rb +74 -0
  270. data/lib/rubygems/safe_yaml.rb +5 -28
  271. data/lib/rubygems/security/policies.rb +36 -38
  272. data/lib/rubygems/security/policy.rb +7 -11
  273. data/lib/rubygems/security/signer.rb +1 -1
  274. data/lib/rubygems/security/trust_dir.rb +3 -3
  275. data/lib/rubygems/security.rb +8 -22
  276. data/lib/rubygems/source/git.rb +1 -3
  277. data/lib/rubygems/source/installed.rb +0 -2
  278. data/lib/rubygems/source/local.rb +5 -8
  279. data/lib/rubygems/source/lock.rb +1 -3
  280. data/lib/rubygems/source/specific_file.rb +0 -1
  281. data/lib/rubygems/source/vendor.rb +0 -2
  282. data/lib/rubygems/source.rb +12 -12
  283. data/lib/rubygems/source_list.rb +4 -4
  284. data/lib/rubygems/spec_fetcher.rb +29 -29
  285. data/lib/rubygems/specification.rb +125 -138
  286. data/lib/rubygems/specification_policy.rb +55 -25
  287. data/lib/rubygems/stub_specification.rb +4 -5
  288. data/lib/rubygems/text.rb +1 -2
  289. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  290. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  291. data/lib/rubygems/timeout.rb +3 -0
  292. data/lib/rubygems/tsort/lib/tsort.rb +3 -0
  293. data/lib/rubygems/uninstaller.rb +7 -9
  294. data/lib/rubygems/update_suggestion.rb +5 -18
  295. data/lib/rubygems/uri_formatter.rb +1 -1
  296. data/lib/rubygems/user_interaction.rb +15 -21
  297. data/lib/rubygems/util/licenses.rb +65 -35
  298. data/lib/rubygems/util/list.rb +3 -1
  299. data/lib/rubygems/util.rb +2 -4
  300. data/lib/rubygems/validator.rb +5 -3
  301. data/lib/rubygems/version.rb +34 -28
  302. data/lib/rubygems/version_option.rb +2 -5
  303. data/lib/rubygems/yaml_serializer.rb +3 -3
  304. data/lib/rubygems.rb +37 -37
  305. data/rubygems-update.gemspec +4 -4
  306. data/setup.rb +2 -2
  307. metadata +38 -225
  308. data/lib/rubygems/indexer.rb +0 -428
  309. data/lib/rubygems/mock_gem_ui.rb +0 -86
  310. data/test/rubygems/alternate_cert.pem +0 -19
  311. data/test/rubygems/alternate_cert_32.pem +0 -19
  312. data/test/rubygems/alternate_key.pem +0 -27
  313. data/test/rubygems/bad_rake.rb +0 -3
  314. data/test/rubygems/bundler_test_gem.rb +0 -424
  315. data/test/rubygems/ca_cert.pem +0 -77
  316. data/test/rubygems/child_cert.pem +0 -19
  317. data/test/rubygems/child_cert_32.pem +0 -19
  318. data/test/rubygems/child_key.pem +0 -27
  319. data/test/rubygems/client.pem +0 -107
  320. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  321. data/test/rubygems/data/gem-private_key.pem +0 -27
  322. data/test/rubygems/data/gem-public_cert.pem +0 -20
  323. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  324. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  325. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  326. data/test/rubygems/encrypted_private_key.pem +0 -30
  327. data/test/rubygems/expired_cert.pem +0 -19
  328. data/test/rubygems/fake_certlib/openssl.rb +0 -9
  329. data/test/rubygems/foo/discover.rb +0 -1
  330. data/test/rubygems/future_cert.pem +0 -19
  331. data/test/rubygems/future_cert_32.pem +0 -19
  332. data/test/rubygems/good_rake.rb +0 -3
  333. data/test/rubygems/grandchild_cert.pem +0 -19
  334. data/test/rubygems/grandchild_cert_32.pem +0 -19
  335. data/test/rubygems/grandchild_key.pem +0 -27
  336. data/test/rubygems/helper.rb +0 -1649
  337. data/test/rubygems/installer_test_case.rb +0 -248
  338. data/test/rubygems/invalid_client.pem +0 -49
  339. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  340. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  341. data/test/rubygems/invalid_key.pem +0 -27
  342. data/test/rubygems/invalid_signer_cert.pem +0 -19
  343. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  344. data/test/rubygems/invalidchild_cert.pem +0 -19
  345. data/test/rubygems/invalidchild_cert_32.pem +0 -19
  346. data/test/rubygems/invalidchild_key.pem +0 -27
  347. data/test/rubygems/multifactor_auth_utilities.rb +0 -111
  348. data/test/rubygems/package/tar_test_case.rb +0 -175
  349. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  350. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  351. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  352. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
  353. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
  354. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
  355. data/test/rubygems/private3072_key.pem +0 -40
  356. data/test/rubygems/private_ec_key.pem +0 -9
  357. data/test/rubygems/private_key.pem +0 -27
  358. data/test/rubygems/public3072_cert.pem +0 -25
  359. data/test/rubygems/public_cert.pem +0 -20
  360. data/test/rubygems/public_cert_32.pem +0 -19
  361. data/test/rubygems/public_key.pem +0 -9
  362. data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
  363. data/test/rubygems/rubygems_plugin.rb +0 -24
  364. data/test/rubygems/sff/discover.rb +0 -1
  365. data/test/rubygems/simple_gem.rb +0 -68
  366. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  367. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  368. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
  369. data/test/rubygems/ssl_cert.pem +0 -80
  370. data/test/rubygems/ssl_key.pem +0 -27
  371. data/test/rubygems/test_bundled_ca.rb +0 -61
  372. data/test/rubygems/test_config.rb +0 -28
  373. data/test/rubygems/test_deprecate.rb +0 -158
  374. data/test/rubygems/test_exit.rb +0 -17
  375. data/test/rubygems/test_gem.rb +0 -1799
  376. data/test/rubygems/test_gem_available_set.rb +0 -130
  377. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
  378. data/test/rubygems/test_gem_command.rb +0 -403
  379. data/test/rubygems/test_gem_command_manager.rb +0 -400
  380. data/test/rubygems/test_gem_commands_build_command.rb +0 -739
  381. data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
  382. data/test/rubygems/test_gem_commands_check_command.rb +0 -68
  383. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
  384. data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
  385. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
  386. data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
  387. data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
  388. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
  389. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
  390. data/test/rubygems/test_gem_commands_help_command.rb +0 -94
  391. data/test/rubygems/test_gem_commands_info_command.rb +0 -70
  392. data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
  393. data/test/rubygems/test_gem_commands_list_command.rb +0 -33
  394. data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
  395. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  396. data/test/rubygems/test_gem_commands_open_command.rb +0 -101
  397. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
  398. data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
  399. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
  400. data/test/rubygems/test_gem_commands_push_command.rb +0 -603
  401. data/test/rubygems/test_gem_commands_query_command.rb +0 -858
  402. data/test/rubygems/test_gem_commands_search_command.rb +0 -16
  403. data/test/rubygems/test_gem_commands_server_command.rb +0 -20
  404. data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
  405. data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
  406. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  407. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  408. data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
  409. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  410. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -542
  411. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
  412. data/test/rubygems/test_gem_commands_update_command.rb +0 -836
  413. data/test/rubygems/test_gem_commands_which_command.rb +0 -85
  414. data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
  415. data/test/rubygems/test_gem_config_file.rb +0 -551
  416. data/test/rubygems/test_gem_dependency.rb +0 -398
  417. data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
  418. data/test/rubygems/test_gem_dependency_list.rb +0 -265
  419. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
  420. data/test/rubygems/test_gem_doctor.rb +0 -195
  421. data/test/rubygems/test_gem_ext_builder.rb +0 -337
  422. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  423. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  424. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
  425. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
  426. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
  427. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
  428. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  429. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
  430. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  431. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
  432. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
  433. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
  434. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
  435. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
  436. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
  437. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
  438. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
  439. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
  440. data/test/rubygems/test_gem_gem_runner.rb +0 -119
  441. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
  442. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
  443. data/test/rubygems/test_gem_indexer.rb +0 -381
  444. data/test/rubygems/test_gem_install_update_options.rb +0 -208
  445. data/test/rubygems/test_gem_installer.rb +0 -2512
  446. data/test/rubygems/test_gem_local_remote_options.rb +0 -133
  447. data/test/rubygems/test_gem_name_tuple.rb +0 -43
  448. data/test/rubygems/test_gem_package.rb +0 -1306
  449. data/test/rubygems/test_gem_package_old.rb +0 -91
  450. data/test/rubygems/test_gem_package_tar_header.rb +0 -226
  451. data/test/rubygems/test_gem_package_tar_reader.rb +0 -150
  452. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
  453. data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
  454. data/test/rubygems/test_gem_package_task.rb +0 -118
  455. data/test/rubygems/test_gem_path_support.rb +0 -139
  456. data/test/rubygems/test_gem_platform.rb +0 -497
  457. data/test/rubygems/test_gem_rdoc.rb +0 -137
  458. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
  459. data/test/rubygems/test_gem_request.rb +0 -547
  460. data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
  461. data/test/rubygems/test_gem_request_set.rb +0 -672
  462. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
  463. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
  464. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
  465. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
  466. data/test/rubygems/test_gem_requirement.rb +0 -505
  467. data/test/rubygems/test_gem_resolver.rb +0 -859
  468. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
  469. data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
  470. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
  471. data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
  472. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
  473. data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
  474. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
  475. data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
  476. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  477. data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
  478. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
  479. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
  480. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
  481. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
  482. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
  483. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
  484. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
  485. data/test/rubygems/test_gem_resolver_specification.rb +0 -63
  486. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
  487. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
  488. data/test/rubygems/test_gem_security.rb +0 -341
  489. data/test/rubygems/test_gem_security_policy.rb +0 -535
  490. data/test/rubygems/test_gem_security_signer.rb +0 -218
  491. data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
  492. data/test/rubygems/test_gem_silent_ui.rb +0 -123
  493. data/test/rubygems/test_gem_source.rb +0 -254
  494. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
  495. data/test/rubygems/test_gem_source_git.rb +0 -310
  496. data/test/rubygems/test_gem_source_installed.rb +0 -35
  497. data/test/rubygems/test_gem_source_list.rb +0 -119
  498. data/test/rubygems/test_gem_source_local.rb +0 -107
  499. data/test/rubygems/test_gem_source_lock.rb +0 -113
  500. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  501. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
  502. data/test/rubygems/test_gem_source_vendor.rb +0 -30
  503. data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
  504. data/test/rubygems/test_gem_specification.rb +0 -3856
  505. data/test/rubygems/test_gem_stream_ui.rb +0 -255
  506. data/test/rubygems/test_gem_stub_specification.rb +0 -278
  507. data/test/rubygems/test_gem_text.rb +0 -103
  508. data/test/rubygems/test_gem_uninstaller.rb +0 -675
  509. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
  510. data/test/rubygems/test_gem_update_suggestion.rb +0 -209
  511. data/test/rubygems/test_gem_uri.rb +0 -41
  512. data/test/rubygems/test_gem_uri_formatter.rb +0 -27
  513. data/test/rubygems/test_gem_util.rb +0 -91
  514. data/test/rubygems/test_gem_validator.rb +0 -42
  515. data/test/rubygems/test_gem_version.rb +0 -305
  516. data/test/rubygems/test_gem_version_option.rb +0 -165
  517. data/test/rubygems/test_kernel.rb +0 -124
  518. data/test/rubygems/test_project_sanity.rb +0 -49
  519. data/test/rubygems/test_remote_fetch_error.rb +0 -20
  520. data/test/rubygems/test_require.rb +0 -732
  521. data/test/rubygems/test_rubygems.rb +0 -76
  522. data/test/rubygems/test_webauthn_listener.rb +0 -143
  523. data/test/rubygems/test_webauthn_listener_response.rb +0 -93
  524. data/test/rubygems/test_webauthn_poller.rb +0 -124
  525. data/test/rubygems/utilities.rb +0 -436
  526. data/test/rubygems/wrong_key_cert.pem +0 -19
  527. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  528. data/test/test_changelog_generator.rb +0 -17
@@ -1,866 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require "rubygems/commands/cert_command"
5
-
6
- unless Gem::HAVE_OPENSSL
7
- warn "Skipping `gem cert` tests. openssl not found."
8
- end
9
-
10
- if Gem.java_platform?
11
- warn "Skipping `gem cert` tests on jruby."
12
- end
13
-
14
- class TestGemCommandsCertCommand < Gem::TestCase
15
- ALTERNATE_CERT = load_cert "alternate"
16
- EXPIRED_PUBLIC_CERT = load_cert "expired"
17
-
18
- ALTERNATE_KEY_FILE = key_path "alternate"
19
- PRIVATE_KEY_FILE = key_path "private"
20
- PRIVATE_EC_KEY_FILE = key_path "private_ec"
21
- PUBLIC_KEY_FILE = key_path "public"
22
-
23
- ALTERNATE_CERT_FILE = cert_path "alternate"
24
- CHILD_CERT_FILE = cert_path "child"
25
- PUBLIC_CERT_FILE = cert_path "public"
26
- EXPIRED_PUBLIC_CERT_FILE = cert_path "expired"
27
-
28
- def setup
29
- super
30
-
31
- @cmd = Gem::Commands::CertCommand.new
32
-
33
- @trust_dir = Gem::Security.trust_dir
34
-
35
- @cleanup = []
36
- end
37
-
38
- def teardown
39
- FileUtils.rm_f(@cleanup)
40
-
41
- super
42
- end
43
-
44
- def test_certificates_matching
45
- @trust_dir.trust_cert PUBLIC_CERT
46
- @trust_dir.trust_cert ALTERNATE_CERT
47
-
48
- matches = @cmd.certificates_matching ""
49
-
50
- # HACK: OpenSSL::X509::Certificate#== is Object#==, so do this the hard way
51
- match = matches.next
52
- assert_equal ALTERNATE_CERT.to_pem, match.first.to_pem
53
- assert_equal @trust_dir.cert_path(ALTERNATE_CERT), match.last
54
-
55
- match = matches.next
56
- assert_equal PUBLIC_CERT.to_pem, match.first.to_pem
57
- assert_equal @trust_dir.cert_path(PUBLIC_CERT), match.last
58
-
59
- assert_raise StopIteration do
60
- matches.next
61
- end
62
- end
63
-
64
- def test_certificates_matching_filter
65
- @trust_dir.trust_cert PUBLIC_CERT
66
- @trust_dir.trust_cert ALTERNATE_CERT
67
-
68
- matches = @cmd.certificates_matching "alternate"
69
-
70
- match = matches.next
71
- assert_equal ALTERNATE_CERT.to_pem, match.first.to_pem
72
- assert_equal @trust_dir.cert_path(ALTERNATE_CERT), match.last
73
-
74
- assert_raise StopIteration do
75
- matches.next
76
- end
77
- end
78
-
79
- def test_execute_add
80
- @cmd.handle_options %W[--add #{PUBLIC_CERT_FILE}]
81
-
82
- use_ui @ui do
83
- @cmd.execute
84
- end
85
-
86
- cert_path = @trust_dir.cert_path PUBLIC_CERT
87
-
88
- assert_path_exist cert_path
89
-
90
- assert_equal "Added '/CN=nobody/DC=example'\n", @ui.output
91
- assert_empty @ui.error
92
- end
93
-
94
- def test_execute_add_twice
95
- self.class.cert_path "alternate"
96
-
97
- @cmd.handle_options %W[
98
- --add #{PUBLIC_CERT_FILE}
99
- --add #{ALTERNATE_CERT_FILE}
100
- ]
101
-
102
- use_ui @ui do
103
- @cmd.execute
104
- end
105
-
106
- expected = <<-EXPECTED
107
- Added '/CN=nobody/DC=example'
108
- Added '/CN=alternate/DC=example'
109
- EXPECTED
110
-
111
- assert_equal expected, @ui.output
112
- assert_empty @ui.error
113
- end
114
-
115
- def test_execute_build
116
- passphrase = "Foo bar"
117
-
118
- @cmd.handle_options %W[--build nobody@example.com]
119
-
120
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
121
-
122
- use_ui @build_ui do
123
- @cmd.execute
124
- end
125
-
126
- output = @build_ui.output.squeeze("\n").split "\n"
127
-
128
- assert_equal "Passphrase for your Private Key: ",
129
- output.shift
130
- assert_equal "Please repeat the passphrase for your Private Key: ",
131
- output.shift
132
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
133
- output.shift
134
- assert_equal "Private Key: #{File.join @tempdir, "gem-private_key.pem"}",
135
- output.shift
136
-
137
- assert_equal "Don't forget to move the key file to somewhere private!",
138
- output.shift
139
-
140
- assert_empty output
141
- assert_empty @build_ui.error
142
-
143
- assert_path_exist File.join(@tempdir, "gem-private_key.pem")
144
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
145
- end
146
-
147
- def test_execute_build_key_algorithm_ec_key
148
- passphrase = "Foo bar"
149
-
150
- @cmd.handle_options %W[--build nobody@example.com --key-algorithm ec]
151
-
152
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
153
-
154
- use_ui @build_ui do
155
- @cmd.execute
156
- end
157
-
158
- output = @build_ui.output.squeeze("\n").split "\n"
159
-
160
- assert_equal "Passphrase for your Private Key: ",
161
- output.shift
162
- assert_equal "Please repeat the passphrase for your Private Key: ",
163
- output.shift
164
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
165
- output.shift
166
- assert_equal "Private Key: #{File.join @tempdir, "gem-private_key.pem"}",
167
- output.shift
168
-
169
- assert_equal "Don't forget to move the key file to somewhere private!",
170
- output.shift
171
-
172
- assert_empty output
173
- assert_empty @build_ui.error
174
-
175
- assert_path_exist File.join(@tempdir, "gem-private_key.pem")
176
-
177
- cert_path = File.join(@tempdir, "gem-public_cert.pem")
178
- assert_path_exist cert_path
179
- cert = OpenSSL::X509::Certificate.new(File.read(cert_path))
180
- assert cert.public_key.is_a? OpenSSL::PKey::EC
181
- end
182
-
183
- def test_execute_build_bad_email_address
184
- passphrase = "Foo bar"
185
- email = "nobody@"
186
-
187
- @cmd.handle_options %W[--build #{email}]
188
-
189
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
190
-
191
- use_ui @build_ui do
192
- e = assert_raise Gem::CommandLineError do
193
- @cmd.execute
194
- end
195
-
196
- assert_equal "Invalid email address #{email}",
197
- e.message
198
-
199
- assert_path_not_exist File.join(@tempdir, "gem-private_key.pem")
200
- assert_path_not_exist File.join(@tempdir, "gem-public_cert.pem")
201
- end
202
- end
203
-
204
- def test_execute_build_expiration_days
205
- passphrase = "Foo bar"
206
-
207
- @cmd.handle_options %W[
208
- --build nobody@example.com
209
- --days 26
210
- ]
211
-
212
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
213
-
214
- use_ui @build_ui do
215
- @cmd.execute
216
- end
217
-
218
- output = @build_ui.output.squeeze("\n").split "\n"
219
-
220
- assert_equal "Passphrase for your Private Key: ",
221
- output.shift
222
- assert_equal "Please repeat the passphrase for your Private Key: ",
223
- output.shift
224
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
225
- output.shift
226
- assert_equal "Private Key: #{File.join @tempdir, "gem-private_key.pem"}",
227
- output.shift
228
-
229
- assert_equal "Don't forget to move the key file to somewhere private!",
230
- output.shift
231
-
232
- assert_empty output
233
- assert_empty @build_ui.error
234
-
235
- assert_path_exist File.join(@tempdir, "gem-private_key.pem")
236
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
237
-
238
- pem = File.read("#{@tempdir}/gem-public_cert.pem")
239
- cert = OpenSSL::X509::Certificate.new(pem)
240
-
241
- test = (cert.not_after - cert.not_before).to_i / (24 * 60 * 60)
242
- assert_equal(test, 26)
243
- end
244
-
245
- def test_execute_build_bad_passphrase_confirmation
246
- passphrase = "Foo bar"
247
- passphrase_confirmation = "Fu bar"
248
-
249
- @cmd.handle_options %W[--build nobody@example.com]
250
-
251
- @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase_confirmation}"
252
-
253
- use_ui @build_ui do
254
- e = assert_raise Gem::CommandLineError do
255
- @cmd.execute
256
- end
257
-
258
- output = @build_ui.output.squeeze("\n").split "\n"
259
-
260
- assert_equal "Passphrase for your Private Key: ",
261
- output.shift
262
- assert_equal "Please repeat the passphrase for your Private Key: ",
263
- output.shift
264
-
265
- assert_empty output
266
-
267
- assert_equal "Passphrase and passphrase confirmation don't match",
268
- e.message
269
- end
270
-
271
- assert_path_not_exist File.join(@tempdir, "gem-private_key.pem")
272
- assert_path_not_exist File.join(@tempdir, "gem-public_cert.pem")
273
- end
274
-
275
- def test_execute_build_key
276
- @cmd.handle_options %W[
277
- --build nobody@example.com
278
- --private-key #{PRIVATE_KEY_FILE}
279
- ]
280
-
281
- use_ui @ui do
282
- @cmd.execute
283
- end
284
-
285
- output = @ui.output.split "\n"
286
-
287
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
288
- output.shift
289
-
290
- assert_empty output
291
- assert_empty @ui.error
292
-
293
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
294
- assert_path_not_exist File.join(@tempdir, "gem-private_key.pem")
295
- end
296
-
297
- def test_execute_build_encrypted_key
298
- @cmd.handle_options %W[
299
- --build nobody@example.com
300
- --private-key #{ENCRYPTED_PRIVATE_KEY_PATH}
301
- ]
302
-
303
- use_ui @ui do
304
- @cmd.execute
305
- end
306
-
307
- output = @ui.output.split "\n"
308
-
309
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
310
- output.shift
311
-
312
- assert_empty output
313
- assert_empty @ui.error
314
-
315
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
316
- end
317
-
318
- def test_execute_build_ec_key
319
- @cmd.handle_options %W[
320
- --build nobody@example.com
321
- --private-key #{PRIVATE_EC_KEY_FILE}
322
- ]
323
-
324
- use_ui @ui do
325
- @cmd.execute
326
- end
327
-
328
- output = @ui.output.split "\n"
329
-
330
- assert_equal "Certificate: #{File.join @tempdir, "gem-public_cert.pem"}",
331
- output.shift
332
-
333
- assert_empty output
334
- assert_empty @ui.error
335
-
336
- assert_path_exist File.join(@tempdir, "gem-public_cert.pem")
337
- assert_path_not_exist File.join(@tempdir, "gem-private_key.pem")
338
- end
339
-
340
- def test_execute_certificate
341
- use_ui @ui do
342
- @cmd.handle_options %W[--certificate #{PUBLIC_CERT_FILE}]
343
- end
344
-
345
- assert_equal "", @ui.output
346
- assert_equal "", @ui.error
347
-
348
- assert_equal PUBLIC_CERT.to_pem, @cmd.options[:issuer_cert].to_pem
349
- end
350
-
351
- def test_execute_list
352
- @trust_dir.trust_cert PUBLIC_CERT
353
- @trust_dir.trust_cert ALTERNATE_CERT
354
-
355
- @cmd.handle_options %W[--list]
356
-
357
- use_ui @ui do
358
- @cmd.execute
359
- end
360
-
361
- assert_equal "/CN=alternate/DC=example\n/CN=nobody/DC=example\n",
362
- @ui.output
363
- assert_empty @ui.error
364
- end
365
-
366
- def test_execute_list_filter
367
- @trust_dir.trust_cert PUBLIC_CERT
368
- @trust_dir.trust_cert ALTERNATE_CERT
369
-
370
- @cmd.handle_options %W[--list nobody]
371
-
372
- use_ui @ui do
373
- @cmd.execute
374
- end
375
-
376
- assert_equal "/CN=nobody/DC=example\n", @ui.output
377
- assert_empty @ui.error
378
- end
379
-
380
- def test_execute_private_key
381
- use_ui @ui do
382
- @cmd.send :handle_options, %W[--private-key #{PRIVATE_KEY_FILE}]
383
- end
384
-
385
- assert_equal "", @ui.output
386
- assert_equal "", @ui.error
387
-
388
- assert_equal PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem
389
- end
390
-
391
- def test_execute_encrypted_private_key
392
- use_ui @ui do
393
- @cmd.send :handle_options, %W[--private-key #{ENCRYPTED_PRIVATE_KEY_PATH}]
394
- end
395
-
396
- assert_equal "", @ui.output
397
- assert_equal "", @ui.error
398
-
399
- assert_equal ENCRYPTED_PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem
400
- end
401
-
402
- def test_execute_remove
403
- @trust_dir.trust_cert PUBLIC_CERT
404
-
405
- cert_path = @trust_dir.cert_path PUBLIC_CERT
406
-
407
- assert_path_exist cert_path
408
-
409
- @cmd.handle_options %W[--remove nobody]
410
-
411
- use_ui @ui do
412
- @cmd.execute
413
- end
414
-
415
- assert_equal "Removed '/CN=nobody/DC=example'\n", @ui.output
416
- assert_equal "", @ui.error
417
-
418
- assert_path_not_exist cert_path
419
- end
420
-
421
- def test_execute_remove_multiple
422
- @trust_dir.trust_cert PUBLIC_CERT
423
- @trust_dir.trust_cert ALTERNATE_CERT
424
-
425
- public_path = @trust_dir.cert_path PUBLIC_CERT
426
- alternate_path = @trust_dir.cert_path ALTERNATE_CERT
427
-
428
- assert_path_exist public_path
429
- assert_path_exist alternate_path
430
-
431
- @cmd.handle_options %W[--remove example]
432
-
433
- use_ui @ui do
434
- @cmd.execute
435
- end
436
-
437
- expected = <<-EXPECTED
438
- Removed '/CN=alternate/DC=example'
439
- Removed '/CN=nobody/DC=example'
440
- EXPECTED
441
-
442
- assert_equal expected, @ui.output
443
- assert_equal "", @ui.error
444
-
445
- assert_path_not_exist public_path
446
- assert_path_not_exist alternate_path
447
- end
448
-
449
- def test_execute_remove_twice
450
- @trust_dir.trust_cert PUBLIC_CERT
451
- @trust_dir.trust_cert ALTERNATE_CERT
452
-
453
- public_path = @trust_dir.cert_path PUBLIC_CERT
454
- alternate_path = @trust_dir.cert_path ALTERNATE_CERT
455
-
456
- assert_path_exist public_path
457
- assert_path_exist alternate_path
458
-
459
- @cmd.handle_options %W[--remove nobody --remove alternate]
460
-
461
- use_ui @ui do
462
- @cmd.execute
463
- end
464
-
465
- expected = <<-EXPECTED
466
- Removed '/CN=nobody/DC=example'
467
- Removed '/CN=alternate/DC=example'
468
- EXPECTED
469
-
470
- assert_equal expected, @ui.output
471
- assert_equal "", @ui.error
472
-
473
- assert_path_not_exist public_path
474
- assert_path_not_exist alternate_path
475
- end
476
-
477
- def test_execute_sign
478
- path = File.join @tempdir, "cert.pem"
479
- Gem::Security.write ALTERNATE_CERT, path, 0o600
480
-
481
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
482
-
483
- @cmd.handle_options %W[
484
- --private-key #{PRIVATE_KEY_FILE}
485
- --certificate #{PUBLIC_CERT_FILE}
486
-
487
- --sign #{path}
488
- ]
489
-
490
- use_ui @ui do
491
- @cmd.execute
492
- end
493
-
494
- assert_equal "", @ui.output
495
- assert_equal "", @ui.error
496
-
497
- cert = OpenSSL::X509::Certificate.new File.read path
498
-
499
- assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
500
-
501
- mask = 0o100600 & (~File.umask)
502
-
503
- assert_equal mask, File.stat(path).mode unless win_platform?
504
- end
505
-
506
- def test_execute_sign_encrypted_key
507
- path = File.join @tempdir, "cert.pem"
508
- Gem::Security.write ALTERNATE_CERT, path, 0o600
509
-
510
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
511
-
512
- @cmd.handle_options %W[
513
- --private-key #{ENCRYPTED_PRIVATE_KEY_PATH}
514
- --certificate #{PUBLIC_CERT_FILE}
515
-
516
- --sign #{path}
517
- ]
518
-
519
- use_ui @ui do
520
- @cmd.execute
521
- end
522
-
523
- assert_equal "", @ui.output
524
- assert_equal "", @ui.error
525
-
526
- cert = OpenSSL::X509::Certificate.new File.read path
527
-
528
- assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
529
-
530
- mask = 0o100600 & (~File.umask)
531
-
532
- assert_equal mask, File.stat(path).mode unless win_platform?
533
- end
534
-
535
- def test_execute_sign_default
536
- FileUtils.mkdir_p File.join Gem.user_home, ".gem"
537
-
538
- private_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem"
539
- Gem::Security.write PRIVATE_KEY, private_key_path
540
-
541
- public_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"
542
- Gem::Security.write PUBLIC_CERT, public_cert_path
543
-
544
- path = File.join @tempdir, "cert.pem"
545
- Gem::Security.write ALTERNATE_CERT, path, 0o600
546
-
547
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
548
-
549
- @cmd.handle_options %W[--sign #{path}]
550
-
551
- use_ui @ui do
552
- @cmd.execute
553
- end
554
-
555
- assert_equal "", @ui.output
556
- assert_equal "", @ui.error
557
-
558
- cert = OpenSSL::X509::Certificate.new File.read path
559
-
560
- assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
561
-
562
- mask = 0o100600 & (~File.umask)
563
-
564
- assert_equal mask, File.stat(path).mode unless win_platform?
565
- end
566
-
567
- def test_execute_sign_default_encrypted_key
568
- FileUtils.mkdir_p File.join(Gem.user_home, ".gem")
569
-
570
- private_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem"
571
- Gem::Security.write ENCRYPTED_PRIVATE_KEY, private_key_path, 0o600, PRIVATE_KEY_PASSPHRASE
572
-
573
- public_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"
574
- Gem::Security.write PUBLIC_CERT, public_cert_path
575
-
576
- path = File.join @tempdir, "cert.pem"
577
- Gem::Security.write ALTERNATE_CERT, path, 0o600
578
-
579
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
580
-
581
- @cmd.handle_options %W[--sign #{path}]
582
-
583
- use_ui @ui do
584
- @cmd.execute
585
- end
586
-
587
- assert_equal "", @ui.output
588
- assert_equal "", @ui.error
589
-
590
- cert = OpenSSL::X509::Certificate.new File.read path
591
-
592
- assert_equal "/CN=nobody/DC=example", cert.issuer.to_s
593
-
594
- mask = 0o100600 & (~File.umask)
595
-
596
- assert_equal mask, File.stat(path).mode unless win_platform?
597
- end
598
-
599
- def test_execute_sign_no_cert
600
- FileUtils.mkdir_p File.join Gem.user_home, ".gem"
601
-
602
- private_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem"
603
- Gem::Security.write PRIVATE_KEY, private_key_path
604
-
605
- path = File.join @tempdir, "cert.pem"
606
- Gem::Security.write ALTERNATE_CERT, path, 0o600
607
-
608
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
609
-
610
- @cmd.handle_options %W[--sign #{path}]
611
-
612
- use_ui @ui do
613
- assert_raise Gem::MockGemUi::TermError do
614
- @cmd.execute
615
- end
616
- end
617
-
618
- assert_equal "", @ui.output
619
-
620
- expected = <<-EXPECTED
621
- ERROR: --certificate not specified and ~/.gem/gem-public_cert.pem does not exist
622
- EXPECTED
623
-
624
- assert_equal expected, @ui.error
625
- end
626
-
627
- def test_execute_sign_no_key
628
- FileUtils.mkdir_p File.join Gem.user_home, ".gem"
629
-
630
- public_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"
631
- Gem::Security.write PUBLIC_CERT, public_cert_path
632
-
633
- path = File.join @tempdir, "cert.pem"
634
- Gem::Security.write ALTERNATE_CERT, path, 0o600
635
-
636
- assert_equal "/CN=alternate/DC=example", ALTERNATE_CERT.issuer.to_s
637
-
638
- @cmd.handle_options %W[--sign #{path}]
639
-
640
- use_ui @ui do
641
- assert_raise Gem::MockGemUi::TermError do
642
- @cmd.execute
643
- end
644
- end
645
-
646
- assert_equal "", @ui.output
647
-
648
- expected = <<-EXPECTED
649
- ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exist
650
- EXPECTED
651
-
652
- assert_equal expected, @ui.error
653
- end
654
-
655
- def test_execute_re_sign
656
- gem_path = File.join Gem.user_home, ".gem"
657
- Dir.mkdir gem_path
658
-
659
- path = File.join @tempdir, "cert.pem"
660
- Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0o600
661
-
662
- assert_equal "/CN=nobody/DC=example", EXPIRED_PUBLIC_CERT.issuer.to_s
663
-
664
- tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE))
665
- @cleanup << tmp_expired_cert_file
666
- File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE))
667
-
668
- @cmd.handle_options %W[
669
- --private-key #{PRIVATE_KEY_FILE}
670
- --certificate #{tmp_expired_cert_file}
671
- --re-sign
672
- ]
673
-
674
- use_ui @ui do
675
- @cmd.execute
676
- end
677
-
678
- expected_path = File.join(gem_path, "#{File.basename(tmp_expired_cert_file)}.expired")
679
-
680
- assert_match(
681
- /INFO: Your certificate #{tmp_expired_cert_file} has been re-signed\nINFO: Your expired certificate will be located at: #{expected_path}\.[0-9]+/,
682
- @ui.output
683
- )
684
- assert_equal "", @ui.error
685
- end
686
-
687
- def test_execute_re_sign_with_cert_expiration_length_days
688
- gem_path = File.join Gem.user_home, ".gem"
689
- Dir.mkdir gem_path
690
-
691
- path = File.join @tempdir, "cert.pem"
692
- Gem::Security.write EXPIRED_PUBLIC_CERT, path, 0o600
693
-
694
- assert_equal "/CN=nobody/DC=example", EXPIRED_PUBLIC_CERT.issuer.to_s
695
-
696
- tmp_expired_cert_file = File.join(Dir.tmpdir, File.basename(EXPIRED_PUBLIC_CERT_FILE))
697
- @cleanup << tmp_expired_cert_file
698
- File.write(tmp_expired_cert_file, File.read(EXPIRED_PUBLIC_CERT_FILE))
699
-
700
- @cmd.handle_options %W[
701
- --private-key #{PRIVATE_KEY_FILE}
702
- --certificate #{tmp_expired_cert_file}
703
- --re-sign
704
- ]
705
-
706
- Gem.configuration.cert_expiration_length_days = 28
707
-
708
- use_ui @ui do
709
- @cmd.execute
710
- end
711
-
712
- re_signed_cert = OpenSSL::X509::Certificate.new(File.read(tmp_expired_cert_file))
713
- cert_days_to_expire = (re_signed_cert.not_after - re_signed_cert.not_before).to_i / (24 * 60 * 60)
714
-
715
- assert_equal(28, cert_days_to_expire)
716
- assert_equal "", @ui.error
717
- end
718
-
719
- def test_handle_options
720
- @cmd.handle_options %W[
721
- --add #{PUBLIC_CERT_FILE}
722
- --add #{ALTERNATE_CERT_FILE}
723
-
724
- --remove nobody
725
- --remove example
726
-
727
- --list
728
- --list example
729
-
730
- --build nobody@example
731
- --build other@example
732
- ]
733
-
734
- assert_equal [PUBLIC_CERT.to_pem, ALTERNATE_CERT.to_pem],
735
- @cmd.options[:add].map {|cert| cert.to_pem }
736
-
737
- assert_equal %w[nobody example], @cmd.options[:remove]
738
-
739
- assert_equal %w[nobody@example other@example],
740
- @cmd.options[:build].map {|name| name.to_s }
741
-
742
- assert_equal ["", "example"], @cmd.options[:list]
743
- end
744
-
745
- def test_handle_options_add_bad
746
- nonexistent = File.join @tempdir, "nonexistent"
747
- e = assert_raise Gem::OptionParser::InvalidArgument do
748
- @cmd.handle_options %W[--add #{nonexistent}]
749
- end
750
-
751
- assert_equal "invalid argument: --add #{nonexistent}: does not exist",
752
- e.message
753
-
754
- bad = File.join @tempdir, "bad"
755
- FileUtils.touch bad
756
-
757
- e = assert_raise Gem::OptionParser::InvalidArgument do
758
- @cmd.handle_options %W[--add #{bad}]
759
- end
760
-
761
- assert_equal "invalid argument: --add #{bad}: invalid X509 certificate",
762
- e.message
763
- end
764
-
765
- def test_handle_options_certificate
766
- nonexistent = File.join @tempdir, "nonexistent"
767
- e = assert_raise Gem::OptionParser::InvalidArgument do
768
- @cmd.handle_options %W[--certificate #{nonexistent}]
769
- end
770
-
771
- assert_equal "invalid argument: --certificate #{nonexistent}: does not exist",
772
- e.message
773
-
774
- bad = File.join @tempdir, "bad"
775
- FileUtils.touch bad
776
-
777
- e = assert_raise Gem::OptionParser::InvalidArgument do
778
- @cmd.handle_options %W[--certificate #{bad}]
779
- end
780
-
781
- assert_equal "invalid argument: " +
782
- "--certificate #{bad}: invalid X509 certificate",
783
- e.message
784
- end
785
-
786
- def test_handle_options_key_bad
787
- nonexistent = File.join @tempdir, "nonexistent"
788
- e = assert_raise Gem::OptionParser::InvalidArgument do
789
- @cmd.handle_options %W[--private-key #{nonexistent}]
790
- end
791
-
792
- assert_equal "invalid argument: " +
793
- "--private-key #{nonexistent}: does not exist",
794
- e.message
795
-
796
- bad = File.join @tempdir, "bad"
797
- FileUtils.touch bad
798
-
799
- e = assert_raise Gem::OptionParser::InvalidArgument do
800
- @cmd.handle_options %W[--private-key #{bad}]
801
- end
802
-
803
- assert_equal "invalid argument: --private-key #{bad}: invalid RSA, DSA, or EC key",
804
- e.message
805
-
806
- e = assert_raise Gem::OptionParser::InvalidArgument do
807
- @cmd.handle_options %W[--private-key #{PUBLIC_KEY_FILE}]
808
- end
809
-
810
- assert_equal "invalid argument: " +
811
- "--private-key #{PUBLIC_KEY_FILE}: private key not found",
812
- e.message
813
- end
814
-
815
- def test_handle_options_sign
816
- @cmd.handle_options %W[
817
- --private-key #{ALTERNATE_KEY_FILE}
818
- --private-key #{PRIVATE_KEY_FILE}
819
-
820
- --certificate #{ALTERNATE_CERT_FILE}
821
- --certificate #{PUBLIC_CERT_FILE}
822
-
823
- --sign #{ALTERNATE_CERT_FILE}
824
- --sign #{CHILD_CERT_FILE}
825
- ]
826
-
827
- assert_equal PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem
828
- assert_equal PUBLIC_CERT.to_pem, @cmd.options[:issuer_cert].to_pem
829
-
830
- assert_equal [ALTERNATE_CERT_FILE, CHILD_CERT_FILE], @cmd.options[:sign]
831
- end
832
-
833
- def test_handle_options_sign_encrypted_key
834
- @cmd.handle_options %W[
835
- --private-key #{ALTERNATE_KEY_FILE}
836
- --private-key #{ENCRYPTED_PRIVATE_KEY_PATH}
837
-
838
- --certificate #{ALTERNATE_CERT_FILE}
839
- --certificate #{PUBLIC_CERT_FILE}
840
-
841
- --sign #{ALTERNATE_CERT_FILE}
842
- --sign #{CHILD_CERT_FILE}
843
- ]
844
-
845
- assert_equal ENCRYPTED_PRIVATE_KEY.to_pem, @cmd.options[:key].to_pem
846
- assert_equal PUBLIC_CERT.to_pem, @cmd.options[:issuer_cert].to_pem
847
-
848
- assert_equal [ALTERNATE_CERT_FILE, CHILD_CERT_FILE], @cmd.options[:sign]
849
- end
850
-
851
- def test_handle_options_sign_nonexistent
852
- nonexistent = File.join @tempdir, "nonexistent"
853
- e = assert_raise Gem::OptionParser::InvalidArgument do
854
- @cmd.handle_options %W[
855
- --private-key #{ALTERNATE_KEY_FILE}
856
-
857
- --certificate #{ALTERNATE_CERT_FILE}
858
-
859
- --sign #{nonexistent}
860
- ]
861
- end
862
-
863
- assert_equal "invalid argument: --sign #{nonexistent}: does not exist",
864
- e.message
865
- end
866
- end if Gem::HAVE_OPENSSL && !Gem.java_platform?