rubygems-update 3.2.26 → 3.2.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -0
  3. data/Manifest.txt +12 -3
  4. data/bundler/CHANGELOG.md +50 -1
  5. data/bundler/README.md +1 -1
  6. data/bundler/lib/bundler/build_metadata.rb +2 -2
  7. data/bundler/lib/bundler/cli/check.rb +1 -1
  8. data/bundler/lib/bundler/cli/gem.rb +19 -2
  9. data/bundler/lib/bundler/cli/info.rb +11 -4
  10. data/bundler/lib/bundler/cli/issue.rb +4 -3
  11. data/bundler/lib/bundler/cli/remove.rb +1 -2
  12. data/bundler/lib/bundler/cli.rb +1 -0
  13. data/bundler/lib/bundler/compact_index_client.rb +2 -2
  14. data/bundler/lib/bundler/definition.rb +16 -6
  15. data/bundler/lib/bundler/digest.rb +71 -0
  16. data/bundler/lib/bundler/errors.rb +18 -2
  17. data/bundler/lib/bundler/fetcher.rb +2 -1
  18. data/bundler/lib/bundler/friendly_errors.rb +5 -30
  19. data/bundler/lib/bundler/gem_helper.rb +6 -17
  20. data/bundler/lib/bundler/installer.rb +0 -1
  21. data/bundler/lib/bundler/plugin/installer.rb +2 -0
  22. data/bundler/lib/bundler/plugin.rb +23 -6
  23. data/bundler/lib/bundler/rubygems_ext.rb +4 -0
  24. data/bundler/lib/bundler/rubygems_gem_installer.rb +20 -4
  25. data/bundler/lib/bundler/rubygems_integration.rb +28 -9
  26. data/bundler/lib/bundler/runtime.rb +1 -1
  27. data/bundler/lib/bundler/settings.rb +9 -1
  28. data/bundler/lib/bundler/source/git.rb +22 -4
  29. data/bundler/lib/bundler/source/rubygems.rb +43 -72
  30. data/bundler/lib/bundler/source.rb +2 -0
  31. data/bundler/lib/bundler/source_list.rb +4 -0
  32. data/bundler/lib/bundler/spec_set.rb +1 -1
  33. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +2 -1
  34. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  35. data/bundler/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  36. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
  37. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  38. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +57 -0
  39. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +39 -74
  40. data/bundler/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  41. data/bundler/lib/bundler/vendor/molinillo/LICENSE +9 -0
  42. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  43. data/bundler/lib/bundler/vendor/thor/LICENSE.md +20 -0
  44. data/bundler/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  45. data/bundler/lib/bundler/version.rb +1 -1
  46. data/bundler/lib/bundler/worker.rb +2 -2
  47. data/bundler/lib/bundler.rb +13 -18
  48. data/lib/rubygems/command_manager.rb +3 -3
  49. data/lib/rubygems/commands/build_command.rb +3 -3
  50. data/lib/rubygems/commands/cert_command.rb +15 -8
  51. data/lib/rubygems/commands/check_command.rb +4 -4
  52. data/lib/rubygems/commands/cleanup_command.rb +3 -3
  53. data/lib/rubygems/commands/contents_command.rb +2 -2
  54. data/lib/rubygems/commands/dependency_command.rb +3 -3
  55. data/lib/rubygems/commands/environment_command.rb +1 -1
  56. data/lib/rubygems/commands/fetch_command.rb +3 -3
  57. data/lib/rubygems/commands/generate_index_command.rb +2 -2
  58. data/lib/rubygems/commands/help_command.rb +1 -1
  59. data/lib/rubygems/commands/info_command.rb +2 -2
  60. data/lib/rubygems/commands/install_command.rb +12 -11
  61. data/lib/rubygems/commands/list_command.rb +2 -2
  62. data/lib/rubygems/commands/lock_command.rb +1 -1
  63. data/lib/rubygems/commands/mirror_command.rb +1 -1
  64. data/lib/rubygems/commands/open_command.rb +2 -2
  65. data/lib/rubygems/commands/outdated_command.rb +4 -4
  66. data/lib/rubygems/commands/owner_command.rb +4 -4
  67. data/lib/rubygems/commands/pristine_command.rb +5 -5
  68. data/lib/rubygems/commands/push_command.rb +4 -4
  69. data/lib/rubygems/commands/query_command.rb +3 -3
  70. data/lib/rubygems/commands/rdoc_command.rb +3 -3
  71. data/lib/rubygems/commands/search_command.rb +2 -2
  72. data/lib/rubygems/commands/server_command.rb +3 -3
  73. data/lib/rubygems/commands/setup_command.rb +6 -6
  74. data/lib/rubygems/commands/signin_command.rb +2 -2
  75. data/lib/rubygems/commands/signout_command.rb +1 -1
  76. data/lib/rubygems/commands/sources_command.rb +4 -4
  77. data/lib/rubygems/commands/specification_command.rb +4 -4
  78. data/lib/rubygems/commands/stale_command.rb +1 -1
  79. data/lib/rubygems/commands/uninstall_command.rb +3 -3
  80. data/lib/rubygems/commands/unpack_command.rb +5 -5
  81. data/lib/rubygems/commands/update_command.rb +9 -9
  82. data/lib/rubygems/commands/which_command.rb +1 -1
  83. data/lib/rubygems/commands/yank_command.rb +4 -4
  84. data/lib/rubygems/config_file.rb +1 -1
  85. data/lib/rubygems/core_ext/tcpsocket_init.rb +2 -2
  86. data/lib/rubygems/defaults.rb +1 -1
  87. data/lib/rubygems/dependency_installer.rb +8 -8
  88. data/lib/rubygems/dependency_list.rb +1 -1
  89. data/lib/rubygems/doctor.rb +2 -2
  90. data/lib/rubygems/errors.rb +1 -2
  91. data/lib/rubygems/exceptions.rb +1 -1
  92. data/lib/rubygems/gem_runner.rb +3 -3
  93. data/lib/rubygems/gemcutter_utilities.rb +2 -2
  94. data/lib/rubygems/indexer.rb +2 -2
  95. data/lib/rubygems/install_default_message.rb +2 -2
  96. data/lib/rubygems/install_message.rb +2 -2
  97. data/lib/rubygems/install_update_options.rb +2 -2
  98. data/lib/rubygems/installer.rb +8 -8
  99. data/lib/rubygems/local_remote_options.rb +1 -1
  100. data/lib/rubygems/mock_gem_ui.rb +1 -1
  101. data/lib/rubygems/package/tar_reader.rb +1 -1
  102. data/lib/rubygems/package.rb +36 -46
  103. data/lib/rubygems/package_task.rb +2 -2
  104. data/lib/rubygems/platform.rb +2 -1
  105. data/lib/rubygems/query_utils.rb +4 -4
  106. data/lib/rubygems/rdoc.rb +1 -1
  107. data/lib/rubygems/remote_fetcher.rb +16 -22
  108. data/lib/rubygems/request/connection_pools.rb +1 -1
  109. data/lib/rubygems/request/http_pool.rb +1 -1
  110. data/lib/rubygems/request.rb +7 -5
  111. data/lib/rubygems/request_set/lockfile/tokenizer.rb +1 -1
  112. data/lib/rubygems/request_set/lockfile.rb +1 -1
  113. data/lib/rubygems/request_set.rb +5 -5
  114. data/lib/rubygems/requirement.rb +1 -1
  115. data/lib/rubygems/resolver/git_specification.rb +1 -1
  116. data/lib/rubygems/resolver/installer_set.rb +3 -3
  117. data/lib/rubygems/resolver/molinillo/LICENSE +9 -0
  118. data/lib/rubygems/resolver/molinillo.rb +1 -1
  119. data/lib/rubygems/resolver/set.rb +0 -1
  120. data/lib/rubygems/resolver/specification.rb +1 -1
  121. data/lib/rubygems/resolver.rb +31 -31
  122. data/lib/rubygems/s3_uri_signer.rb +4 -5
  123. data/lib/rubygems/security/policy.rb +6 -4
  124. data/lib/rubygems/security/signer.rb +4 -5
  125. data/lib/rubygems/security.rb +54 -20
  126. data/lib/rubygems/security_option.rb +2 -2
  127. data/lib/rubygems/server.rb +2 -2
  128. data/lib/rubygems/source/git.rb +2 -2
  129. data/lib/rubygems/source.rb +7 -7
  130. data/lib/rubygems/spec_fetcher.rb +5 -5
  131. data/lib/rubygems/specification.rb +12 -12
  132. data/lib/rubygems/specification_policy.rb +2 -2
  133. data/lib/rubygems/uninstaller.rb +6 -6
  134. data/lib/rubygems/uri.rb +111 -0
  135. data/lib/rubygems/user_interaction.rb +3 -3
  136. data/lib/rubygems/util/licenses.rb +1 -1
  137. data/lib/rubygems/util.rb +1 -1
  138. data/lib/rubygems/validator.rb +2 -2
  139. data/lib/rubygems/version_option.rb +1 -1
  140. data/lib/rubygems.rb +16 -16
  141. data/rubygems-update.gemspec +1 -1
  142. data/test/rubygems/helper.rb +4 -12
  143. data/test/rubygems/private_ec_key.pem +9 -0
  144. data/test/rubygems/test_gem.rb +59 -71
  145. data/test/rubygems/test_gem_commands_cert_command.rb +63 -4
  146. data/test/rubygems/test_gem_commands_install_command.rb +25 -0
  147. data/test/rubygems/test_gem_package.rb +27 -26
  148. data/test/rubygems/test_gem_platform.rb +1 -0
  149. data/test/rubygems/test_gem_remote_fetcher.rb +30 -0
  150. data/test/rubygems/test_gem_request.rb +35 -9
  151. data/test/rubygems/test_gem_resolver_installer_set.rb +18 -0
  152. data/test/rubygems/test_gem_security.rb +32 -4
  153. data/test/rubygems/test_gem_source_fetch_problem.rb +10 -0
  154. data/test/rubygems/test_gem_specification.rb +228 -232
  155. data/test/rubygems/test_gem_uri.rb +39 -0
  156. metadata +18 -9
  157. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
  158. data/lib/rubygems/uri_parser.rb +0 -34
  159. data/lib/rubygems/uri_parsing.rb +0 -23
data/lib/rubygems.rb CHANGED
@@ -8,15 +8,15 @@
8
8
  require 'rbconfig'
9
9
 
10
10
  module Gem
11
- VERSION = "3.2.26".freeze
11
+ VERSION = "3.2.30".freeze
12
12
  end
13
13
 
14
14
  # Must be first since it unloads the prelude from 1.9.2
15
- require 'rubygems/compatibility'
15
+ require_relative 'rubygems/compatibility'
16
16
 
17
- require 'rubygems/defaults'
18
- require 'rubygems/deprecate'
19
- require 'rubygems/errors'
17
+ require_relative 'rubygems/defaults'
18
+ require_relative 'rubygems/deprecate'
19
+ require_relative 'rubygems/errors'
20
20
 
21
21
  ##
22
22
  # RubyGems is the Ruby standard for publishing and managing third party
@@ -178,7 +178,7 @@ module Gem
178
178
  @configuration = nil
179
179
  @gemdeps = nil
180
180
  @loaded_specs = {}
181
- LOADED_SPECS_MUTEX = Mutex.new
181
+ LOADED_SPECS_MUTEX = Thread::Mutex.new
182
182
  @path_to_default_spec_map = {}
183
183
  @platforms = []
184
184
  @ruby = nil
@@ -559,7 +559,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
559
559
  # => [#<Gem::Specification:0x1013b4528 @name="minitest", ...>]
560
560
 
561
561
  def self.install(name, version = Gem::Requirement.default, *options)
562
- require "rubygems/dependency_installer"
562
+ require_relative "rubygems/dependency_installer"
563
563
  inst = Gem::DependencyInstaller.new(*options)
564
564
  inst.install name, version
565
565
  inst.installed_gems
@@ -625,12 +625,12 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
625
625
  rescue ::LoadError
626
626
  # If we can't load psych, that's fine, go on.
627
627
  else
628
- require 'rubygems/psych_additions'
629
- require 'rubygems/psych_tree'
628
+ require_relative 'rubygems/psych_additions'
629
+ require_relative 'rubygems/psych_tree'
630
630
  end
631
631
 
632
632
  require 'yaml'
633
- require 'rubygems/safe_yaml'
633
+ require_relative 'rubygems/safe_yaml'
634
634
 
635
635
  @yaml_loaded = true
636
636
  end
@@ -990,7 +990,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
990
990
  # Lazily loads DefaultUserInteraction and returns the default UI.
991
991
 
992
992
  def self.ui
993
- require 'rubygems/user_interaction'
993
+ require_relative 'rubygems/user_interaction'
994
994
 
995
995
  Gem::DefaultUserInteraction.ui
996
996
  end
@@ -1110,7 +1110,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
1110
1110
  end
1111
1111
 
1112
1112
  ENV["BUNDLE_GEMFILE"] ||= File.expand_path(path)
1113
- require 'rubygems/user_interaction'
1113
+ require_relative 'rubygems/user_interaction'
1114
1114
  require "bundler"
1115
1115
  begin
1116
1116
  Gem::DefaultUserInteraction.use_ui(ui) do
@@ -1322,7 +1322,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
1322
1322
  autoload :Version, File.expand_path('rubygems/version', __dir__)
1323
1323
  end
1324
1324
 
1325
- require 'rubygems/exceptions'
1325
+ require_relative 'rubygems/exceptions'
1326
1326
 
1327
1327
  # REFACTOR: This should be pulled out into some kind of hacks file.
1328
1328
  begin
@@ -1353,6 +1353,6 @@ end
1353
1353
  # Loads the default specs.
1354
1354
  Gem::Specification.load_defaults
1355
1355
 
1356
- require 'rubygems/core_ext/kernel_gem'
1357
- require 'rubygems/core_ext/kernel_require'
1358
- require 'rubygems/core_ext/kernel_warn'
1356
+ require_relative 'rubygems/core_ext/kernel_gem'
1357
+ require_relative 'rubygems/core_ext/kernel_require'
1358
+ require_relative 'rubygems/core_ext/kernel_warn'
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "rubygems-update"
5
- s.version = "3.2.26"
5
+ s.version = "3.2.30"
6
6
  s.authors = ["Jim Weirich", "Chad Fowler", "Eric Hodel", "Luis Lavena", "Aaron Patterson", "Samuel Giddins", "André Arko", "Evan Phoenix", "Hiroshi SHIBATA"]
7
7
  s.email = ["", "", "drbrain@segment7.net", "luislavena@gmail.com", "aaron@tenderlovemaking.com", "segiddins@segiddins.me", "andre@arko.net", "evan@phx.io", "hsbt@ruby-lang.org"]
8
8
 
@@ -398,6 +398,7 @@ class Gem::TestCase < Test::Unit::TestCase
398
398
 
399
399
  ENV['GEM_PRIVATE_KEY_PASSPHRASE'] = PRIVATE_KEY_PASSPHRASE
400
400
 
401
+ Gem.instance_variable_set(:@default_specifications_dir, nil)
401
402
  if Gem.java_platform?
402
403
  @orig_default_gem_home = RbConfig::CONFIG['default_gem_home']
403
404
  RbConfig::CONFIG['default_gem_home'] = @gemhome
@@ -481,6 +482,7 @@ class Gem::TestCase < Test::Unit::TestCase
481
482
 
482
483
  RbConfig::CONFIG['bindir'] = @orig_bindir
483
484
 
485
+ Gem.instance_variable_set :@default_specifications_dir, nil
484
486
  if Gem.java_platform?
485
487
  RbConfig::CONFIG['default_gem_home'] = @orig_default_gem_home
486
488
  else
@@ -825,16 +827,6 @@ class Gem::TestCase < Test::Unit::TestCase
825
827
  Gem::Specification.unresolved_deps.values.map(&:to_s).sort
826
828
  end
827
829
 
828
- def save_loaded_features
829
- old_loaded_features = $LOADED_FEATURES.dup
830
- yield
831
- ensure
832
- prefix = File.dirname(__FILE__) + "/"
833
- new_features = ($LOADED_FEATURES - old_loaded_features)
834
- old_loaded_features.concat(new_features.select {|f| f.rindex(prefix, 0) })
835
- $LOADED_FEATURES.replace old_loaded_features
836
- end
837
-
838
830
  def new_default_spec(name, version, deps = nil, *files)
839
831
  spec = util_spec name, version, deps
840
832
 
@@ -1529,14 +1521,14 @@ Also, a list:
1529
1521
  end
1530
1522
 
1531
1523
  ##
1532
- # Loads an RSA private key named +key_name+ with +passphrase+ in <tt>test/rubygems/</tt>
1524
+ # Loads a private key named +key_name+ with +passphrase+ in <tt>test/rubygems/</tt>
1533
1525
 
1534
1526
  def self.load_key(key_name, passphrase = nil)
1535
1527
  key_file = key_path key_name
1536
1528
 
1537
1529
  key = File.read key_file
1538
1530
 
1539
- OpenSSL::PKey::RSA.new key, passphrase
1531
+ OpenSSL::PKey.read key, passphrase
1540
1532
  end
1541
1533
 
1542
1534
  ##
@@ -0,0 +1,9 @@
1
+ -----BEGIN EC PRIVATE KEY-----
2
+ Proc-Type: 4,ENCRYPTED
3
+ DEK-Info: AES-256-CBC,4107F98A374CB8EC18F1AA4EA4B6A0DB
4
+
5
+ BRklFxJGcz7gqQYxek8TZkt8qbPhB0FSR6nyw3SYuio/2tlT9ohs74mlK3EbG9Lt
6
+ Y4OquJbksBFmoB7fIoM4vnuIZ0Eoz2ooxn9tjhBtqJ3mVscYXwZmA3UDUWDMlviQ
7
+ Fu37OpikQv4TFA1jlmUK0LM8xmUCfUeLl0kHD17lFsz2gkO2kwg8mn/YUMOIaDOu
8
+ EnnmxbAwnZBpemQkQfpTt2mYL9gu3CcMt5gokBuGDxY=
9
+ -----END EC PRIVATE KEY-----
@@ -25,72 +25,66 @@ class TestGem < Gem::TestCase
25
25
  end
26
26
 
27
27
  def test_self_finish_resolve
28
- save_loaded_features do
29
- a1 = util_spec "a", "1", "b" => "> 0"
30
- b1 = util_spec "b", "1", "c" => ">= 1"
31
- b2 = util_spec "b", "2", "c" => ">= 2"
32
- c1 = util_spec "c", "1"
33
- c2 = util_spec "c", "2"
28
+ a1 = util_spec "a", "1", "b" => "> 0"
29
+ b1 = util_spec "b", "1", "c" => ">= 1"
30
+ b2 = util_spec "b", "2", "c" => ">= 2"
31
+ c1 = util_spec "c", "1"
32
+ c2 = util_spec "c", "2"
34
33
 
35
- install_specs c1, c2, b1, b2, a1
34
+ install_specs c1, c2, b1, b2, a1
36
35
 
37
- a1.activate
36
+ a1.activate
38
37
 
39
- assert_equal %w[a-1], loaded_spec_names
40
- assert_equal ["b (> 0)"], unresolved_names
38
+ assert_equal %w[a-1], loaded_spec_names
39
+ assert_equal ["b (> 0)"], unresolved_names
41
40
 
42
- Gem.finish_resolve
41
+ Gem.finish_resolve
43
42
 
44
- assert_equal %w[a-1 b-2 c-2], loaded_spec_names
45
- assert_equal [], unresolved_names
46
- end
43
+ assert_equal %w[a-1 b-2 c-2], loaded_spec_names
44
+ assert_equal [], unresolved_names
47
45
  end
48
46
 
49
47
  def test_self_finish_resolve_wtf
50
- save_loaded_features do
51
- a1 = util_spec "a", "1", "b" => "> 0", "d" => "> 0" # this
52
- b1 = util_spec "b", "1", { "c" => ">= 1" }, "lib/b.rb" # this
53
- b2 = util_spec "b", "2", { "c" => ">= 2" }, "lib/b.rb"
54
- c1 = util_spec "c", "1" # this
55
- c2 = util_spec "c", "2"
56
- d1 = util_spec "d", "1", { "c" => "< 2" }, "lib/d.rb"
57
- d2 = util_spec "d", "2", { "c" => "< 2" }, "lib/d.rb" # this
48
+ a1 = util_spec "a", "1", "b" => "> 0", "d" => "> 0" # this
49
+ b1 = util_spec "b", "1", { "c" => ">= 1" }, "lib/b.rb" # this
50
+ b2 = util_spec "b", "2", { "c" => ">= 2" }, "lib/b.rb"
51
+ c1 = util_spec "c", "1" # this
52
+ c2 = util_spec "c", "2"
53
+ d1 = util_spec "d", "1", { "c" => "< 2" }, "lib/d.rb"
54
+ d2 = util_spec "d", "2", { "c" => "< 2" }, "lib/d.rb" # this
58
55
 
59
- install_specs c1, c2, b1, b2, d1, d2, a1
56
+ install_specs c1, c2, b1, b2, d1, d2, a1
60
57
 
61
- a1.activate
58
+ a1.activate
62
59
 
63
- assert_equal %w[a-1], loaded_spec_names
64
- assert_equal ["b (> 0)", "d (> 0)"], unresolved_names
60
+ assert_equal %w[a-1], loaded_spec_names
61
+ assert_equal ["b (> 0)", "d (> 0)"], unresolved_names
65
62
 
66
- Gem.finish_resolve
63
+ Gem.finish_resolve
67
64
 
68
- assert_equal %w[a-1 b-1 c-1 d-2], loaded_spec_names
69
- assert_equal [], unresolved_names
70
- end
65
+ assert_equal %w[a-1 b-1 c-1 d-2], loaded_spec_names
66
+ assert_equal [], unresolved_names
71
67
  end
72
68
 
73
69
  def test_self_finish_resolve_respects_loaded_specs
74
- save_loaded_features do
75
- a1 = util_spec "a", "1", "b" => "> 0"
76
- b1 = util_spec "b", "1", "c" => ">= 1"
77
- b2 = util_spec "b", "2", "c" => ">= 2"
78
- c1 = util_spec "c", "1"
79
- c2 = util_spec "c", "2"
70
+ a1 = util_spec "a", "1", "b" => "> 0"
71
+ b1 = util_spec "b", "1", "c" => ">= 1"
72
+ b2 = util_spec "b", "2", "c" => ">= 2"
73
+ c1 = util_spec "c", "1"
74
+ c2 = util_spec "c", "2"
80
75
 
81
- install_specs c1, c2, b1, b2, a1
76
+ install_specs c1, c2, b1, b2, a1
82
77
 
83
- a1.activate
84
- c1.activate
78
+ a1.activate
79
+ c1.activate
85
80
 
86
- assert_equal %w[a-1 c-1], loaded_spec_names
87
- assert_equal ["b (> 0)"], unresolved_names
81
+ assert_equal %w[a-1 c-1], loaded_spec_names
82
+ assert_equal ["b (> 0)"], unresolved_names
88
83
 
89
- Gem.finish_resolve
84
+ Gem.finish_resolve
90
85
 
91
- assert_equal %w[a-1 b-1 c-1], loaded_spec_names
92
- assert_equal [], unresolved_names
93
- end
86
+ assert_equal %w[a-1 b-1 c-1], loaded_spec_names
87
+ assert_equal [], unresolved_names
94
88
  end
95
89
 
96
90
  def test_self_install
@@ -210,25 +204,21 @@ class TestGem < Gem::TestCase
210
204
  end
211
205
 
212
206
  def test_require_missing
213
- save_loaded_features do
214
- assert_raise ::LoadError do
215
- require "test_require_missing"
216
- end
207
+ assert_raise ::LoadError do
208
+ require "test_require_missing"
217
209
  end
218
210
  end
219
211
 
220
212
  def test_require_does_not_glob
221
- save_loaded_features do
222
- a1 = util_spec "a", "1", nil, "lib/a1.rb"
213
+ a1 = util_spec "a", "1", nil, "lib/a1.rb"
223
214
 
224
- install_specs a1
225
-
226
- assert_raise ::LoadError do
227
- require "a*"
228
- end
215
+ install_specs a1
229
216
 
230
- assert_equal [], loaded_spec_names
217
+ assert_raise ::LoadError do
218
+ require "a*"
231
219
  end
220
+
221
+ assert_equal [], loaded_spec_names
232
222
  end
233
223
 
234
224
  def test_self_bin_path_active
@@ -1483,24 +1473,22 @@ class TestGem < Gem::TestCase
1483
1473
  end
1484
1474
 
1485
1475
  def test_self_needs_picks_up_unresolved_deps
1486
- save_loaded_features do
1487
- a = util_spec "a", "1"
1488
- b = util_spec "b", "1", "c" => nil
1489
- c = util_spec "c", "2"
1490
- d = util_spec "d", "1", {'e' => '= 1'}, "lib/d#{$$}.rb"
1491
- e = util_spec "e", "1"
1492
-
1493
- install_specs a, c, b, e, d
1476
+ a = util_spec "a", "1"
1477
+ b = util_spec "b", "1", "c" => nil
1478
+ c = util_spec "c", "2"
1479
+ d = util_spec "d", "1", {'e' => '= 1'}, "lib/d#{$$}.rb"
1480
+ e = util_spec "e", "1"
1494
1481
 
1495
- Gem.needs do |r|
1496
- r.gem "a"
1497
- r.gem "b", "= 1"
1482
+ install_specs a, c, b, e, d
1498
1483
 
1499
- require "d#{$$}"
1500
- end
1484
+ Gem.needs do |r|
1485
+ r.gem "a"
1486
+ r.gem "b", "= 1"
1501
1487
 
1502
- assert_equal %w[a-1 b-1 c-2 d-1 e-1], loaded_spec_names
1488
+ require "d#{$$}"
1503
1489
  end
1490
+
1491
+ assert_equal %w[a-1 b-1 c-2 d-1 e-1], loaded_spec_names
1504
1492
  end
1505
1493
 
1506
1494
  def test_self_gunzip
@@ -14,9 +14,10 @@ class TestGemCommandsCertCommand < Gem::TestCase
14
14
  ALTERNATE_CERT = load_cert 'alternate'
15
15
  EXPIRED_PUBLIC_CERT = load_cert 'expired'
16
16
 
17
- ALTERNATE_KEY_FILE = key_path 'alternate'
18
- PRIVATE_KEY_FILE = key_path 'private'
19
- PUBLIC_KEY_FILE = key_path 'public'
17
+ ALTERNATE_KEY_FILE = key_path 'alternate'
18
+ PRIVATE_KEY_FILE = key_path 'private'
19
+ PRIVATE_EC_KEY_FILE = key_path 'private_ec'
20
+ PUBLIC_KEY_FILE = key_path 'public'
20
21
 
21
22
  ALTERNATE_CERT_FILE = cert_path 'alternate'
22
23
  CHILD_CERT_FILE = cert_path 'child'
@@ -142,6 +143,42 @@ Added '/CN=alternate/DC=example'
142
143
  assert_path_exist File.join(@tempdir, 'gem-public_cert.pem')
143
144
  end
144
145
 
146
+ def test_execute_build_key_algorithm_ec_key
147
+ passphrase = 'Foo bar'
148
+
149
+ @cmd.handle_options %W[--build nobody@example.com --key-algorithm ec]
150
+
151
+ @build_ui = Gem::MockGemUi.new "#{passphrase}\n#{passphrase}"
152
+
153
+ use_ui @build_ui do
154
+ @cmd.execute
155
+ end
156
+
157
+ output = @build_ui.output.squeeze("\n").split "\n"
158
+
159
+ assert_equal "Passphrase for your Private Key: ",
160
+ output.shift
161
+ assert_equal "Please repeat the passphrase for your Private Key: ",
162
+ output.shift
163
+ assert_equal "Certificate: #{File.join @tempdir, 'gem-public_cert.pem'}",
164
+ output.shift
165
+ assert_equal "Private Key: #{File.join @tempdir, 'gem-private_key.pem'}",
166
+ output.shift
167
+
168
+ assert_equal "Don't forget to move the key file to somewhere private!",
169
+ output.shift
170
+
171
+ assert_empty output
172
+ assert_empty @build_ui.error
173
+
174
+ assert_path_exist File.join(@tempdir, 'gem-private_key.pem')
175
+
176
+ cert_path = File.join(@tempdir, 'gem-public_cert.pem')
177
+ assert_path_exist cert_path
178
+ cert = OpenSSL::X509::Certificate.new(File.read(cert_path))
179
+ assert cert.public_key.is_a? OpenSSL::PKey::EC
180
+ end
181
+
145
182
  def test_execute_build_bad_email_address
146
183
  passphrase = 'Foo bar'
147
184
  email = "nobody@"
@@ -279,6 +316,28 @@ Added '/CN=alternate/DC=example'
279
316
  assert_path_exist File.join(@tempdir, 'gem-public_cert.pem')
280
317
  end
281
318
 
319
+ def test_execute_build_ec_key
320
+ @cmd.handle_options %W[
321
+ --build nobody@example.com
322
+ --private-key #{PRIVATE_EC_KEY_FILE}
323
+ ]
324
+
325
+ use_ui @ui do
326
+ @cmd.execute
327
+ end
328
+
329
+ output = @ui.output.split "\n"
330
+
331
+ assert_equal "Certificate: #{File.join @tempdir, 'gem-public_cert.pem'}",
332
+ output.shift
333
+
334
+ assert_empty output
335
+ assert_empty @ui.error
336
+
337
+ assert_path_exist File.join(@tempdir, 'gem-public_cert.pem')
338
+ assert_path_not_exist File.join(@tempdir, 'gem-private_key.pem')
339
+ end
340
+
282
341
  def test_execute_certificate
283
342
  use_ui @ui do
284
343
  @cmd.handle_options %W[--certificate #{PUBLIC_CERT_FILE}]
@@ -742,7 +801,7 @@ ERROR: --private-key not specified and ~/.gem/gem-private_key.pem does not exis
742
801
  @cmd.handle_options %W[--private-key #{bad}]
743
802
  end
744
803
 
745
- assert_equal "invalid argument: --private-key #{bad}: invalid RSA key",
804
+ assert_equal "invalid argument: --private-key #{bad}: invalid RSA, DSA, or EC key",
746
805
  e.message
747
806
 
748
807
  e = assert_raise OptionParser::InvalidArgument do
@@ -1067,6 +1067,31 @@ ERROR: Possible alternatives: non_existent_with_hint
1067
1067
  assert_equal x, e
1068
1068
  end
1069
1069
 
1070
+ def test_redact_credentials_from_uri_on_warning
1071
+ spec_fetcher do |fetcher|
1072
+ fetcher.download 'a', 2
1073
+ end
1074
+
1075
+ Gem.sources << "http://username:SECURE_TOKEN@nonexistent.example"
1076
+
1077
+ @cmd.options[:args] = %w[a]
1078
+
1079
+ use_ui @ui do
1080
+ assert_raise Gem::MockGemUi::SystemExitException, @ui.error do
1081
+ @cmd.execute
1082
+ end
1083
+ end
1084
+
1085
+ assert_equal %w[a-2], @cmd.installed_specs.map {|spec| spec.full_name }
1086
+
1087
+ assert_match "1 gem installed", @ui.output
1088
+
1089
+ e = @ui.error
1090
+
1091
+ x = "WARNING: Unable to pull data from 'http://username:REDACTED@nonexistent.example': no data for http://username:REDACTED@nonexistent.example/specs.4.8.gz (http://username:REDACTED@nonexistent.example/specs.4.8.gz)\n"
1092
+ assert_equal x, e
1093
+ end
1094
+
1070
1095
  def test_execute_uses_from_a_gemdeps
1071
1096
  spec_fetcher do |fetcher|
1072
1097
  fetcher.gem 'a', 2
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'package/tar_test_case'
4
- require 'digest'
4
+ require 'rubygems/openssl'
5
5
 
6
6
  class TestGemPackage < Gem::Package::TarTestCase
7
7
  def setup
@@ -84,17 +84,17 @@ class TestGemPackage < Gem::Package::TarTestCase
84
84
  io.write spec.to_yaml
85
85
  end
86
86
 
87
- metadata_sha256 = Digest::SHA256.hexdigest s.string
88
- metadata_sha512 = Digest::SHA512.hexdigest s.string
87
+ metadata_sha256 = OpenSSL::Digest::SHA256.hexdigest s.string
88
+ metadata_sha512 = OpenSSL::Digest::SHA512.hexdigest s.string
89
89
 
90
90
  expected = {
91
91
  'SHA512' => {
92
92
  'metadata.gz' => metadata_sha512,
93
- 'data.tar.gz' => Digest::SHA512.hexdigest(tar),
93
+ 'data.tar.gz' => OpenSSL::Digest::SHA512.hexdigest(tar),
94
94
  },
95
95
  'SHA256' => {
96
96
  'metadata.gz' => metadata_sha256,
97
- 'data.tar.gz' => Digest::SHA256.hexdigest(tar),
97
+ 'data.tar.gz' => OpenSSL::Digest::SHA256.hexdigest(tar),
98
98
  },
99
99
  }
100
100
 
@@ -574,18 +574,19 @@ class TestGemPackage < Gem::Package::TarTestCase
574
574
  destination_subdir = File.join @destination, 'subdir'
575
575
  FileUtils.mkdir_p destination_subdir
576
576
 
577
- e = assert_raise(Gem::Package::PathError, Errno::EACCES) do
577
+ expected_exceptions = win_platform? ? [Gem::Package::SymlinkError, Errno::EACCES] : [Gem::Package::SymlinkError]
578
+
579
+ e = assert_raise(*expected_exceptions) do
578
580
  package.extract_tar_gz tgz_io, destination_subdir
579
581
  end
580
582
 
581
- if Gem::Package::PathError === e
582
- assert_equal("installing into parent path lib/link/outside.txt of " +
583
- "#{destination_subdir} is not allowed", e.message)
584
- elsif win_platform?
585
- pend "symlink - must be admin with no UAC on Windows"
586
- else
587
- raise e
588
- end
583
+ pend "symlink - must be admin with no UAC on Windows" if Errno::EACCES === e
584
+
585
+ assert_equal("installing symlink 'lib/link' pointing to parent path #{@destination} of " +
586
+ "#{destination_subdir} is not allowed", e.message)
587
+
588
+ assert_path_not_exist File.join(@destination, "outside.txt")
589
+ assert_path_not_exist File.join(destination_subdir, "lib/link")
589
590
  end
590
591
 
591
592
  def test_extract_symlink_parent_doesnt_delete_user_dir
@@ -608,20 +609,20 @@ class TestGemPackage < Gem::Package::TarTestCase
608
609
  tar.add_symlink 'link/dir', '.', 16877
609
610
  end
610
611
 
611
- e = assert_raise(Gem::Package::PathError, Errno::EACCES) do
612
+ expected_exceptions = win_platform? ? [Gem::Package::SymlinkError, Errno::EACCES] : [Gem::Package::SymlinkError]
613
+
614
+ e = assert_raise(*expected_exceptions) do
612
615
  package.extract_tar_gz tgz_io, destination_subdir
613
616
  end
614
617
 
615
- assert_path_exist destination_user_subdir
618
+ pend "symlink - must be admin with no UAC on Windows" if Errno::EACCES === e
616
619
 
617
- if Gem::Package::PathError === e
618
- assert_equal("installing into parent path #{destination_user_subdir} of " +
619
- "#{destination_subdir} is not allowed", e.message)
620
- elsif win_platform?
621
- pend "symlink - must be admin with no UAC on Windows"
622
- else
623
- raise e
624
- end
620
+ assert_equal("installing symlink 'link' pointing to parent path #{destination_user_dir} of " +
621
+ "#{destination_subdir} is not allowed", e.message)
622
+
623
+ assert_path_exist destination_user_subdir
624
+ assert_path_not_exist File.join(destination_subdir, "link/dir")
625
+ assert_path_not_exist File.join(destination_subdir, "link")
625
626
  end
626
627
 
627
628
  def test_extract_tar_gz_directory
@@ -856,7 +857,7 @@ class TestGemPackage < Gem::Package::TarTestCase
856
857
  io.write metadata_gz
857
858
  end
858
859
 
859
- digest = Digest::SHA1.new
860
+ digest = OpenSSL::Digest::SHA1.new
860
861
  digest << metadata_gz
861
862
 
862
863
  checksums = {
@@ -1015,7 +1016,7 @@ class TestGemPackage < Gem::Package::TarTestCase
1015
1016
  bogus_data = Gem::Util.gzip 'hello'
1016
1017
  fake_signer = Class.new do
1017
1018
  def digest_name; 'SHA512'; end
1018
- def digest_algorithm; Digest(:SHA512).new; end
1019
+ def digest_algorithm; OpenSSL::Digest(:SHA512).new; end
1019
1020
  def key; 'key'; end
1020
1021
  def sign(*); 'fake_sig'; end
1021
1022
  end
@@ -122,6 +122,7 @@ class TestGemPlatform < Gem::TestCase
122
122
  'i586-linux-gnu' => ['x86', 'linux', nil],
123
123
  'i386-linux-gnu' => ['x86', 'linux', nil],
124
124
  'i386-mingw32' => ['x86', 'mingw32', nil],
125
+ 'x64-mingw-ucrt' => ['x64', 'mingw', 'ucrt'],
125
126
  'i386-mswin32' => ['x86', 'mswin32', nil],
126
127
  'i386-mswin32_80' => ['x86', 'mswin32', '80'],
127
128
  'i386-mswin32-80' => ['x86', 'mswin32', '80'],
@@ -241,6 +241,36 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
241
241
  assert File.exist?(a1_cache_gem)
242
242
  end
243
243
 
244
+ def test_download_with_token
245
+ a1_data = nil
246
+ File.open @a1_gem, 'rb' do |fp|
247
+ a1_data = fp.read
248
+ end
249
+
250
+ fetcher = util_fuck_with_fetcher a1_data
251
+
252
+ a1_cache_gem = @a1.cache_file
253
+ assert_equal a1_cache_gem, fetcher.download(@a1, 'http://token@gems.example.com')
254
+ assert_equal("http://token@gems.example.com/gems/a-1.gem",
255
+ fetcher.instance_variable_get(:@test_arg).to_s)
256
+ assert File.exist?(a1_cache_gem)
257
+ end
258
+
259
+ def test_download_with_x_oauth_basic
260
+ a1_data = nil
261
+ File.open @a1_gem, 'rb' do |fp|
262
+ a1_data = fp.read
263
+ end
264
+
265
+ fetcher = util_fuck_with_fetcher a1_data
266
+
267
+ a1_cache_gem = @a1.cache_file
268
+ assert_equal a1_cache_gem, fetcher.download(@a1, 'http://token:x-oauth-basic@gems.example.com')
269
+ assert_equal("http://token:x-oauth-basic@gems.example.com/gems/a-1.gem",
270
+ fetcher.instance_variable_get(:@test_arg).to_s)
271
+ assert File.exist?(a1_cache_gem)
272
+ end
273
+
244
274
  def test_download_with_encoded_auth
245
275
  a1_data = nil
246
276
  File.open @a1_gem, 'rb' do |fp|