rubygems-update 3.4.17 → 3.4.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (320) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/Manifest.txt +7 -4
  4. data/bundler/CHANGELOG.md +14 -0
  5. data/bundler/lib/bundler/build_metadata.rb +2 -2
  6. data/bundler/lib/bundler/man/bundle-outdated.1 +12 -8
  7. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +12 -9
  8. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  9. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +4 -4
  10. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +1 -1
  11. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +2 -2
  12. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -1
  13. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  14. data/bundler/lib/bundler/version.rb +1 -1
  15. data/{bin → exe}/gem +2 -0
  16. data/{bin → exe}/update_rubygems +7 -5
  17. data/lib/rubygems/available_set.rb +1 -0
  18. data/lib/rubygems/basic_specification.rb +1 -0
  19. data/lib/rubygems/command.rb +1 -0
  20. data/lib/rubygems/command_manager.rb +1 -0
  21. data/lib/rubygems/commands/build_command.rb +1 -0
  22. data/lib/rubygems/commands/cert_command.rb +1 -0
  23. data/lib/rubygems/commands/check_command.rb +1 -0
  24. data/lib/rubygems/commands/cleanup_command.rb +1 -0
  25. data/lib/rubygems/commands/contents_command.rb +1 -0
  26. data/lib/rubygems/commands/dependency_command.rb +1 -0
  27. data/lib/rubygems/commands/environment_command.rb +1 -0
  28. data/lib/rubygems/commands/exec_command.rb +1 -0
  29. data/lib/rubygems/commands/fetch_command.rb +1 -0
  30. data/lib/rubygems/commands/generate_index_command.rb +1 -0
  31. data/lib/rubygems/commands/help_command.rb +1 -0
  32. data/lib/rubygems/commands/install_command.rb +1 -0
  33. data/lib/rubygems/commands/list_command.rb +1 -0
  34. data/lib/rubygems/commands/lock_command.rb +1 -0
  35. data/lib/rubygems/commands/mirror_command.rb +1 -0
  36. data/lib/rubygems/commands/open_command.rb +1 -0
  37. data/lib/rubygems/commands/outdated_command.rb +1 -0
  38. data/lib/rubygems/commands/owner_command.rb +1 -0
  39. data/lib/rubygems/commands/pristine_command.rb +1 -0
  40. data/lib/rubygems/commands/push_command.rb +1 -0
  41. data/lib/rubygems/commands/query_command.rb +1 -0
  42. data/lib/rubygems/commands/rdoc_command.rb +1 -0
  43. data/lib/rubygems/commands/search_command.rb +1 -0
  44. data/lib/rubygems/commands/server_command.rb +1 -0
  45. data/lib/rubygems/commands/setup_command.rb +2 -1
  46. data/lib/rubygems/commands/signin_command.rb +1 -0
  47. data/lib/rubygems/commands/signout_command.rb +1 -0
  48. data/lib/rubygems/commands/sources_command.rb +1 -0
  49. data/lib/rubygems/commands/specification_command.rb +1 -0
  50. data/lib/rubygems/commands/stale_command.rb +1 -0
  51. data/lib/rubygems/commands/uninstall_command.rb +1 -0
  52. data/lib/rubygems/commands/unpack_command.rb +1 -0
  53. data/lib/rubygems/commands/update_command.rb +1 -0
  54. data/lib/rubygems/commands/which_command.rb +1 -0
  55. data/lib/rubygems/commands/yank_command.rb +1 -0
  56. data/lib/rubygems/config_file.rb +1 -0
  57. data/lib/rubygems/core_ext/kernel_require.rb +1 -0
  58. data/lib/rubygems/core_ext/tcpsocket_init.rb +2 -0
  59. data/lib/rubygems/defaults.rb +1 -0
  60. data/lib/rubygems/dependency.rb +1 -0
  61. data/lib/rubygems/dependency_installer.rb +1 -0
  62. data/lib/rubygems/dependency_list.rb +1 -0
  63. data/lib/rubygems/deprecate.rb +1 -0
  64. data/lib/rubygems/doctor.rb +1 -0
  65. data/lib/rubygems/errors.rb +1 -0
  66. data/lib/rubygems/ext/build_error.rb +1 -0
  67. data/lib/rubygems/ext/builder.rb +1 -0
  68. data/lib/rubygems/ext/configure_builder.rb +1 -0
  69. data/lib/rubygems/ext/ext_conf_builder.rb +1 -0
  70. data/lib/rubygems/ext.rb +1 -0
  71. data/lib/rubygems/gem_runner.rb +1 -0
  72. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  73. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  74. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  75. data/lib/rubygems/gemcutter_utilities.rb +29 -24
  76. data/lib/rubygems/indexer.rb +1 -0
  77. data/lib/rubygems/install_default_message.rb +1 -0
  78. data/lib/rubygems/install_message.rb +1 -0
  79. data/lib/rubygems/install_update_options.rb +1 -0
  80. data/lib/rubygems/installer.rb +1 -0
  81. data/lib/rubygems/local_remote_options.rb +1 -0
  82. data/lib/rubygems/mock_gem_ui.rb +1 -0
  83. data/lib/rubygems/name_tuple.rb +1 -0
  84. data/lib/rubygems/package/digest_io.rb +1 -0
  85. data/lib/rubygems/package/file_source.rb +1 -0
  86. data/lib/rubygems/package/io_source.rb +1 -0
  87. data/lib/rubygems/package/old.rb +1 -0
  88. data/lib/rubygems/package/source.rb +1 -0
  89. data/lib/rubygems/package/tar_header.rb +1 -0
  90. data/lib/rubygems/package/tar_reader/entry.rb +1 -0
  91. data/lib/rubygems/package/tar_reader.rb +1 -0
  92. data/lib/rubygems/package/tar_writer.rb +1 -0
  93. data/lib/rubygems/package.rb +1 -0
  94. data/lib/rubygems/package_task.rb +1 -0
  95. data/lib/rubygems/path_support.rb +1 -0
  96. data/lib/rubygems/platform.rb +1 -0
  97. data/lib/rubygems/psych_tree.rb +1 -0
  98. data/lib/rubygems/rdoc.rb +1 -0
  99. data/lib/rubygems/remote_fetcher.rb +1 -0
  100. data/lib/rubygems/request/http_pool.rb +1 -0
  101. data/lib/rubygems/request/https_pool.rb +1 -0
  102. data/lib/rubygems/request.rb +1 -0
  103. data/lib/rubygems/request_set/gem_dependency_api.rb +1 -0
  104. data/lib/rubygems/request_set/lockfile/parser.rb +1 -0
  105. data/lib/rubygems/request_set/lockfile/tokenizer.rb +2 -0
  106. data/lib/rubygems/request_set/lockfile.rb +1 -0
  107. data/lib/rubygems/request_set.rb +1 -0
  108. data/lib/rubygems/requirement.rb +1 -0
  109. data/lib/rubygems/resolver/activation_request.rb +1 -0
  110. data/lib/rubygems/resolver/api_set.rb +1 -0
  111. data/lib/rubygems/resolver/api_specification.rb +1 -0
  112. data/lib/rubygems/resolver/best_set.rb +1 -0
  113. data/lib/rubygems/resolver/composed_set.rb +1 -0
  114. data/lib/rubygems/resolver/conflict.rb +1 -0
  115. data/lib/rubygems/resolver/current_set.rb +1 -0
  116. data/lib/rubygems/resolver/dependency_request.rb +1 -0
  117. data/lib/rubygems/resolver/git_set.rb +1 -0
  118. data/lib/rubygems/resolver/git_specification.rb +1 -0
  119. data/lib/rubygems/resolver/index_set.rb +1 -0
  120. data/lib/rubygems/resolver/index_specification.rb +1 -0
  121. data/lib/rubygems/resolver/installed_specification.rb +1 -0
  122. data/lib/rubygems/resolver/installer_set.rb +1 -0
  123. data/lib/rubygems/resolver/local_specification.rb +1 -0
  124. data/lib/rubygems/resolver/lock_set.rb +1 -0
  125. data/lib/rubygems/resolver/lock_specification.rb +1 -0
  126. data/lib/rubygems/resolver/molinillo.rb +1 -0
  127. data/lib/rubygems/resolver/requirement_list.rb +1 -0
  128. data/lib/rubygems/resolver/set.rb +1 -0
  129. data/lib/rubygems/resolver/source_set.rb +2 -0
  130. data/lib/rubygems/resolver/spec_specification.rb +1 -0
  131. data/lib/rubygems/resolver/specification.rb +1 -0
  132. data/lib/rubygems/resolver/stats.rb +1 -0
  133. data/lib/rubygems/resolver/vendor_set.rb +1 -0
  134. data/lib/rubygems/resolver/vendor_specification.rb +1 -0
  135. data/lib/rubygems/resolver.rb +1 -0
  136. data/lib/rubygems/s3_uri_signer.rb +4 -2
  137. data/lib/rubygems/safe_yaml.rb +2 -0
  138. data/lib/rubygems/security/policies.rb +1 -0
  139. data/lib/rubygems/security/policy.rb +1 -0
  140. data/lib/rubygems/security/signer.rb +1 -0
  141. data/lib/rubygems/security/trust_dir.rb +1 -0
  142. data/lib/rubygems/security.rb +1 -0
  143. data/lib/rubygems/security_option.rb +1 -0
  144. data/lib/rubygems/source/installed.rb +1 -0
  145. data/lib/rubygems/source/local.rb +1 -0
  146. data/lib/rubygems/source/lock.rb +1 -0
  147. data/lib/rubygems/source/specific_file.rb +1 -0
  148. data/lib/rubygems/source/vendor.rb +1 -0
  149. data/lib/rubygems/spec_fetcher.rb +1 -0
  150. data/lib/rubygems/specification.rb +9 -1
  151. data/lib/rubygems/specification_policy.rb +2 -0
  152. data/lib/rubygems/stub_specification.rb +1 -0
  153. data/lib/rubygems/uninstaller.rb +1 -0
  154. data/lib/rubygems/user_interaction.rb +2 -0
  155. data/lib/rubygems/util/licenses.rb +1 -0
  156. data/lib/rubygems/util/list.rb +1 -0
  157. data/lib/rubygems/util.rb +1 -0
  158. data/lib/rubygems/validator.rb +1 -0
  159. data/lib/rubygems/version_option.rb +1 -0
  160. data/lib/rubygems.rb +2 -1
  161. data/rubygems-update.gemspec +2 -1
  162. data/setup.rb +1 -0
  163. data/test/rubygems/bad_rake.rb +1 -0
  164. data/test/rubygems/bundler_test_gem.rb +3 -1
  165. data/test/rubygems/fake_certlib/openssl.rb +1 -0
  166. data/test/rubygems/good_rake.rb +1 -0
  167. data/test/rubygems/installer_test_case.rb +1 -0
  168. data/test/rubygems/multifactor_auth_utilities.rb +111 -0
  169. data/test/rubygems/package/tar_test_case.rb +1 -0
  170. data/test/rubygems/plugin/exception/rubygems_plugin.rb +1 -0
  171. data/test/rubygems/plugin/load/rubygems_plugin.rb +1 -0
  172. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +1 -0
  173. data/test/rubygems/rubygems/commands/crash_command.rb +1 -0
  174. data/test/rubygems/rubygems_plugin.rb +1 -0
  175. data/test/rubygems/simple_gem.rb +1 -0
  176. data/test/rubygems/specifications/bar-0.0.2.gemspec +2 -0
  177. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +2 -0
  178. data/test/rubygems/test_bundled_ca.rb +1 -0
  179. data/test/rubygems/test_config.rb +1 -0
  180. data/test/rubygems/test_deprecate.rb +1 -0
  181. data/test/rubygems/test_gem.rb +1 -0
  182. data/test/rubygems/test_gem_available_set.rb +1 -0
  183. data/test/rubygems/test_gem_bundler_version_finder.rb +1 -0
  184. data/test/rubygems/test_gem_command.rb +1 -0
  185. data/test/rubygems/test_gem_command_manager.rb +1 -0
  186. data/test/rubygems/test_gem_commands_build_command.rb +1 -0
  187. data/test/rubygems/test_gem_commands_cert_command.rb +1 -0
  188. data/test/rubygems/test_gem_commands_check_command.rb +1 -0
  189. data/test/rubygems/test_gem_commands_cleanup_command.rb +1 -0
  190. data/test/rubygems/test_gem_commands_contents_command.rb +1 -0
  191. data/test/rubygems/test_gem_commands_dependency_command.rb +1 -0
  192. data/test/rubygems/test_gem_commands_environment_command.rb +1 -0
  193. data/test/rubygems/test_gem_commands_exec_command.rb +2 -0
  194. data/test/rubygems/test_gem_commands_fetch_command.rb +1 -0
  195. data/test/rubygems/test_gem_commands_generate_index_command.rb +1 -0
  196. data/test/rubygems/test_gem_commands_help_command.rb +1 -0
  197. data/test/rubygems/test_gem_commands_info_command.rb +1 -0
  198. data/test/rubygems/test_gem_commands_install_command.rb +1 -0
  199. data/test/rubygems/test_gem_commands_list_command.rb +1 -0
  200. data/test/rubygems/test_gem_commands_lock_command.rb +1 -0
  201. data/test/rubygems/test_gem_commands_mirror.rb +1 -0
  202. data/test/rubygems/test_gem_commands_open_command.rb +1 -0
  203. data/test/rubygems/test_gem_commands_outdated_command.rb +1 -0
  204. data/test/rubygems/test_gem_commands_owner_command.rb +68 -39
  205. data/test/rubygems/test_gem_commands_pristine_command.rb +1 -0
  206. data/test/rubygems/test_gem_commands_push_command.rb +68 -37
  207. data/test/rubygems/test_gem_commands_query_command.rb +1 -0
  208. data/test/rubygems/test_gem_commands_search_command.rb +1 -0
  209. data/test/rubygems/test_gem_commands_server_command.rb +1 -0
  210. data/test/rubygems/test_gem_commands_setup_command.rb +1 -1
  211. data/test/rubygems/test_gem_commands_signin_command.rb +1 -0
  212. data/test/rubygems/test_gem_commands_sources_command.rb +1 -0
  213. data/test/rubygems/test_gem_commands_specification_command.rb +1 -0
  214. data/test/rubygems/test_gem_commands_stale_command.rb +1 -0
  215. data/test/rubygems/test_gem_commands_uninstall_command.rb +1 -0
  216. data/test/rubygems/test_gem_commands_unpack_command.rb +1 -0
  217. data/test/rubygems/test_gem_commands_update_command.rb +1 -0
  218. data/test/rubygems/test_gem_commands_which_command.rb +1 -0
  219. data/test/rubygems/test_gem_commands_yank_command.rb +76 -41
  220. data/test/rubygems/test_gem_config_file.rb +1 -0
  221. data/test/rubygems/test_gem_dependency.rb +1 -0
  222. data/test/rubygems/test_gem_dependency_installer.rb +1 -0
  223. data/test/rubygems/test_gem_dependency_list.rb +1 -0
  224. data/test/rubygems/test_gem_dependency_resolution_error.rb +1 -0
  225. data/test/rubygems/test_gem_doctor.rb +1 -0
  226. data/test/rubygems/test_gem_ext_builder.rb +4 -3
  227. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +2 -0
  228. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +2 -0
  229. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +2 -0
  230. data/test/rubygems/test_gem_ext_cargo_builder.rb +2 -2
  231. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +1 -0
  232. data/test/rubygems/test_gem_ext_cmake_builder.rb +1 -0
  233. data/test/rubygems/test_gem_ext_configure_builder.rb +1 -0
  234. data/test/rubygems/test_gem_ext_rake_builder.rb +1 -0
  235. data/test/rubygems/test_gem_gem_runner.rb +1 -0
  236. data/test/rubygems/test_gem_gemcutter_utilities.rb +106 -92
  237. data/test/rubygems/test_gem_impossible_dependencies_error.rb +1 -0
  238. data/test/rubygems/test_gem_indexer.rb +1 -0
  239. data/test/rubygems/test_gem_install_update_options.rb +1 -0
  240. data/test/rubygems/test_gem_installer.rb +2 -1
  241. data/test/rubygems/test_gem_local_remote_options.rb +1 -0
  242. data/test/rubygems/test_gem_name_tuple.rb +1 -0
  243. data/test/rubygems/test_gem_package_old.rb +1 -0
  244. data/test/rubygems/test_gem_package_tar_header.rb +1 -0
  245. data/test/rubygems/test_gem_package_tar_reader.rb +1 -0
  246. data/test/rubygems/test_gem_package_tar_reader_entry.rb +1 -0
  247. data/test/rubygems/test_gem_package_tar_writer.rb +1 -0
  248. data/test/rubygems/test_gem_package_task.rb +1 -0
  249. data/test/rubygems/test_gem_path_support.rb +1 -0
  250. data/test/rubygems/test_gem_platform.rb +1 -0
  251. data/test/rubygems/test_gem_rdoc.rb +1 -0
  252. data/test/rubygems/test_gem_remote_fetcher.rb +1 -0
  253. data/test/rubygems/test_gem_request.rb +1 -0
  254. data/test/rubygems/test_gem_request_connection_pools.rb +1 -0
  255. data/test/rubygems/test_gem_request_set.rb +1 -0
  256. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +1 -0
  257. data/test/rubygems/test_gem_request_set_lockfile.rb +1 -0
  258. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +1 -0
  259. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +1 -0
  260. data/test/rubygems/test_gem_requirement.rb +1 -0
  261. data/test/rubygems/test_gem_resolver.rb +1 -0
  262. data/test/rubygems/test_gem_resolver_activation_request.rb +1 -0
  263. data/test/rubygems/test_gem_resolver_api_set.rb +1 -0
  264. data/test/rubygems/test_gem_resolver_api_specification.rb +1 -0
  265. data/test/rubygems/test_gem_resolver_best_set.rb +1 -0
  266. data/test/rubygems/test_gem_resolver_composed_set.rb +1 -0
  267. data/test/rubygems/test_gem_resolver_conflict.rb +1 -0
  268. data/test/rubygems/test_gem_resolver_dependency_request.rb +1 -0
  269. data/test/rubygems/test_gem_resolver_git_set.rb +1 -0
  270. data/test/rubygems/test_gem_resolver_git_specification.rb +2 -1
  271. data/test/rubygems/test_gem_resolver_index_set.rb +1 -0
  272. data/test/rubygems/test_gem_resolver_index_specification.rb +1 -0
  273. data/test/rubygems/test_gem_resolver_installed_specification.rb +1 -0
  274. data/test/rubygems/test_gem_resolver_installer_set.rb +1 -0
  275. data/test/rubygems/test_gem_resolver_local_specification.rb +1 -0
  276. data/test/rubygems/test_gem_resolver_lock_set.rb +1 -0
  277. data/test/rubygems/test_gem_resolver_lock_specification.rb +1 -0
  278. data/test/rubygems/test_gem_resolver_requirement_list.rb +1 -0
  279. data/test/rubygems/test_gem_resolver_specification.rb +1 -0
  280. data/test/rubygems/test_gem_resolver_vendor_set.rb +1 -0
  281. data/test/rubygems/test_gem_resolver_vendor_specification.rb +1 -0
  282. data/test/rubygems/test_gem_security.rb +1 -0
  283. data/test/rubygems/test_gem_security_signer.rb +1 -0
  284. data/test/rubygems/test_gem_security_trust_dir.rb +1 -0
  285. data/test/rubygems/test_gem_silent_ui.rb +1 -0
  286. data/test/rubygems/test_gem_source.rb +1 -0
  287. data/test/rubygems/test_gem_source_fetch_problem.rb +1 -0
  288. data/test/rubygems/test_gem_source_git.rb +1 -0
  289. data/test/rubygems/test_gem_source_installed.rb +1 -0
  290. data/test/rubygems/test_gem_source_list.rb +1 -0
  291. data/test/rubygems/test_gem_source_local.rb +1 -0
  292. data/test/rubygems/test_gem_source_lock.rb +1 -0
  293. data/test/rubygems/test_gem_source_specific_file.rb +1 -0
  294. data/test/rubygems/test_gem_source_subpath_problem.rb +1 -0
  295. data/test/rubygems/test_gem_source_vendor.rb +1 -0
  296. data/test/rubygems/test_gem_spec_fetcher.rb +1 -0
  297. data/test/rubygems/test_gem_specification.rb +9 -0
  298. data/test/rubygems/test_gem_stream_ui.rb +34 -3
  299. data/test/rubygems/test_gem_stub_specification.rb +1 -0
  300. data/test/rubygems/test_gem_text.rb +1 -0
  301. data/test/rubygems/test_gem_uninstaller.rb +1 -0
  302. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +1 -0
  303. data/test/rubygems/test_gem_update_suggestion.rb +1 -0
  304. data/test/rubygems/test_gem_uri.rb +2 -0
  305. data/test/rubygems/test_gem_uri_formatter.rb +1 -0
  306. data/test/rubygems/test_gem_util.rb +1 -0
  307. data/test/rubygems/test_gem_version.rb +1 -0
  308. data/test/rubygems/test_gem_version_option.rb +1 -0
  309. data/test/rubygems/test_kernel.rb +1 -0
  310. data/test/rubygems/test_remote_fetch_error.rb +1 -0
  311. data/test/rubygems/test_require.rb +1 -0
  312. data/test/rubygems/test_rubygems.rb +2 -0
  313. data/test/rubygems/test_webauthn_listener.rb +29 -6
  314. data/test/rubygems/test_webauthn_listener_response.rb +8 -8
  315. data/test/rubygems/test_webauthn_poller.rb +124 -0
  316. data/test/rubygems/utilities.rb +1 -0
  317. data/test/test_changelog_generator.rb +1 -1
  318. metadata +11 -8
  319. data/lib/rubygems/webauthn_listener/response.rb +0 -161
  320. data/lib/rubygems/webauthn_listener.rb +0 -92
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/installer"
4
5
  require "rubygems/resolver"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemResolverRequirementList < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemResolverSpecification < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemResolverVendorSet < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemResolverVendorSpecification < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/security"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  unless Gem::HAVE_OPENSSL
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  unless Gem::HAVE_OPENSSL
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/user_interaction"
4
5
  require "timeout"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/source"
4
5
  require "rubygems/indexer"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemSourceFetchProblem < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/source"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/source"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "rubygems"
3
4
  require "rubygems/source_list"
4
5
  require_relative "helper"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/source"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemSourceLock < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/source"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/source"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/source"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/spec_fetcher"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "benchmark"
3
4
  require_relative "helper"
4
5
  require "date"
@@ -1068,19 +1069,27 @@ dependencies: []
1068
1069
  end
1069
1070
 
1070
1071
  def test_handles_private_null_type
1072
+ yaml_defined = Object.const_defined?("YAML")
1073
+
1071
1074
  path = File.expand_path "data/pry-0.4.7.gemspec.rz", __dir__
1072
1075
 
1073
1076
  data = Marshal.load Gem::Util.inflate(Gem.read_binary(path))
1074
1077
 
1075
1078
  assert_instance_of Gem::Specification, data
1079
+
1080
+ assert_equal(yaml_defined, Object.const_defined?("YAML"))
1076
1081
  end
1077
1082
 
1078
1083
  def test_handles_dependencies_with_syck_requirements_bug
1084
+ yaml_defined = Object.const_defined?("YAML")
1085
+
1079
1086
  path = File.expand_path "data/excon-0.7.7.gemspec.rz", __dir__
1080
1087
 
1081
1088
  data = Marshal.load Gem::Util.inflate(Gem.read_binary(path))
1082
1089
 
1083
1090
  assert_instance_of Gem::Specification, data
1091
+
1092
+ assert_equal(yaml_defined, Object.const_defined?("YAML"))
1084
1093
  end
1085
1094
 
1086
1095
  def test_initialize
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/user_interaction"
4
5
  require "timeout"
5
6
 
6
7
  class TestGemStreamUI < Gem::TestCase
7
- # increase timeout with MJIT for --jit-wait testing
8
- mjit_enabled = defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?
9
- SHORT_TIMEOUT = (RUBY_ENGINE == "ruby" && !mjit_enabled) ? 0.1 : 1.0
8
+ # increase timeout with RJIT for --jit-wait testing
9
+ rjit_enabled = defined?(RubyVM::RJIT) && RubyVM::RJIT.enabled?
10
+ SHORT_TIMEOUT = (RUBY_ENGINE == "ruby" && !rjit_enabled) ? 0.1 : 1.0
10
11
 
11
12
  module IsTty
12
13
  attr_accessor :tty
@@ -113,6 +114,36 @@ class TestGemStreamUI < Gem::TestCase
113
114
  assert_equal "which one?\n 1. foo\n 2. bar\n> ", @out.string
114
115
  end
115
116
 
117
+ def test_choose_from_list_0
118
+ @in.puts "0"
119
+ @in.rewind
120
+
121
+ result = @sui.choose_from_list "which one?", %w[foo bar]
122
+
123
+ assert_equal [nil, nil], result
124
+ assert_equal "which one?\n 1. foo\n 2. bar\n> ", @out.string
125
+ end
126
+
127
+ def test_choose_from_list_over
128
+ @in.puts "3"
129
+ @in.rewind
130
+
131
+ result = @sui.choose_from_list "which one?", %w[foo bar]
132
+
133
+ assert_equal [nil, nil], result
134
+ assert_equal "which one?\n 1. foo\n 2. bar\n> ", @out.string
135
+ end
136
+
137
+ def test_choose_from_list_negative
138
+ @in.puts "-1"
139
+ @in.rewind
140
+
141
+ result = @sui.choose_from_list "which one?", %w[foo bar]
142
+
143
+ assert_equal [nil, nil], result
144
+ assert_equal "which one?\n 1. foo\n 2. bar\n> ", @out.string
145
+ end
146
+
116
147
  def test_progress_reporter_silent_nil
117
148
  @cfg.verbose = nil
118
149
  reporter = @sui.progress_reporter 10, "hi"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/stub_specification"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/text"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "installer_test_case"
3
4
  require "rubygems/uninstaller"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemUnsatisfiableDependencyError < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/command"
4
5
  require "rubygems/update_suggestion"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "helper"
2
4
  require "rubygems/uri"
3
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/uri_formatter"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/util"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/version"
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems/command"
4
5
  require "rubygems/version_option"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemKernel < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
 
4
5
  class TestGemRemoteFetchError < Gem::TestCase
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative "helper"
3
4
  require "rubygems"
4
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "helper"
2
4
 
3
5
  class GemTest < Gem::TestCase
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "helper"
4
- require "rubygems/webauthn_listener"
4
+ require "rubygems/gemcutter_utilities/webauthn_listener"
5
+ require "rubygems/gemcutter_utilities"
5
6
 
6
7
  class WebauthnListenerTest < Gem::TestCase
7
8
  def setup
@@ -10,6 +11,28 @@ class WebauthnListenerTest < Gem::TestCase
10
11
  @port = @server.addr[1].to_s
11
12
  end
12
13
 
14
+ def teardown
15
+ @thread.kill.join if @thread
16
+ @server&.close
17
+ super
18
+ end
19
+
20
+ def test_listener_thread_retreives_otp_code
21
+ thread = Gem::GemcutterUtilities::WebauthnListener.listener_thread(Gem.host, @server)
22
+ Gem::MockBrowser.get URI("http://localhost:#{@port}?code=xyz")
23
+
24
+ thread.join
25
+ assert_equal "xyz", thread[:otp]
26
+ end
27
+
28
+ def test_listener_thread_sets_error
29
+ thread = Gem::GemcutterUtilities::WebauthnListener.listener_thread(Gem.host, @server)
30
+ Gem::MockBrowser.post URI("http://localhost:#{@port}?code=xyz")
31
+
32
+ thread.join
33
+ assert_equal "Security device verification failed: Invalid HTTP method POST received.", thread[:error].message
34
+ end
35
+
13
36
  def test_wait_for_otp_code_get_follows_options
14
37
  wait_for_otp_code
15
38
  assert Gem::MockBrowser.options(URI("http://localhost:#{@port}?code=xyz")).is_a? Net::HTTPNoContent
@@ -32,7 +55,7 @@ class WebauthnListenerTest < Gem::TestCase
32
55
  response = Gem::MockBrowser.get URI("http://localhost:#{@port}?code=xyz")
33
56
 
34
57
  assert response.is_a? Net::HTTPOK
35
- assert_equal "text/plain", response["Content-Type"]
58
+ assert_equal "text/plain; charset=utf-8", response["Content-Type"]
36
59
  assert_equal "7", response["Content-Length"]
37
60
  assert_equal Gem.host, response["access-control-allow-origin"]
38
61
  assert_equal "POST", response["access-control-allow-methods"]
@@ -73,7 +96,7 @@ class WebauthnListenerTest < Gem::TestCase
73
96
  response = Gem::MockBrowser.get URI("http://localhost:#{@port}")
74
97
 
75
98
  assert response.is_a? Net::HTTPBadRequest
76
- assert_equal "text/plain", response["Content-Type"]
99
+ assert_equal "text/plain; charset=utf-8", response["Content-Type"]
77
100
  assert_equal "22", response["Content-Length"]
78
101
  assert_equal "close", response["Connection"]
79
102
  assert_equal "missing code parameter", response.body
@@ -87,7 +110,7 @@ class WebauthnListenerTest < Gem::TestCase
87
110
  response = Gem::MockBrowser.get URI("http://localhost:#{@port}?param=xyz")
88
111
 
89
112
  assert response.is_a? Net::HTTPBadRequest
90
- assert_equal "text/plain", response["Content-Type"]
113
+ assert_equal "text/plain; charset=utf-8", response["Content-Type"]
91
114
  assert_equal "22", response["Content-Length"]
92
115
  assert_equal "close", response["Connection"]
93
116
  assert_equal "missing code parameter", response.body
@@ -100,7 +123,7 @@ class WebauthnListenerTest < Gem::TestCase
100
123
 
101
124
  def wait_for_otp_code
102
125
  @thread = Thread.new do
103
- Thread.current[:otp] = Gem::WebauthnListener.wait_for_otp_code(Gem.host, @server)
126
+ Thread.current[:otp] = Gem::GemcutterUtilities::WebauthnListener.new(Gem.host).wait_for_otp_code(@server)
104
127
  end
105
128
  @thread.abort_on_exception = true
106
129
  @thread.report_on_exception = false
@@ -109,7 +132,7 @@ class WebauthnListenerTest < Gem::TestCase
109
132
  def wait_for_otp_code_expect_error_with_message(message)
110
133
  @thread = Thread.new do
111
134
  error = assert_raise Gem::WebauthnVerificationError do
112
- Thread.current[:otp] = Gem::WebauthnListener.wait_for_otp_code(Gem.host, @server)
135
+ Thread.current[:otp] = Gem::GemcutterUtilities::WebauthnListener.new(Gem.host).wait_for_otp_code(@server)
113
136
  end
114
137
 
115
138
  assert_equal message, error.message
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "helper"
4
- require "rubygems/webauthn_listener/response"
4
+ require "rubygems/gemcutter_utilities/webauthn_listener/response"
5
5
 
6
6
  class WebauthnListenerResponseTest < Gem::TestCase
7
7
  def setup
@@ -10,7 +10,7 @@ class WebauthnListenerResponseTest < Gem::TestCase
10
10
  end
11
11
 
12
12
  def test_ok_response_to_s
13
- to_s = Gem::WebauthnListener::OkResponse.new(@host).to_s
13
+ to_s = Gem::GemcutterUtilities::WebauthnListener::OkResponse.new(@host).to_s
14
14
 
15
15
  expected_to_s = <<~RESPONSE
16
16
  HTTP/1.1 200 OK\r
@@ -18,7 +18,7 @@ class WebauthnListenerResponseTest < Gem::TestCase
18
18
  access-control-allow-origin: rubygems.example\r
19
19
  access-control-allow-methods: POST\r
20
20
  access-control-allow-headers: Content-Type, Authorization, x-csrf-token\r
21
- content-type: text/plain\r
21
+ content-type: text/plain; charset=utf-8\r
22
22
  content-length: 7\r
23
23
  \r
24
24
  success
@@ -28,7 +28,7 @@ class WebauthnListenerResponseTest < Gem::TestCase
28
28
  end
29
29
 
30
30
  def test_no_to_s_response_to_s
31
- to_s = Gem::WebauthnListener::NoContentResponse.new(@host).to_s
31
+ to_s = Gem::GemcutterUtilities::WebauthnListener::NoContentResponse.new(@host).to_s
32
32
 
33
33
  expected_to_s = <<~RESPONSE
34
34
  HTTP/1.1 204 No Content\r
@@ -43,7 +43,7 @@ class WebauthnListenerResponseTest < Gem::TestCase
43
43
  end
44
44
 
45
45
  def test_method_not_allowed_response_to_s
46
- to_s = Gem::WebauthnListener::MethodNotAllowedResponse.new(@host).to_s
46
+ to_s = Gem::GemcutterUtilities::WebauthnListener::MethodNotAllowedResponse.new(@host).to_s
47
47
 
48
48
  expected_to_s = <<~RESPONSE
49
49
  HTTP/1.1 405 Method Not Allowed\r
@@ -59,7 +59,7 @@ class WebauthnListenerResponseTest < Gem::TestCase
59
59
  end
60
60
 
61
61
  def test_method_not_found_response_to_s
62
- to_s = Gem::WebauthnListener::NotFoundResponse.new(@host).to_s
62
+ to_s = Gem::GemcutterUtilities::WebauthnListener::NotFoundResponse.new(@host).to_s
63
63
 
64
64
  expected_to_s = <<~RESPONSE
65
65
  HTTP/1.1 404 Not Found\r
@@ -74,7 +74,7 @@ class WebauthnListenerResponseTest < Gem::TestCase
74
74
  end
75
75
 
76
76
  def test_bad_request_response_to_s
77
- to_s = Gem::WebauthnListener::BadRequestResponse.new(@host).to_s
77
+ to_s = Gem::GemcutterUtilities::WebauthnListener::BadRequestResponse.new(@host).to_s
78
78
 
79
79
  expected_to_s = <<~RESPONSE
80
80
  HTTP/1.1 400 Bad Request\r
@@ -82,7 +82,7 @@ class WebauthnListenerResponseTest < Gem::TestCase
82
82
  access-control-allow-origin: rubygems.example\r
83
83
  access-control-allow-methods: POST\r
84
84
  access-control-allow-headers: Content-Type, Authorization, x-csrf-token\r
85
- content-type: text/plain\r
85
+ content-type: text/plain; charset=utf-8\r
86
86
  content-length: 22\r
87
87
  \r
88
88
  missing code parameter
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "helper"
4
+ require "rubygems/gemcutter_utilities/webauthn_poller"
5
+ require "rubygems/gemcutter_utilities"
6
+
7
+ class WebauthnPollerTest < Gem::TestCase
8
+ def setup
9
+ super
10
+
11
+ @host = Gem.host
12
+ @webauthn_url = "#{@host}/api/v1/webauthn_verification/odow34b93t6aPCdY"
13
+ @fetcher = Gem::FakeFetcher.new
14
+ Gem::RemoteFetcher.fetcher = @fetcher
15
+ @credentials = {
16
+ email: "email@example.com",
17
+ password: "password",
18
+ }
19
+ end
20
+
21
+ def test_poll_thread_success
22
+ @fetcher.data["#{@webauthn_url}/status.json"] = Gem::HTTPResponseFactory.create(
23
+ body: "{\"status\":\"success\",\"code\":\"Uvh6T57tkWuUnWYo\"}",
24
+ code: 200,
25
+ msg: "OK"
26
+ )
27
+
28
+ thread = Gem::GemcutterUtilities::WebauthnPoller.poll_thread({}, @host, @webauthn_url, @credentials)
29
+ thread.join
30
+
31
+ assert_equal thread[:otp], "Uvh6T57tkWuUnWYo"
32
+ end
33
+
34
+ def test_poll_thread_webauthn_verification_error
35
+ @fetcher.data["#{@webauthn_url}/status.json"] = Gem::HTTPResponseFactory.create(
36
+ body: "HTTP Basic: Access denied.",
37
+ code: 401,
38
+ msg: "Unauthorized"
39
+ )
40
+
41
+ thread = Gem::GemcutterUtilities::WebauthnPoller.poll_thread({}, @host, @webauthn_url, @credentials)
42
+ thread.join
43
+
44
+ assert_equal thread[:error].message, "Security device verification failed: Unauthorized"
45
+ end
46
+
47
+ def test_poll_thread_timeout_error
48
+ raise_error = ->(*_args) { raise Timeout::Error, "execution expired" }
49
+ Timeout.stub(:timeout, raise_error) do
50
+ thread = Gem::GemcutterUtilities::WebauthnPoller.poll_thread({}, @host, @webauthn_url, @credentials)
51
+ thread.join
52
+ assert_equal thread[:error].message, "execution expired"
53
+ end
54
+ end
55
+
56
+ def test_poll_for_otp_success
57
+ @fetcher.data["#{@webauthn_url}/status.json"] = Gem::HTTPResponseFactory.create(
58
+ body: "{\"status\":\"success\",\"code\":\"Uvh6T57tkWuUnWYo\"}",
59
+ code: 200,
60
+ msg: "OK"
61
+ )
62
+
63
+ otp = Gem::GemcutterUtilities::WebauthnPoller.new({}, @host).poll_for_otp(@webauthn_url, @credentials)
64
+
65
+ assert_equal otp, "Uvh6T57tkWuUnWYo"
66
+ end
67
+
68
+ def test_poll_for_otp_pending_sleeps
69
+ @fetcher.data["#{@webauthn_url}/status.json"] = Gem::HTTPResponseFactory.create(
70
+ body: "{\"status\":\"pending\",\"message\":\"Security device authentication is still pending.\"}",
71
+ code: 200,
72
+ msg: "OK"
73
+ )
74
+
75
+ assert_raise Timeout::Error do
76
+ Timeout.timeout(0.1) do
77
+ Gem::GemcutterUtilities::WebauthnPoller.new({}, @host).poll_for_otp(@webauthn_url, @credentials)
78
+ end
79
+ end
80
+ end
81
+
82
+ def test_poll_for_otp_not_http_success
83
+ @fetcher.data["#{@webauthn_url}/status.json"] = Gem::HTTPResponseFactory.create(
84
+ body: "HTTP Basic: Access denied.",
85
+ code: 401,
86
+ msg: "Unauthorized"
87
+ )
88
+
89
+ error = assert_raise Gem::WebauthnVerificationError do
90
+ Gem::GemcutterUtilities::WebauthnPoller.new({}, @host).poll_for_otp(@webauthn_url, @credentials)
91
+ end
92
+
93
+ assert_equal error.message, "Security device verification failed: Unauthorized"
94
+ end
95
+
96
+ def test_poll_for_otp_invalid_format
97
+ @fetcher.data["#{@webauthn_url}/status.json"] = Gem::HTTPResponseFactory.create(
98
+ body: "{}",
99
+ code: 200,
100
+ msg: "OK"
101
+ )
102
+
103
+ error = assert_raise Gem::WebauthnVerificationError do
104
+ Gem::GemcutterUtilities::WebauthnPoller.new({}, @host).poll_for_otp(@webauthn_url, @credentials)
105
+ end
106
+
107
+ assert_equal error.message, "Security device verification failed: Invalid response from server"
108
+ end
109
+
110
+ def test_poll_for_otp_invalid_status
111
+ @fetcher.data["#{@webauthn_url}/status.json"] = Gem::HTTPResponseFactory.create(
112
+ body: "{\"status\":\"expired\",\"message\":\"The token in the link you used has either expired or been used already.\"}",
113
+ code: 200,
114
+ msg: "OK"
115
+ )
116
+
117
+ error = assert_raise Gem::WebauthnVerificationError do
118
+ Gem::GemcutterUtilities::WebauthnPoller.new({}, @host).poll_for_otp(@webauthn_url, @credentials)
119
+ end
120
+
121
+ assert_equal error.message,
122
+ "Security device verification failed: The token in the link you used has either expired or been used already."
123
+ end
124
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "tempfile"
3
4
  require "rubygems"
4
5
  require "rubygems/remote_fetcher"
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../util/changelog"
3
+ require_relative "../tool/changelog"
4
4
  require "rubygems/commands/setup_command"
5
5
  require_relative "rubygems/helper"
6
6