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,603 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "helper"
4
- require_relative "multifactor_auth_utilities"
5
- require "rubygems/commands/push_command"
6
- require "rubygems/config_file"
7
-
8
- class TestGemCommandsPushCommand < Gem::TestCase
9
- def setup
10
- super
11
-
12
- credential_setup
13
-
14
- ENV["RUBYGEMS_HOST"] = nil
15
- Gem.host = Gem::DEFAULT_HOST
16
- Gem.configuration.disable_default_gem_server = false
17
-
18
- @gems_dir = File.join @tempdir, "gems"
19
- @cache_dir = File.join @gemhome, "cache"
20
-
21
- FileUtils.mkdir @gems_dir
22
-
23
- Gem.configuration.rubygems_api_key =
24
- "ed244fbf2b1a52e012da8616c512fa47f9aa5250"
25
-
26
- @spec, @path = util_gem "freewill", "1.0.0"
27
- @host = "https://rubygems.example"
28
- @api_key = Gem.configuration.rubygems_api_key
29
-
30
- @fetcher = Gem::MultifactorAuthFetcher.new
31
- Gem::RemoteFetcher.fetcher = @fetcher
32
-
33
- @cmd = Gem::Commands::PushCommand.new
34
-
35
- singleton_gem_class.class_eval do
36
- alias_method :orig_latest_rubygems_version, :latest_rubygems_version
37
-
38
- def latest_rubygems_version
39
- Gem.rubygems_version
40
- end
41
- end
42
- end
43
-
44
- def teardown
45
- credential_teardown
46
-
47
- super
48
-
49
- singleton_gem_class.class_eval do
50
- remove_method :latest_rubygems_version
51
- alias_method :latest_rubygems_version, :orig_latest_rubygems_version
52
- end
53
- end
54
-
55
- def send_battery
56
- use_ui @ui do
57
- @cmd.instance_variable_set :@host, @host
58
- @cmd.send_gem(@path)
59
- end
60
-
61
- assert_match %r{Pushing gem to #{@host}...}, @ui.output
62
-
63
- assert_equal Net::HTTP::Post, @fetcher.last_request.class
64
- assert_equal Gem.read_binary(@path), @fetcher.last_request.body
65
- assert_equal File.size(@path), @fetcher.last_request["Content-Length"].to_i
66
- assert_equal "application/octet-stream", @fetcher.last_request["Content-Type"]
67
- assert_equal @api_key, @fetcher.last_request["Authorization"]
68
-
69
- assert_match @response, @ui.output
70
- end
71
-
72
- def test_execute
73
- @response = "Successfully registered gem: freewill (1.0.0)"
74
- @fetcher.data["#{Gem.host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
75
-
76
- @cmd.options[:args] = [@path]
77
-
78
- @cmd.execute
79
-
80
- assert_equal Net::HTTP::Post, @fetcher.last_request.class
81
- assert_equal Gem.read_binary(@path), @fetcher.last_request.body
82
- assert_equal "application/octet-stream",
83
- @fetcher.last_request["Content-Type"]
84
- end
85
-
86
- def test_execute_host
87
- host = "https://other.example"
88
-
89
- @response = "Successfully registered gem: freewill (1.0.0)"
90
- @fetcher.data["#{host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
91
- @fetcher.data["#{Gem.host}/api/v1/gems"] =
92
- ["fail", 500, "Internal Server Error"]
93
-
94
- @cmd.options[:host] = host
95
- @cmd.options[:args] = [@path]
96
-
97
- @cmd.execute
98
-
99
- assert_equal Net::HTTP::Post, @fetcher.last_request.class
100
- assert_equal Gem.read_binary(@path), @fetcher.last_request.body
101
- assert_equal "application/octet-stream",
102
- @fetcher.last_request["Content-Type"]
103
- end
104
-
105
- def test_execute_allowed_push_host
106
- @spec, @path = util_gem "freebird", "1.0.1" do |spec|
107
- spec.metadata["allowed_push_host"] = "https://privategemserver.example"
108
- end
109
-
110
- @response = "Successfully registered gem: freewill (1.0.0)"
111
- @fetcher.data["#{@spec.metadata["allowed_push_host"]}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
112
- @fetcher.data["#{Gem.host}/api/v1/gems"] =
113
- ["fail", 500, "Internal Server Error"]
114
-
115
- @cmd.options[:args] = [@path]
116
-
117
- @cmd.execute
118
-
119
- assert_equal Net::HTTP::Post, @fetcher.last_request.class
120
- assert_equal Gem.read_binary(@path), @fetcher.last_request.body
121
- assert_equal "application/octet-stream",
122
- @fetcher.last_request["Content-Type"]
123
- end
124
-
125
- def test_sending_when_default_host_disabled
126
- Gem.configuration.disable_default_gem_server = true
127
- response = "You must specify a gem server"
128
-
129
- assert_raise Gem::MockGemUi::TermError do
130
- use_ui @ui do
131
- @cmd.send_gem(@path)
132
- end
133
- end
134
-
135
- assert_match response, @ui.error
136
- end
137
-
138
- def test_sending_when_default_host_disabled_with_override
139
- ENV["RUBYGEMS_HOST"] = @host
140
- Gem.configuration.disable_default_gem_server = true
141
- @response = "Successfully registered gem: freewill (1.0.0)"
142
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
143
-
144
- send_battery
145
- end
146
-
147
- def test_sending_gem_to_metadata_host
148
- @host = "http://privategemserver.example"
149
-
150
- @spec, @path = util_gem "freebird", "1.0.1" do |spec|
151
- spec.metadata["default_gem_server"] = @host
152
- end
153
-
154
- @api_key = "EYKEY"
155
-
156
- keys = {
157
- :rubygems_api_key => "KEY",
158
- @host => @api_key,
159
- }
160
-
161
- File.open Gem.configuration.credentials_path, "w" do |f|
162
- f.write Gem::ConfigFile.dump_with_rubygems_yaml(keys)
163
- end
164
- Gem.configuration.load_api_keys
165
-
166
- FileUtils.rm Gem.configuration.credentials_path
167
-
168
- @response = "Successfully registered gem: freebird (1.0.1)"
169
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
170
-
171
- send_battery
172
- end
173
-
174
- def test_sending_gem
175
- @response = "Successfully registered gem: freewill (1.0.0)"
176
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
177
-
178
- send_battery
179
- end
180
-
181
- def test_sending_gem_to_allowed_push_host
182
- @host = "http://privategemserver.example"
183
-
184
- @spec, @path = util_gem "freebird", "1.0.1" do |spec|
185
- spec.metadata["allowed_push_host"] = @host
186
- end
187
-
188
- @api_key = "PRIVKEY"
189
-
190
- keys = {
191
- :rubygems_api_key => "KEY",
192
- @host => @api_key,
193
- }
194
-
195
- File.open Gem.configuration.credentials_path, "w" do |f|
196
- f.write Gem::ConfigFile.dump_with_rubygems_yaml(keys)
197
- end
198
- Gem.configuration.load_api_keys
199
-
200
- FileUtils.rm Gem.configuration.credentials_path
201
-
202
- @response = "Successfully registered gem: freebird (1.0.1)"
203
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
204
- send_battery
205
- end
206
-
207
- def test_sending_gem_with_env_var_api_key
208
- @host = "http://privategemserver.example"
209
-
210
- @spec, @path = util_gem "freebird", "1.0.1" do |spec|
211
- spec.metadata["allowed_push_host"] = @host
212
- end
213
-
214
- @api_key = "PRIVKEY"
215
- ENV["GEM_HOST_API_KEY"] = "PRIVKEY"
216
-
217
- @response = "Successfully registered gem: freebird (1.0.1)"
218
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
219
- send_battery
220
- end
221
-
222
- def test_sending_gem_to_allowed_push_host_with_basic_credentials
223
- @sanitized_host = "http://privategemserver.example"
224
- @host = "http://user:password@privategemserver.example"
225
-
226
- @spec, @path = util_gem "freebird", "1.0.1" do |spec|
227
- spec.metadata["allowed_push_host"] = @sanitized_host
228
- end
229
-
230
- @api_key = "DOESNTMATTER"
231
-
232
- keys = {
233
- :rubygems_api_key => @api_key,
234
- }
235
-
236
- File.open Gem.configuration.credentials_path, "w" do |f|
237
- f.write Gem::ConfigFile.dump_with_rubygems_yaml(keys)
238
- end
239
- Gem.configuration.load_api_keys
240
-
241
- FileUtils.rm Gem.configuration.credentials_path
242
-
243
- @response = "Successfully registered gem: freebird (1.0.1)"
244
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
245
- send_battery
246
- end
247
-
248
- def test_sending_gem_to_disallowed_default_host
249
- @spec, @path = util_gem "freebird", "1.0.1" do |spec|
250
- spec.metadata["allowed_push_host"] = "https://privategemserver.example"
251
- end
252
-
253
- response = %(ERROR: "#{@host}" is not allowed by the gemspec, which only allows "https://privategemserver.example")
254
-
255
- assert_raise Gem::MockGemUi::TermError do
256
- send_battery
257
- end
258
-
259
- assert_match response, @ui.error
260
- end
261
-
262
- def test_sending_gem_to_disallowed_push_host
263
- @host = "https://anotherprivategemserver.example"
264
- push_host = "https://privategemserver.example"
265
-
266
- @spec, @path = util_gem "freebird", "1.0.1" do |spec|
267
- spec.metadata["allowed_push_host"] = push_host
268
- end
269
-
270
- @api_key = "PRIVKEY"
271
-
272
- keys = {
273
- :rubygems_api_key => "KEY",
274
- @host => @api_key,
275
- }
276
-
277
- File.open Gem.configuration.credentials_path, "w" do |f|
278
- f.write Gem::ConfigFile.dump_with_rubygems_yaml(keys)
279
- end
280
- Gem.configuration.load_api_keys
281
-
282
- FileUtils.rm Gem.configuration.credentials_path
283
-
284
- response = "ERROR: \"#{@host}\" is not allowed by the gemspec, which only allows \"#{push_host}\""
285
-
286
- assert_raise Gem::MockGemUi::TermError do
287
- send_battery
288
- end
289
-
290
- assert_match response, @ui.error
291
- end
292
-
293
- def test_sending_gem_defaulting_to_allowed_push_host
294
- host = "http://privategemserver.example"
295
-
296
- @spec, @path = util_gem "freebird", "1.0.1" do |spec|
297
- spec.metadata.delete("default_gem_server")
298
- spec.metadata["allowed_push_host"] = host
299
- end
300
-
301
- api_key = "PRIVKEY"
302
-
303
- keys = {
304
- host => api_key,
305
- }
306
-
307
- File.open Gem.configuration.credentials_path, "w" do |f|
308
- f.write Gem::ConfigFile.dump_with_rubygems_yaml(keys)
309
- end
310
- Gem.configuration.load_api_keys
311
-
312
- FileUtils.rm Gem.configuration.credentials_path
313
-
314
- @response = "Successfully registered gem: freebird (1.0.1)"
315
- @fetcher.data["#{host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
316
-
317
- # do not set @host
318
- use_ui(@ui) { @cmd.send_gem(@path) }
319
-
320
- assert_match %r{Pushing gem to #{host}...}, @ui.output
321
-
322
- assert_equal Net::HTTP::Post, @fetcher.last_request.class
323
- assert_equal Gem.read_binary(@path), @fetcher.last_request.body
324
- assert_equal File.size(@path), @fetcher.last_request["Content-Length"].to_i
325
- assert_equal "application/octet-stream", @fetcher.last_request["Content-Type"]
326
- assert_equal api_key, @fetcher.last_request["Authorization"]
327
-
328
- assert_match @response, @ui.output
329
- end
330
-
331
- def test_sending_gem_to_host_permanent_redirect
332
- @host = "http://rubygems.example"
333
- redirected_uri = "https://rubygems.example/api/v1/gems"
334
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(
335
- body: "",
336
- code: 308,
337
- msg: "Permanent Redirect",
338
- headers: { "Location" => redirected_uri }
339
- )
340
-
341
- assert_raise Gem::MockGemUi::TermError do
342
- use_ui @ui do
343
- @cmd.instance_variable_set :@host, @host
344
- @cmd.send_gem(@path)
345
- end
346
- end
347
-
348
- response = "The request has redirected permanently to #{redirected_uri}. Please check your defined push host URL."
349
- assert_match response, @ui.output
350
- end
351
-
352
- def test_raises_error_with_no_arguments
353
- def @cmd.sign_in(*); end
354
- assert_raise Gem::CommandLineError do
355
- @cmd.execute
356
- end
357
- end
358
-
359
- def test_sending_gem_denied
360
- response = "You don't have permission to push to this gem"
361
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(body: response, code: 403, msg: "Forbidden")
362
- @cmd.instance_variable_set :@host, @host
363
-
364
- assert_raise Gem::MockGemUi::TermError do
365
- use_ui @ui do
366
- @cmd.send_gem(@path)
367
- end
368
- end
369
-
370
- assert_match response, @ui.output
371
- end
372
-
373
- def test_sending_gem_key
374
- @response = "Successfully registered gem: freewill (1.0.0)"
375
- @fetcher.data["#{@host}/api/v1/gems"] = HTTPResponseFactory.create(body: @response, code: 200, msg: "OK")
376
- File.open Gem.configuration.credentials_path, "a" do |f|
377
- f.write ":other: 701229f217cdf23b1344c7b4b54ca97"
378
- end
379
- Gem.configuration.load_api_keys
380
-
381
- @cmd.handle_options %w[-k other]
382
- @cmd.instance_variable_set :@host, @host
383
- @cmd.send_gem(@path)
384
-
385
- assert_equal Gem.configuration.api_keys[:other],
386
- @fetcher.last_request["Authorization"]
387
- end
388
-
389
- def test_otp_verified_success
390
- response_success = "Successfully registered gem: freewill (1.0.0)"
391
-
392
- @fetcher.respond_with_require_otp("#{Gem.host}/api/v1/gems", response_success)
393
-
394
- @otp_ui = Gem::MockGemUi.new "111111\n"
395
- use_ui @otp_ui do
396
- @cmd.send_gem(@path)
397
- end
398
-
399
- assert_match "You have enabled multi-factor authentication. Please enter OTP code.", @otp_ui.output
400
- assert_match "Code: ", @otp_ui.output
401
- assert_match response_success, @otp_ui.output
402
- assert_equal "111111", @fetcher.last_request["OTP"]
403
- end
404
-
405
- def test_otp_verified_failure
406
- response = "You have enabled multifactor authentication but your request doesn't have the correct OTP code. Please check it and retry."
407
- @fetcher.data["#{Gem.host}/api/v1/gems"] = HTTPResponseFactory.create(body: response, code: 401, msg: "Unauthorized")
408
- @fetcher.data["#{Gem.host}/api/v1/webauthn_verification"] =
409
- HTTPResponseFactory.create(body: "You don't have any security devices", code: 422, msg: "Unprocessable Entity")
410
-
411
- @otp_ui = Gem::MockGemUi.new "111111\n"
412
- assert_raise Gem::MockGemUi::TermError do
413
- use_ui @otp_ui do
414
- @cmd.send_gem(@path)
415
- end
416
- end
417
-
418
- assert_match response, @otp_ui.output
419
- assert_match "You have enabled multi-factor authentication. Please enter OTP code.", @otp_ui.output
420
- assert_match "Code: ", @otp_ui.output
421
- assert_equal "111111", @fetcher.last_request["OTP"]
422
- end
423
-
424
- def test_with_webauthn_enabled_success
425
- response_success = "Successfully registered gem: freewill (1.0.0)"
426
- server = Gem::MockTCPServer.new
427
-
428
- @fetcher.respond_with_require_otp("#{Gem.host}/api/v1/gems", response_success)
429
- @fetcher.respond_with_webauthn_url
430
-
431
- TCPServer.stub(:new, server) do
432
- Gem::GemcutterUtilities::WebauthnListener.stub(:listener_thread, Thread.new { Thread.current[:otp] = "Uvh6T57tkWuUnWYo" }) do
433
- use_ui @ui do
434
- @cmd.send_gem(@path)
435
- end
436
- end
437
- end
438
-
439
- assert_match "You have enabled multi-factor authentication. Please visit #{@fetcher.webauthn_url_with_port(server.port)} " \
440
- "to authenticate via security device. If you can't verify using WebAuthn but have OTP enabled, " \
441
- "you can re-run the gem signin command with the `--otp [your_code]` option.", @ui.output
442
- assert_match "You are verified with a security device. You may close the browser window.", @ui.output
443
- assert_equal "Uvh6T57tkWuUnWYo", @fetcher.last_request["OTP"]
444
- assert_match response_success, @ui.output
445
- end
446
-
447
- def test_with_webauthn_enabled_failure
448
- response_success = "Successfully registered gem: freewill (1.0.0)"
449
- server = Gem::MockTCPServer.new
450
- error = Gem::WebauthnVerificationError.new("Something went wrong")
451
-
452
- @fetcher.respond_with_require_otp("#{Gem.host}/api/v1/gems", response_success)
453
- @fetcher.respond_with_webauthn_url
454
-
455
- error = assert_raise Gem::MockGemUi::TermError do
456
- TCPServer.stub(:new, server) do
457
- Gem::GemcutterUtilities::WebauthnListener.stub(:listener_thread, Thread.new { Thread.current[:error] = error }) do
458
- use_ui @ui do
459
- @cmd.send_gem(@path)
460
- end
461
- end
462
- end
463
- end
464
- assert_equal 1, error.exit_code
465
-
466
- assert_match @fetcher.last_request["Authorization"], Gem.configuration.rubygems_api_key
467
- assert_match "You have enabled multi-factor authentication. Please visit #{@fetcher.webauthn_url_with_port(server.port)} " \
468
- "to authenticate via security device. If you can't verify using WebAuthn but have OTP enabled, " \
469
- "you can re-run the gem signin command with the `--otp [your_code]` option.", @ui.output
470
- assert_match "ERROR: Security device verification failed: Something went wrong", @ui.error
471
- refute_match "You are verified with a security device. You may close the browser window.", @ui.output
472
- refute_match response_success, @ui.output
473
- end
474
-
475
- def test_with_webauthn_enabled_success_with_polling
476
- response_success = "Successfully registered gem: freewill (1.0.0)"
477
- server = Gem::MockTCPServer.new
478
-
479
- @fetcher.respond_with_require_otp("#{Gem.host}/api/v1/gems", response_success)
480
- @fetcher.respond_with_webauthn_url
481
- @fetcher.respond_with_webauthn_polling("Uvh6T57tkWuUnWYo")
482
-
483
- TCPServer.stub(:new, server) do
484
- use_ui @ui do
485
- @cmd.send_gem(@path)
486
- end
487
- end
488
-
489
- assert_match "You have enabled multi-factor authentication. Please visit #{@fetcher.webauthn_url_with_port(server.port)} " \
490
- "to authenticate via security device. If you can't verify using WebAuthn but have OTP enabled, " \
491
- "you can re-run the gem signin command with the `--otp [your_code]` option.", @ui.output
492
- assert_match "You are verified with a security device. You may close the browser window.", @ui.output
493
- assert_equal "Uvh6T57tkWuUnWYo", @fetcher.last_request["OTP"]
494
- assert_match response_success, @ui.output
495
- end
496
-
497
- def test_with_webauthn_enabled_failure_with_polling
498
- response_success = "Successfully registered gem: freewill (1.0.0)"
499
- server = Gem::MockTCPServer.new
500
-
501
- @fetcher.respond_with_require_otp("#{Gem.host}/api/v1/gems", response_success)
502
- @fetcher.respond_with_webauthn_url
503
- @fetcher.respond_with_webauthn_polling_failure
504
-
505
- error = assert_raise Gem::MockGemUi::TermError do
506
- TCPServer.stub(:new, server) do
507
- use_ui @ui do
508
- @cmd.send_gem(@path)
509
- end
510
- end
511
- end
512
- assert_equal 1, error.exit_code
513
-
514
- assert_match @fetcher.last_request["Authorization"], Gem.configuration.rubygems_api_key
515
- assert_match "You have enabled multi-factor authentication. Please visit #{@fetcher.webauthn_url_with_port(server.port)} " \
516
- "to authenticate via security device. If you can't verify using WebAuthn but have OTP enabled, you can re-run the gem signin " \
517
- "command with the `--otp [your_code]` option.", @ui.output
518
- assert_match "ERROR: Security device verification failed: The token in the link you used has either expired " \
519
- "or been used already.", @ui.error
520
- refute_match "You are verified with a security device. You may close the browser window.", @ui.output
521
- refute_match response_success, @ui.output
522
- end
523
-
524
- def test_sending_gem_unathorized_api_key_with_mfa_enabled
525
- response_mfa_enabled = "You have enabled multifactor authentication but your request doesn't have the correct OTP code. Please check it and retry."
526
- response_forbidden = "The API key doesn't have access"
527
- response_success = "Successfully registered gem: freewill (1.0.0)"
528
-
529
- @fetcher.data["#{@host}/api/v1/gems"] = [
530
- HTTPResponseFactory.create(body: response_mfa_enabled, code: 401, msg: "Unauthorized"),
531
- HTTPResponseFactory.create(body: response_forbidden, code: 403, msg: "Forbidden"),
532
- HTTPResponseFactory.create(body: response_success, code: 200, msg: "OK"),
533
- ]
534
- @fetcher.data["#{@host}/api/v1/webauthn_verification"] =
535
- HTTPResponseFactory.create(body: "You don't have any security devices", code: 422, msg: "Unprocessable Entity")
536
-
537
- @fetcher.data["#{@host}/api/v1/api_key"] = HTTPResponseFactory.create(body: "", code: 200, msg: "OK")
538
- @cmd.instance_variable_set :@host, @host
539
- @cmd.instance_variable_set :@scope, :push_rubygem
540
-
541
- @ui = Gem::MockGemUi.new "11111\nsome@mail.com\npass\n"
542
- use_ui @ui do
543
- @cmd.send_gem(@path)
544
- end
545
-
546
- mfa_notice = "You have enabled multi-factor authentication. Please enter OTP code."
547
- access_notice = "The existing key doesn't have access of push_rubygem on https://rubygems.example. Please sign in to update access."
548
- assert_match mfa_notice, @ui.output
549
- assert_match access_notice, @ui.output
550
- assert_match "Email:", @ui.output
551
- assert_match "Password:", @ui.output
552
- assert_match "Added push_rubygem scope to the existing API key", @ui.output
553
- assert_match response_success, @ui.output
554
- assert_equal "11111", @fetcher.last_request["OTP"]
555
- end
556
-
557
- def test_sending_gem_with_no_local_creds
558
- Gem.configuration.rubygems_api_key = nil
559
-
560
- response_mfa_enabled = "You have enabled multifactor authentication but your request doesn't have the correct OTP code. Please check it and retry."
561
- response_success = "Successfully registered gem: freewill (1.0.0)"
562
- response_profile = "mfa: disabled\n"
563
-
564
- @fetcher.data["#{@host}/api/v1/gems"] = [
565
- HTTPResponseFactory.create(body: response_success, code: 200, msg: "OK"),
566
- ]
567
-
568
- @fetcher.data["#{@host}/api/v1/api_key"] = [
569
- HTTPResponseFactory.create(body: response_mfa_enabled, code: 401, msg: "Unauthorized"),
570
- HTTPResponseFactory.create(body: "", code: 200, msg: "OK"),
571
- ]
572
-
573
- @fetcher.data["#{@host}/api/v1/profile/me.yaml"] = [
574
- HTTPResponseFactory.create(body: response_profile, code: 200, msg: "OK"),
575
- ]
576
- @fetcher.data["#{@host}/api/v1/webauthn_verification"] =
577
- HTTPResponseFactory.create(body: "You don't have any security devices", code: 422, msg: "Unprocessable Entity")
578
-
579
- @cmd.instance_variable_set :@scope, :push_rubygem
580
- @cmd.options[:args] = [@path]
581
- @cmd.options[:host] = @host
582
-
583
- @ui = Gem::MockGemUi.new "some@mail.com\npass\n11111\n"
584
- use_ui @ui do
585
- @cmd.execute
586
- end
587
-
588
- mfa_notice = "You have enabled multi-factor authentication. Please enter OTP code."
589
- assert_match mfa_notice, @ui.output
590
- assert_match "Enter your https://rubygems.example credentials.", @ui.output
591
- assert_match "Email:", @ui.output
592
- assert_match "Password:", @ui.output
593
- assert_match "Signed in with API key:", @ui.output
594
- assert_match response_success, @ui.output
595
- assert_equal "11111", @fetcher.last_request["OTP"]
596
- end
597
-
598
- private
599
-
600
- def singleton_gem_class
601
- class << Gem; self; end
602
- end
603
- end