rubygems-update 3.4.22 → 3.5.1

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 (540) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +105 -2
  3. data/Manifest.txt +46 -221
  4. data/README.md +1 -3
  5. data/bundler/CHANGELOG.md +63 -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 +254 -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 +46 -30
  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/.document +1 -0
  134. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  135. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  136. data/bundler/lib/bundler/vendor/fileutils/.document +1 -0
  137. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  138. data/bundler/lib/bundler/vendor/net-http-persistent/.document +1 -0
  139. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +3 -3
  140. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +2 -2
  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 +34 -34
  143. data/bundler/lib/bundler/vendor/pub_grub/.document +1 -0
  144. data/bundler/lib/bundler/vendor/thor/.document +1 -0
  145. data/bundler/lib/bundler/vendor/tsort/.document +1 -0
  146. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  147. data/bundler/lib/bundler/vendor/uri/.document +1 -0
  148. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  149. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  150. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  151. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  152. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  153. data/bundler/lib/bundler/vendored_persistent.rb +0 -4
  154. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  155. data/bundler/lib/bundler/version.rb +1 -1
  156. data/bundler/lib/bundler/vlad.rb +1 -1
  157. data/bundler/lib/bundler/yaml_serializer.rb +3 -3
  158. data/bundler/lib/bundler.rb +41 -32
  159. data/lib/rubygems/available_set.rb +4 -4
  160. data/lib/rubygems/basic_specification.rb +35 -37
  161. data/lib/rubygems/bundler_version_finder.rb +4 -4
  162. data/lib/rubygems/ci_detector.rb +75 -0
  163. data/lib/rubygems/command.rb +13 -15
  164. data/lib/rubygems/command_manager.rb +5 -4
  165. data/lib/rubygems/commands/build_command.rb +2 -2
  166. data/lib/rubygems/commands/cert_command.rb +1 -2
  167. data/lib/rubygems/commands/check_command.rb +4 -4
  168. data/lib/rubygems/commands/cleanup_command.rb +12 -14
  169. data/lib/rubygems/commands/contents_command.rb +4 -4
  170. data/lib/rubygems/commands/dependency_command.rb +4 -5
  171. data/lib/rubygems/commands/environment_command.rb +1 -3
  172. data/lib/rubygems/commands/exec_command.rb +1 -1
  173. data/lib/rubygems/commands/fetch_command.rb +2 -2
  174. data/lib/rubygems/commands/generate_index_command.rb +39 -74
  175. data/lib/rubygems/commands/help_command.rb +3 -3
  176. data/lib/rubygems/commands/info_command.rb +2 -2
  177. data/lib/rubygems/commands/install_command.rb +8 -16
  178. data/lib/rubygems/commands/list_command.rb +2 -2
  179. data/lib/rubygems/commands/lock_command.rb +1 -1
  180. data/lib/rubygems/commands/open_command.rb +1 -1
  181. data/lib/rubygems/commands/owner_command.rb +1 -1
  182. data/lib/rubygems/commands/pristine_command.rb +13 -15
  183. data/lib/rubygems/commands/push_command.rb +2 -2
  184. data/lib/rubygems/commands/query_command.rb +4 -5
  185. data/lib/rubygems/commands/rdoc_command.rb +2 -2
  186. data/lib/rubygems/commands/search_command.rb +2 -2
  187. data/lib/rubygems/commands/setup_command.rb +31 -34
  188. data/lib/rubygems/commands/sources_command.rb +12 -12
  189. data/lib/rubygems/commands/specification_command.rb +10 -10
  190. data/lib/rubygems/commands/stale_command.rb +1 -1
  191. data/lib/rubygems/commands/uninstall_command.rb +9 -10
  192. data/lib/rubygems/commands/unpack_command.rb +4 -4
  193. data/lib/rubygems/commands/update_command.rb +10 -12
  194. data/lib/rubygems/commands/which_command.rb +1 -1
  195. data/lib/rubygems/commands/yank_command.rb +1 -1
  196. data/lib/rubygems/compatibility.rb +5 -6
  197. data/lib/rubygems/config_file.rb +4 -4
  198. data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
  199. data/lib/rubygems/core_ext/kernel_require.rb +19 -48
  200. data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
  201. data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
  202. data/lib/rubygems/defaults.rb +15 -3
  203. data/lib/rubygems/dependency.rb +12 -14
  204. data/lib/rubygems/dependency_installer.rb +29 -30
  205. data/lib/rubygems/dependency_list.rb +1 -1
  206. data/lib/rubygems/deprecate.rb +16 -15
  207. data/lib/rubygems/doctor.rb +5 -5
  208. data/lib/rubygems/errors.rb +2 -6
  209. data/lib/rubygems/exceptions.rb +2 -1
  210. data/lib/rubygems/ext/builder.rb +15 -10
  211. data/lib/rubygems/ext/cargo_builder.rb +5 -5
  212. data/lib/rubygems/ext/ext_conf_builder.rb +1 -3
  213. data/lib/rubygems/gem_runner.rb +4 -4
  214. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
  215. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
  216. data/lib/rubygems/gemcutter_utilities.rb +18 -19
  217. data/lib/rubygems/install_update_options.rb +18 -19
  218. data/lib/rubygems/installer.rb +59 -33
  219. data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
  220. data/lib/rubygems/local_remote_options.rb +7 -10
  221. data/lib/rubygems/name_tuple.rb +7 -9
  222. data/lib/rubygems/net/http.rb +3 -0
  223. data/lib/rubygems/net-http/.document +1 -0
  224. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  225. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  226. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  227. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  228. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  229. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  230. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  231. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  232. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  233. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  234. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  235. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  236. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  237. data/lib/rubygems/net-protocol/.document +1 -0
  238. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  239. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  240. data/lib/rubygems/optparse/lib/optparse.rb +39 -17
  241. data/lib/rubygems/package/old.rb +2 -2
  242. data/lib/rubygems/package/tar_header.rb +45 -39
  243. data/lib/rubygems/package/tar_reader/entry.rb +5 -4
  244. data/lib/rubygems/package/tar_reader.rb +5 -3
  245. data/lib/rubygems/package/tar_writer.rb +19 -17
  246. data/lib/rubygems/package.rb +27 -26
  247. data/lib/rubygems/package_task.rb +2 -2
  248. data/lib/rubygems/path_support.rb +9 -10
  249. data/lib/rubygems/platform.rb +60 -45
  250. data/lib/rubygems/query_utils.rb +7 -9
  251. data/lib/rubygems/remote_fetcher.rb +15 -15
  252. data/lib/rubygems/request/connection_pools.rb +3 -3
  253. data/lib/rubygems/request.rb +20 -17
  254. data/lib/rubygems/request_set/gem_dependency_api.rb +119 -122
  255. data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
  256. data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
  257. data/lib/rubygems/request_set/lockfile.rb +6 -11
  258. data/lib/rubygems/request_set.rb +5 -5
  259. data/lib/rubygems/requirement.rb +7 -7
  260. data/lib/rubygems/resolv/.document +1 -0
  261. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  262. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  263. data/lib/rubygems/resolver/activation_request.rb +1 -3
  264. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  265. data/lib/rubygems/resolver/best_set.rb +1 -1
  266. data/lib/rubygems/resolver/composed_set.rb +1 -1
  267. data/lib/rubygems/resolver/conflict.rb +4 -12
  268. data/lib/rubygems/resolver/index_set.rb +4 -4
  269. data/lib/rubygems/resolver/index_specification.rb +2 -2
  270. data/lib/rubygems/resolver/installer_set.rb +5 -6
  271. data/lib/rubygems/resolver/lock_set.rb +1 -1
  272. data/lib/rubygems/resolver/molinillo/.document +1 -0
  273. data/lib/rubygems/resolver.rb +3 -10
  274. data/lib/rubygems/s3_uri_signer.rb +6 -6
  275. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  276. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  277. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  278. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  279. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  280. data/lib/rubygems/safe_marshal.rb +74 -0
  281. data/lib/rubygems/safe_yaml.rb +5 -28
  282. data/lib/rubygems/security/policies.rb +36 -38
  283. data/lib/rubygems/security/policy.rb +7 -11
  284. data/lib/rubygems/security/signer.rb +1 -1
  285. data/lib/rubygems/security/trust_dir.rb +3 -3
  286. data/lib/rubygems/security.rb +8 -22
  287. data/lib/rubygems/source/git.rb +1 -3
  288. data/lib/rubygems/source/installed.rb +0 -2
  289. data/lib/rubygems/source/local.rb +5 -8
  290. data/lib/rubygems/source/lock.rb +1 -3
  291. data/lib/rubygems/source/specific_file.rb +0 -1
  292. data/lib/rubygems/source/vendor.rb +0 -2
  293. data/lib/rubygems/source.rb +12 -12
  294. data/lib/rubygems/source_list.rb +4 -4
  295. data/lib/rubygems/spec_fetcher.rb +29 -29
  296. data/lib/rubygems/specification.rb +125 -138
  297. data/lib/rubygems/specification_policy.rb +55 -25
  298. data/lib/rubygems/stub_specification.rb +4 -5
  299. data/lib/rubygems/text.rb +1 -2
  300. data/lib/rubygems/timeout/.document +1 -0
  301. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  302. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  303. data/lib/rubygems/timeout.rb +3 -0
  304. data/lib/rubygems/tsort/lib/tsort.rb +3 -0
  305. data/lib/rubygems/uninstaller.rb +7 -9
  306. data/lib/rubygems/update_suggestion.rb +5 -18
  307. data/lib/rubygems/uri_formatter.rb +1 -1
  308. data/lib/rubygems/user_interaction.rb +15 -21
  309. data/lib/rubygems/util/licenses.rb +65 -35
  310. data/lib/rubygems/util/list.rb +3 -1
  311. data/lib/rubygems/util.rb +2 -4
  312. data/lib/rubygems/validator.rb +5 -3
  313. data/lib/rubygems/version.rb +34 -28
  314. data/lib/rubygems/version_option.rb +2 -5
  315. data/lib/rubygems/yaml_serializer.rb +3 -3
  316. data/lib/rubygems.rb +37 -37
  317. data/rubygems-update.gemspec +4 -4
  318. data/setup.rb +2 -2
  319. metadata +50 -225
  320. data/lib/rubygems/indexer.rb +0 -428
  321. data/lib/rubygems/mock_gem_ui.rb +0 -86
  322. data/test/rubygems/alternate_cert.pem +0 -19
  323. data/test/rubygems/alternate_cert_32.pem +0 -19
  324. data/test/rubygems/alternate_key.pem +0 -27
  325. data/test/rubygems/bad_rake.rb +0 -3
  326. data/test/rubygems/bundler_test_gem.rb +0 -424
  327. data/test/rubygems/ca_cert.pem +0 -77
  328. data/test/rubygems/child_cert.pem +0 -19
  329. data/test/rubygems/child_cert_32.pem +0 -19
  330. data/test/rubygems/child_key.pem +0 -27
  331. data/test/rubygems/client.pem +0 -107
  332. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  333. data/test/rubygems/data/gem-private_key.pem +0 -27
  334. data/test/rubygems/data/gem-public_cert.pem +0 -20
  335. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  336. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  337. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  338. data/test/rubygems/encrypted_private_key.pem +0 -30
  339. data/test/rubygems/expired_cert.pem +0 -19
  340. data/test/rubygems/fake_certlib/openssl.rb +0 -9
  341. data/test/rubygems/foo/discover.rb +0 -1
  342. data/test/rubygems/future_cert.pem +0 -19
  343. data/test/rubygems/future_cert_32.pem +0 -19
  344. data/test/rubygems/good_rake.rb +0 -3
  345. data/test/rubygems/grandchild_cert.pem +0 -19
  346. data/test/rubygems/grandchild_cert_32.pem +0 -19
  347. data/test/rubygems/grandchild_key.pem +0 -27
  348. data/test/rubygems/helper.rb +0 -1649
  349. data/test/rubygems/installer_test_case.rb +0 -248
  350. data/test/rubygems/invalid_client.pem +0 -49
  351. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  352. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  353. data/test/rubygems/invalid_key.pem +0 -27
  354. data/test/rubygems/invalid_signer_cert.pem +0 -19
  355. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  356. data/test/rubygems/invalidchild_cert.pem +0 -19
  357. data/test/rubygems/invalidchild_cert_32.pem +0 -19
  358. data/test/rubygems/invalidchild_key.pem +0 -27
  359. data/test/rubygems/multifactor_auth_utilities.rb +0 -111
  360. data/test/rubygems/package/tar_test_case.rb +0 -175
  361. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  362. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  363. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  364. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
  365. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
  366. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
  367. data/test/rubygems/private3072_key.pem +0 -40
  368. data/test/rubygems/private_ec_key.pem +0 -9
  369. data/test/rubygems/private_key.pem +0 -27
  370. data/test/rubygems/public3072_cert.pem +0 -25
  371. data/test/rubygems/public_cert.pem +0 -20
  372. data/test/rubygems/public_cert_32.pem +0 -19
  373. data/test/rubygems/public_key.pem +0 -9
  374. data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
  375. data/test/rubygems/rubygems_plugin.rb +0 -24
  376. data/test/rubygems/sff/discover.rb +0 -1
  377. data/test/rubygems/simple_gem.rb +0 -68
  378. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  379. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  380. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
  381. data/test/rubygems/ssl_cert.pem +0 -80
  382. data/test/rubygems/ssl_key.pem +0 -27
  383. data/test/rubygems/test_bundled_ca.rb +0 -61
  384. data/test/rubygems/test_config.rb +0 -28
  385. data/test/rubygems/test_deprecate.rb +0 -158
  386. data/test/rubygems/test_exit.rb +0 -17
  387. data/test/rubygems/test_gem.rb +0 -1799
  388. data/test/rubygems/test_gem_available_set.rb +0 -130
  389. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
  390. data/test/rubygems/test_gem_command.rb +0 -403
  391. data/test/rubygems/test_gem_command_manager.rb +0 -400
  392. data/test/rubygems/test_gem_commands_build_command.rb +0 -739
  393. data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
  394. data/test/rubygems/test_gem_commands_check_command.rb +0 -68
  395. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
  396. data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
  397. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
  398. data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
  399. data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
  400. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
  401. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
  402. data/test/rubygems/test_gem_commands_help_command.rb +0 -94
  403. data/test/rubygems/test_gem_commands_info_command.rb +0 -70
  404. data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
  405. data/test/rubygems/test_gem_commands_list_command.rb +0 -33
  406. data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
  407. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  408. data/test/rubygems/test_gem_commands_open_command.rb +0 -101
  409. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
  410. data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
  411. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
  412. data/test/rubygems/test_gem_commands_push_command.rb +0 -603
  413. data/test/rubygems/test_gem_commands_query_command.rb +0 -858
  414. data/test/rubygems/test_gem_commands_search_command.rb +0 -16
  415. data/test/rubygems/test_gem_commands_server_command.rb +0 -20
  416. data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
  417. data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
  418. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  419. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  420. data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
  421. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  422. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -542
  423. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
  424. data/test/rubygems/test_gem_commands_update_command.rb +0 -836
  425. data/test/rubygems/test_gem_commands_which_command.rb +0 -85
  426. data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
  427. data/test/rubygems/test_gem_config_file.rb +0 -551
  428. data/test/rubygems/test_gem_dependency.rb +0 -398
  429. data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
  430. data/test/rubygems/test_gem_dependency_list.rb +0 -265
  431. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
  432. data/test/rubygems/test_gem_doctor.rb +0 -195
  433. data/test/rubygems/test_gem_ext_builder.rb +0 -337
  434. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  435. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  436. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
  437. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
  438. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
  439. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
  440. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  441. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
  442. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  443. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
  444. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
  445. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
  446. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
  447. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
  448. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
  449. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
  450. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
  451. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
  452. data/test/rubygems/test_gem_gem_runner.rb +0 -119
  453. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
  454. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
  455. data/test/rubygems/test_gem_indexer.rb +0 -381
  456. data/test/rubygems/test_gem_install_update_options.rb +0 -208
  457. data/test/rubygems/test_gem_installer.rb +0 -2512
  458. data/test/rubygems/test_gem_local_remote_options.rb +0 -133
  459. data/test/rubygems/test_gem_name_tuple.rb +0 -43
  460. data/test/rubygems/test_gem_package.rb +0 -1306
  461. data/test/rubygems/test_gem_package_old.rb +0 -91
  462. data/test/rubygems/test_gem_package_tar_header.rb +0 -226
  463. data/test/rubygems/test_gem_package_tar_reader.rb +0 -150
  464. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
  465. data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
  466. data/test/rubygems/test_gem_package_task.rb +0 -118
  467. data/test/rubygems/test_gem_path_support.rb +0 -139
  468. data/test/rubygems/test_gem_platform.rb +0 -497
  469. data/test/rubygems/test_gem_rdoc.rb +0 -137
  470. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
  471. data/test/rubygems/test_gem_request.rb +0 -547
  472. data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
  473. data/test/rubygems/test_gem_request_set.rb +0 -672
  474. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
  475. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
  476. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
  477. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
  478. data/test/rubygems/test_gem_requirement.rb +0 -505
  479. data/test/rubygems/test_gem_resolver.rb +0 -859
  480. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
  481. data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
  482. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
  483. data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
  484. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
  485. data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
  486. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
  487. data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
  488. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  489. data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
  490. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
  491. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
  492. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
  493. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
  494. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
  495. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
  496. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
  497. data/test/rubygems/test_gem_resolver_specification.rb +0 -63
  498. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
  499. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
  500. data/test/rubygems/test_gem_security.rb +0 -341
  501. data/test/rubygems/test_gem_security_policy.rb +0 -535
  502. data/test/rubygems/test_gem_security_signer.rb +0 -218
  503. data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
  504. data/test/rubygems/test_gem_silent_ui.rb +0 -123
  505. data/test/rubygems/test_gem_source.rb +0 -254
  506. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
  507. data/test/rubygems/test_gem_source_git.rb +0 -310
  508. data/test/rubygems/test_gem_source_installed.rb +0 -35
  509. data/test/rubygems/test_gem_source_list.rb +0 -119
  510. data/test/rubygems/test_gem_source_local.rb +0 -107
  511. data/test/rubygems/test_gem_source_lock.rb +0 -113
  512. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  513. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
  514. data/test/rubygems/test_gem_source_vendor.rb +0 -30
  515. data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
  516. data/test/rubygems/test_gem_specification.rb +0 -3856
  517. data/test/rubygems/test_gem_stream_ui.rb +0 -255
  518. data/test/rubygems/test_gem_stub_specification.rb +0 -278
  519. data/test/rubygems/test_gem_text.rb +0 -103
  520. data/test/rubygems/test_gem_uninstaller.rb +0 -675
  521. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
  522. data/test/rubygems/test_gem_update_suggestion.rb +0 -209
  523. data/test/rubygems/test_gem_uri.rb +0 -41
  524. data/test/rubygems/test_gem_uri_formatter.rb +0 -27
  525. data/test/rubygems/test_gem_util.rb +0 -91
  526. data/test/rubygems/test_gem_validator.rb +0 -42
  527. data/test/rubygems/test_gem_version.rb +0 -305
  528. data/test/rubygems/test_gem_version_option.rb +0 -165
  529. data/test/rubygems/test_kernel.rb +0 -124
  530. data/test/rubygems/test_project_sanity.rb +0 -49
  531. data/test/rubygems/test_remote_fetch_error.rb +0 -20
  532. data/test/rubygems/test_require.rb +0 -732
  533. data/test/rubygems/test_rubygems.rb +0 -76
  534. data/test/rubygems/test_webauthn_listener.rb +0 -143
  535. data/test/rubygems/test_webauthn_listener_response.rb +0 -93
  536. data/test/rubygems/test_webauthn_poller.rb +0 -124
  537. data/test/rubygems/utilities.rb +0 -436
  538. data/test/rubygems/wrong_key_cert.pem +0 -19
  539. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  540. 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?