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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +60 -0
- data/Manifest.txt +12 -3
- data/bundler/CHANGELOG.md +50 -1
- data/bundler/README.md +1 -1
- data/bundler/lib/bundler/build_metadata.rb +2 -2
- data/bundler/lib/bundler/cli/check.rb +1 -1
- data/bundler/lib/bundler/cli/gem.rb +19 -2
- data/bundler/lib/bundler/cli/info.rb +11 -4
- data/bundler/lib/bundler/cli/issue.rb +4 -3
- data/bundler/lib/bundler/cli/remove.rb +1 -2
- data/bundler/lib/bundler/cli.rb +1 -0
- data/bundler/lib/bundler/compact_index_client.rb +2 -2
- data/bundler/lib/bundler/definition.rb +16 -6
- data/bundler/lib/bundler/digest.rb +71 -0
- data/bundler/lib/bundler/errors.rb +18 -2
- data/bundler/lib/bundler/fetcher.rb +2 -1
- data/bundler/lib/bundler/friendly_errors.rb +5 -30
- data/bundler/lib/bundler/gem_helper.rb +6 -17
- data/bundler/lib/bundler/installer.rb +0 -1
- data/bundler/lib/bundler/plugin/installer.rb +2 -0
- data/bundler/lib/bundler/plugin.rb +23 -6
- data/bundler/lib/bundler/rubygems_ext.rb +4 -0
- data/bundler/lib/bundler/rubygems_gem_installer.rb +20 -4
- data/bundler/lib/bundler/rubygems_integration.rb +28 -9
- data/bundler/lib/bundler/runtime.rb +1 -1
- data/bundler/lib/bundler/settings.rb +9 -1
- data/bundler/lib/bundler/source/git.rb +22 -4
- data/bundler/lib/bundler/source/rubygems.rb +43 -72
- data/bundler/lib/bundler/source.rb +2 -0
- data/bundler/lib/bundler/source_list.rb +4 -0
- data/bundler/lib/bundler/spec_set.rb +1 -1
- data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +2 -1
- data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
- data/bundler/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +57 -0
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +39 -74
- data/bundler/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
- data/bundler/lib/bundler/vendor/molinillo/LICENSE +9 -0
- data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
- data/bundler/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/bundler/lib/bundler/vendor/uri/LICENSE.txt +22 -0
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler/worker.rb +2 -2
- data/bundler/lib/bundler.rb +13 -18
- data/lib/rubygems/command_manager.rb +3 -3
- data/lib/rubygems/commands/build_command.rb +3 -3
- data/lib/rubygems/commands/cert_command.rb +15 -8
- data/lib/rubygems/commands/check_command.rb +4 -4
- data/lib/rubygems/commands/cleanup_command.rb +3 -3
- data/lib/rubygems/commands/contents_command.rb +2 -2
- data/lib/rubygems/commands/dependency_command.rb +3 -3
- data/lib/rubygems/commands/environment_command.rb +1 -1
- data/lib/rubygems/commands/fetch_command.rb +3 -3
- data/lib/rubygems/commands/generate_index_command.rb +2 -2
- data/lib/rubygems/commands/help_command.rb +1 -1
- data/lib/rubygems/commands/info_command.rb +2 -2
- data/lib/rubygems/commands/install_command.rb +12 -11
- data/lib/rubygems/commands/list_command.rb +2 -2
- data/lib/rubygems/commands/lock_command.rb +1 -1
- data/lib/rubygems/commands/mirror_command.rb +1 -1
- data/lib/rubygems/commands/open_command.rb +2 -2
- data/lib/rubygems/commands/outdated_command.rb +4 -4
- data/lib/rubygems/commands/owner_command.rb +4 -4
- data/lib/rubygems/commands/pristine_command.rb +5 -5
- data/lib/rubygems/commands/push_command.rb +4 -4
- data/lib/rubygems/commands/query_command.rb +3 -3
- data/lib/rubygems/commands/rdoc_command.rb +3 -3
- data/lib/rubygems/commands/search_command.rb +2 -2
- data/lib/rubygems/commands/server_command.rb +3 -3
- data/lib/rubygems/commands/setup_command.rb +6 -6
- data/lib/rubygems/commands/signin_command.rb +2 -2
- data/lib/rubygems/commands/signout_command.rb +1 -1
- data/lib/rubygems/commands/sources_command.rb +4 -4
- data/lib/rubygems/commands/specification_command.rb +4 -4
- data/lib/rubygems/commands/stale_command.rb +1 -1
- data/lib/rubygems/commands/uninstall_command.rb +3 -3
- data/lib/rubygems/commands/unpack_command.rb +5 -5
- data/lib/rubygems/commands/update_command.rb +9 -9
- data/lib/rubygems/commands/which_command.rb +1 -1
- data/lib/rubygems/commands/yank_command.rb +4 -4
- data/lib/rubygems/config_file.rb +1 -1
- data/lib/rubygems/core_ext/tcpsocket_init.rb +2 -2
- data/lib/rubygems/defaults.rb +1 -1
- data/lib/rubygems/dependency_installer.rb +8 -8
- data/lib/rubygems/dependency_list.rb +1 -1
- data/lib/rubygems/doctor.rb +2 -2
- data/lib/rubygems/errors.rb +1 -2
- data/lib/rubygems/exceptions.rb +1 -1
- data/lib/rubygems/gem_runner.rb +3 -3
- data/lib/rubygems/gemcutter_utilities.rb +2 -2
- data/lib/rubygems/indexer.rb +2 -2
- data/lib/rubygems/install_default_message.rb +2 -2
- data/lib/rubygems/install_message.rb +2 -2
- data/lib/rubygems/install_update_options.rb +2 -2
- data/lib/rubygems/installer.rb +8 -8
- data/lib/rubygems/local_remote_options.rb +1 -1
- data/lib/rubygems/mock_gem_ui.rb +1 -1
- data/lib/rubygems/package/tar_reader.rb +1 -1
- data/lib/rubygems/package.rb +36 -46
- data/lib/rubygems/package_task.rb +2 -2
- data/lib/rubygems/platform.rb +2 -1
- data/lib/rubygems/query_utils.rb +4 -4
- data/lib/rubygems/rdoc.rb +1 -1
- data/lib/rubygems/remote_fetcher.rb +16 -22
- data/lib/rubygems/request/connection_pools.rb +1 -1
- data/lib/rubygems/request/http_pool.rb +1 -1
- data/lib/rubygems/request.rb +7 -5
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +1 -1
- data/lib/rubygems/request_set/lockfile.rb +1 -1
- data/lib/rubygems/request_set.rb +5 -5
- data/lib/rubygems/requirement.rb +1 -1
- data/lib/rubygems/resolver/git_specification.rb +1 -1
- data/lib/rubygems/resolver/installer_set.rb +3 -3
- data/lib/rubygems/resolver/molinillo/LICENSE +9 -0
- data/lib/rubygems/resolver/molinillo.rb +1 -1
- data/lib/rubygems/resolver/set.rb +0 -1
- data/lib/rubygems/resolver/specification.rb +1 -1
- data/lib/rubygems/resolver.rb +31 -31
- data/lib/rubygems/s3_uri_signer.rb +4 -5
- data/lib/rubygems/security/policy.rb +6 -4
- data/lib/rubygems/security/signer.rb +4 -5
- data/lib/rubygems/security.rb +54 -20
- data/lib/rubygems/security_option.rb +2 -2
- data/lib/rubygems/server.rb +2 -2
- data/lib/rubygems/source/git.rb +2 -2
- data/lib/rubygems/source.rb +7 -7
- data/lib/rubygems/spec_fetcher.rb +5 -5
- data/lib/rubygems/specification.rb +12 -12
- data/lib/rubygems/specification_policy.rb +2 -2
- data/lib/rubygems/uninstaller.rb +6 -6
- data/lib/rubygems/uri.rb +111 -0
- data/lib/rubygems/user_interaction.rb +3 -3
- data/lib/rubygems/util/licenses.rb +1 -1
- data/lib/rubygems/util.rb +1 -1
- data/lib/rubygems/validator.rb +2 -2
- data/lib/rubygems/version_option.rb +1 -1
- data/lib/rubygems.rb +16 -16
- data/rubygems-update.gemspec +1 -1
- data/test/rubygems/helper.rb +4 -12
- data/test/rubygems/private_ec_key.pem +9 -0
- data/test/rubygems/test_gem.rb +59 -71
- data/test/rubygems/test_gem_commands_cert_command.rb +63 -4
- data/test/rubygems/test_gem_commands_install_command.rb +25 -0
- data/test/rubygems/test_gem_package.rb +27 -26
- data/test/rubygems/test_gem_platform.rb +1 -0
- data/test/rubygems/test_gem_remote_fetcher.rb +30 -0
- data/test/rubygems/test_gem_request.rb +35 -9
- data/test/rubygems/test_gem_resolver_installer_set.rb +18 -0
- data/test/rubygems/test_gem_security.rb +32 -4
- data/test/rubygems/test_gem_source_fetch_problem.rb +10 -0
- data/test/rubygems/test_gem_specification.rb +228 -232
- data/test/rubygems/test_gem_uri.rb +39 -0
- metadata +18 -9
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
- data/lib/rubygems/uri_parser.rb +0 -34
- 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.
|
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
|
-
|
15
|
+
require_relative 'rubygems/compatibility'
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
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
|
-
|
629
|
-
|
628
|
+
require_relative 'rubygems/psych_additions'
|
629
|
+
require_relative 'rubygems/psych_tree'
|
630
630
|
end
|
631
631
|
|
632
632
|
require 'yaml'
|
633
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1357
|
-
|
1358
|
-
|
1356
|
+
require_relative 'rubygems/core_ext/kernel_gem'
|
1357
|
+
require_relative 'rubygems/core_ext/kernel_require'
|
1358
|
+
require_relative 'rubygems/core_ext/kernel_warn'
|
data/rubygems-update.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "rubygems-update"
|
5
|
-
s.version = "3.2.
|
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
|
|
data/test/rubygems/helper.rb
CHANGED
@@ -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
|
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
|
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-----
|
data/test/rubygems/test_gem.rb
CHANGED
@@ -25,72 +25,66 @@ class TestGem < Gem::TestCase
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_self_finish_resolve
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
34
|
+
install_specs c1, c2, b1, b2, a1
|
36
35
|
|
37
|
-
|
36
|
+
a1.activate
|
38
37
|
|
39
|
-
|
40
|
-
|
38
|
+
assert_equal %w[a-1], loaded_spec_names
|
39
|
+
assert_equal ["b (> 0)"], unresolved_names
|
41
40
|
|
42
|
-
|
41
|
+
Gem.finish_resolve
|
43
42
|
|
44
|
-
|
45
|
-
|
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
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
|
56
|
+
install_specs c1, c2, b1, b2, d1, d2, a1
|
60
57
|
|
61
|
-
|
58
|
+
a1.activate
|
62
59
|
|
63
|
-
|
64
|
-
|
60
|
+
assert_equal %w[a-1], loaded_spec_names
|
61
|
+
assert_equal ["b (> 0)", "d (> 0)"], unresolved_names
|
65
62
|
|
66
|
-
|
63
|
+
Gem.finish_resolve
|
67
64
|
|
68
|
-
|
69
|
-
|
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
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
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
|
-
|
76
|
+
install_specs c1, c2, b1, b2, a1
|
82
77
|
|
83
|
-
|
84
|
-
|
78
|
+
a1.activate
|
79
|
+
c1.activate
|
85
80
|
|
86
|
-
|
87
|
-
|
81
|
+
assert_equal %w[a-1 c-1], loaded_spec_names
|
82
|
+
assert_equal ["b (> 0)"], unresolved_names
|
88
83
|
|
89
|
-
|
84
|
+
Gem.finish_resolve
|
90
85
|
|
91
|
-
|
92
|
-
|
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
|
-
|
214
|
-
|
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
|
-
|
222
|
-
a1 = util_spec "a", "1", nil, "lib/a1.rb"
|
213
|
+
a1 = util_spec "a", "1", nil, "lib/a1.rb"
|
223
214
|
|
224
|
-
|
225
|
-
|
226
|
-
assert_raise ::LoadError do
|
227
|
-
require "a*"
|
228
|
-
end
|
215
|
+
install_specs a1
|
229
216
|
|
230
|
-
|
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
|
-
|
1487
|
-
|
1488
|
-
|
1489
|
-
|
1490
|
-
|
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
|
-
|
1496
|
-
r.gem "a"
|
1497
|
-
r.gem "b", "= 1"
|
1482
|
+
install_specs a, c, b, e, d
|
1498
1483
|
|
1499
|
-
|
1500
|
-
|
1484
|
+
Gem.needs do |r|
|
1485
|
+
r.gem "a"
|
1486
|
+
r.gem "b", "= 1"
|
1501
1487
|
|
1502
|
-
|
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
|
18
|
-
PRIVATE_KEY_FILE
|
19
|
-
|
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 '
|
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
|
-
|
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
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
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
|
-
|
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
|
-
|
618
|
+
pend "symlink - must be admin with no UAC on Windows" if Errno::EACCES === e
|
616
619
|
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
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|
|