rubygems-update 2.6.11 → 2.6.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rubygems-update might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/History.txt +45 -0
- data/Manifest.txt +1 -0
- data/lib/rubygems.rb +4 -2
- data/lib/rubygems/commands/open_command.rb +1 -1
- data/lib/rubygems/commands/query_command.rb +4 -3
- data/lib/rubygems/commands/sources_command.rb +1 -1
- data/lib/rubygems/config_file.rb +1 -1
- data/lib/rubygems/dependency_list.rb +1 -1
- data/lib/rubygems/installer.rb +15 -1
- data/lib/rubygems/package.rb +1 -1
- data/lib/rubygems/package/old.rb +1 -1
- data/lib/rubygems/platform.rb +1 -1
- data/lib/rubygems/remote_fetcher.rb +1 -1
- data/lib/rubygems/safe_yaml.rb +48 -0
- data/lib/rubygems/security.rb +1 -1
- data/lib/rubygems/server.rb +1 -1
- data/lib/rubygems/specification.rb +12 -4
- data/lib/rubygems/test_case.rb +4 -1
- data/lib/rubygems/text.rb +14 -1
- data/test/rubygems/test_gem.rb +28 -5
- data/test/rubygems/test_gem_commands_open_command.rb +2 -1
- data/test/rubygems/test_gem_commands_query_command.rb +135 -1
- data/test/rubygems/test_gem_commands_sources_command.rb +52 -0
- data/test/rubygems/test_gem_installer.rb +25 -0
- data/test/rubygems/test_gem_remote_fetcher.rb +15 -0
- data/test/rubygems/test_gem_specification.rb +31 -1
- data/test/rubygems/test_gem_text.rb +11 -0
- data/test/rubygems/test_require.rb +11 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57912bb77dd87dcd42c101212129e693553e4d31b01e3475f423d69606d054f2
|
4
|
+
data.tar.gz: 6c57e3463ebe2e2dec90d8c99ba48212622faac0cdfc7bb90ab91d1299a2af97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea7514aa2ffa01b8d84c0834933fdd8f8682bbbb272faaf8980c398e0fdce05131225132449ae51aab1852905a82bab8cf2e88a94f7fef83c442791735e37c4e
|
7
|
+
data.tar.gz: c2b993fac57b622ad7f95622e5724c79f0c82f612c88d7f94c2db7be01d9eb2c93bdcaabc59b3adbd4cb530e4ccc4ebdcacc31e97ce2b2d4cf65af6c3d54c79d
|
data/History.txt
CHANGED
@@ -1,5 +1,50 @@
|
|
1
1
|
# coding: UTF-8
|
2
2
|
|
3
|
+
=== 2.6.14 / 2017-10-09
|
4
|
+
|
5
|
+
Security fixes:
|
6
|
+
|
7
|
+
* Whitelist classes and symbols that are in loaded YAML.
|
8
|
+
See CVE-2017-0903 for full details.
|
9
|
+
Fix by Aaron Patterson.
|
10
|
+
|
11
|
+
=== 2.6.13 / 2017-08-27
|
12
|
+
|
13
|
+
Security fixes:
|
14
|
+
|
15
|
+
* Fix a DNS request hijacking vulnerability.
|
16
|
+
Fix by Samuel Giddins.
|
17
|
+
* Fix an ANSI escape sequence vulnerability.
|
18
|
+
Fix by Evan Phoenix.
|
19
|
+
* Fix a DOS vulernerability in the `query` command.
|
20
|
+
Fix by Samuel Giddins.
|
21
|
+
* Fix a vulnerability in the gem installer that allowed
|
22
|
+
a malicious gem to overwrite arbitrary files.
|
23
|
+
Fix by Samuel Giddins.
|
24
|
+
|
25
|
+
=== 2.6.12 / 2017-04-30
|
26
|
+
|
27
|
+
Bug fixes:
|
28
|
+
|
29
|
+
* Fix test_self_find_files_with_gemfile to sort expected files. Pull
|
30
|
+
request #1880 by Kazuaki Matsuo.
|
31
|
+
* Fix issue for MinGW / MSYS2 builds and testing. Pull request #1879 by
|
32
|
+
MSP-Greg.
|
33
|
+
* Fix gem open to open highest version number rather than lowest. Pull
|
34
|
+
request #1877 by Tim Pope.
|
35
|
+
* Add a test for requiring a default spec as installed by the ruby
|
36
|
+
installer. Pull request #1899 by Samuel Giddins.
|
37
|
+
* Fix broken --exact parameter to gem command. Pull request #1873 by Jason
|
38
|
+
Frey.
|
39
|
+
* [Installer] Generate backwards-compatible binstubs. Pull request #1904
|
40
|
+
by Samuel Giddins.
|
41
|
+
* Fix pre-existing source recognition on add action. Pull request #1883 by
|
42
|
+
Jonathan Claudius.
|
43
|
+
* Prevent negative IDs in output of #inspect. Pull request #1908 by Vít
|
44
|
+
Ondruch.
|
45
|
+
* Allow Gem.finish_resolve to respect already-activated specs. Pull
|
46
|
+
request #1910 by Samuel Giddins.
|
47
|
+
|
3
48
|
=== 2.6.11 / 2017-03-16
|
4
49
|
|
5
50
|
Bug fixes:
|
data/Manifest.txt
CHANGED
@@ -387,6 +387,7 @@ lib/rubygems/resolver/specification.rb
|
|
387
387
|
lib/rubygems/resolver/stats.rb
|
388
388
|
lib/rubygems/resolver/vendor_set.rb
|
389
389
|
lib/rubygems/resolver/vendor_specification.rb
|
390
|
+
lib/rubygems/safe_yaml.rb
|
390
391
|
lib/rubygems/security.rb
|
391
392
|
lib/rubygems/security/policies.rb
|
392
393
|
lib/rubygems/security/policy.rb
|
data/lib/rubygems.rb
CHANGED
@@ -10,7 +10,7 @@ require 'rbconfig'
|
|
10
10
|
require 'thread'
|
11
11
|
|
12
12
|
module Gem
|
13
|
-
VERSION = "2.6.
|
13
|
+
VERSION = "2.6.14"
|
14
14
|
end
|
15
15
|
|
16
16
|
# Must be first since it unloads the prelude from 1.9.2
|
@@ -234,6 +234,7 @@ module Gem
|
|
234
234
|
|
235
235
|
def self.finish_resolve(request_set=Gem::RequestSet.new)
|
236
236
|
request_set.import Gem::Specification.unresolved_deps.values
|
237
|
+
request_set.import Gem.loaded_specs.values.map {|s| Gem::Dependency.new(s.name, s.version) }
|
237
238
|
|
238
239
|
request_set.resolve_current.each do |s|
|
239
240
|
s.full_spec.activate
|
@@ -674,7 +675,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
|
|
674
675
|
|
675
676
|
unless test_syck
|
676
677
|
begin
|
677
|
-
gem 'psych', '>=
|
678
|
+
gem 'psych', '>= 2.0.0'
|
678
679
|
rescue Gem::LoadError
|
679
680
|
# It's OK if the user does not have the psych gem installed. We will
|
680
681
|
# attempt to require the stdlib version
|
@@ -698,6 +699,7 @@ An Array (#{env.inspect}) was passed in from #{caller[3]}
|
|
698
699
|
end
|
699
700
|
|
700
701
|
require 'yaml'
|
702
|
+
require 'rubygems/safe_yaml'
|
701
703
|
|
702
704
|
# If we're supposed to be using syck, then we may have to force
|
703
705
|
# activate it via the YAML::ENGINE API.
|
@@ -86,7 +86,7 @@ is too hard to use.
|
|
86
86
|
name = Array(options[:name])
|
87
87
|
else
|
88
88
|
args = options[:args].to_a
|
89
|
-
name = options[:exact] ? args : args.map{|arg| /#{arg}/i }
|
89
|
+
name = options[:exact] ? args.map{|arg| /\A#{Regexp.escape(arg)}\Z/ } : args.map{|arg| /#{arg}/i }
|
90
90
|
end
|
91
91
|
|
92
92
|
prerelease = options[:prerelease]
|
@@ -226,7 +226,7 @@ is too hard to use.
|
|
226
226
|
end
|
227
227
|
end
|
228
228
|
|
229
|
-
output << make_entry(matching_tuples, platforms)
|
229
|
+
output << clean_text(make_entry(matching_tuples, platforms))
|
230
230
|
end
|
231
231
|
end
|
232
232
|
|
@@ -353,7 +353,8 @@ is too hard to use.
|
|
353
353
|
end
|
354
354
|
|
355
355
|
def spec_summary entry, spec
|
356
|
-
|
356
|
+
summary = truncate_text(spec.summary, "the summary for #{spec.full_name}")
|
357
|
+
entry << "\n\n" << format_text(summary, 68, 4)
|
357
358
|
end
|
358
359
|
|
359
360
|
end
|
@@ -44,7 +44,7 @@ class Gem::Commands::SourcesCommand < Gem::Command
|
|
44
44
|
source = Gem::Source.new source_uri
|
45
45
|
|
46
46
|
begin
|
47
|
-
if Gem.sources.include?
|
47
|
+
if Gem.sources.include? source then
|
48
48
|
say "source #{source_uri} already present in the cache"
|
49
49
|
else
|
50
50
|
source.load_specs :released
|
data/lib/rubygems/config_file.rb
CHANGED
@@ -345,7 +345,7 @@ if you believe they were disclosed to a third party.
|
|
345
345
|
return {} unless filename and File.exist? filename
|
346
346
|
|
347
347
|
begin
|
348
|
-
content =
|
348
|
+
content = Gem::SafeYAML.load(File.read(filename))
|
349
349
|
unless content.kind_of? Hash
|
350
350
|
warn "Failed to load #{filename} because it doesn't contain valid YAML hash"
|
351
351
|
return {}
|
data/lib/rubygems/installer.rb
CHANGED
@@ -214,7 +214,7 @@ class Gem::Installer
|
|
214
214
|
|
215
215
|
ruby_executable = true
|
216
216
|
existing = io.read.slice(%r{
|
217
|
-
|
217
|
+
^\s*(
|
218
218
|
gem \s |
|
219
219
|
load \s Gem\.bin_path\( |
|
220
220
|
load \s Gem\.activate_bin_path\(
|
@@ -697,10 +697,17 @@ class Gem::Installer
|
|
697
697
|
unpack or File.writable?(gem_home)
|
698
698
|
end
|
699
699
|
|
700
|
+
def verify_spec_name
|
701
|
+
return if spec.name =~ Gem::Specification::VALID_NAME_PATTERN
|
702
|
+
raise Gem::InstallError, "#{spec} has an invalid name"
|
703
|
+
end
|
704
|
+
|
700
705
|
##
|
701
706
|
# Return the text for an application file.
|
702
707
|
|
703
708
|
def app_script_text(bin_file_name)
|
709
|
+
# note that the `load` lines cannot be indented, as old RG versions match
|
710
|
+
# against the beginning of the line
|
704
711
|
return <<-TEXT
|
705
712
|
#{shebang bin_file_name}
|
706
713
|
#
|
@@ -723,7 +730,12 @@ if ARGV.first
|
|
723
730
|
end
|
724
731
|
end
|
725
732
|
|
733
|
+
if Gem.respond_to?(:activate_bin_path)
|
726
734
|
load Gem.activate_bin_path('#{spec.name}', '#{bin_file_name}', version)
|
735
|
+
else
|
736
|
+
gem #{spec.name.dump}, version
|
737
|
+
load Gem.bin_path(#{spec.name.dump}, #{bin_file_name.dump}, version)
|
738
|
+
end
|
727
739
|
TEXT
|
728
740
|
end
|
729
741
|
|
@@ -816,6 +828,8 @@ TEXT
|
|
816
828
|
|
817
829
|
ensure_loadable_spec
|
818
830
|
|
831
|
+
verify_spec_name
|
832
|
+
|
819
833
|
if options[:install_as_default]
|
820
834
|
Gem.ensure_default_gem_subdirectories gem_home
|
821
835
|
else
|
data/lib/rubygems/package.rb
CHANGED
data/lib/rubygems/package/old.rb
CHANGED
data/lib/rubygems/platform.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
module Gem
|
2
|
+
|
3
|
+
###
|
4
|
+
# This module is used for safely loading YAML specs from a gem. The
|
5
|
+
# `safe_load` method defined on this module is specifically designed for
|
6
|
+
# loading Gem specifications. For loading other YAML safely, please see
|
7
|
+
# Psych.safe_load
|
8
|
+
|
9
|
+
module SafeYAML
|
10
|
+
WHITELISTED_CLASSES = %w(
|
11
|
+
Symbol
|
12
|
+
Time
|
13
|
+
Date
|
14
|
+
Gem::Dependency
|
15
|
+
Gem::Platform
|
16
|
+
Gem::Requirement
|
17
|
+
Gem::Specification
|
18
|
+
Gem::Version
|
19
|
+
Gem::Version::Requirement
|
20
|
+
YAML::Syck::DefaultKey
|
21
|
+
Syck::DefaultKey
|
22
|
+
)
|
23
|
+
|
24
|
+
WHITELISTED_SYMBOLS = %w(
|
25
|
+
development
|
26
|
+
runtime
|
27
|
+
)
|
28
|
+
|
29
|
+
if ::YAML.respond_to? :safe_load
|
30
|
+
def self.safe_load input
|
31
|
+
::YAML.safe_load(input, WHITELISTED_CLASSES, WHITELISTED_SYMBOLS, true)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.load input
|
35
|
+
::YAML.safe_load(input, [::Symbol])
|
36
|
+
end
|
37
|
+
else
|
38
|
+
warn "YAML safe loading is not available. Please upgrade psych to a version that supports safe loading (>= 2.0)."
|
39
|
+
def self.safe_load input, *args
|
40
|
+
::YAML.load input
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.load input
|
44
|
+
::YAML.load input
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/rubygems/security.rb
CHANGED
@@ -455,7 +455,7 @@ module Gem::Security
|
|
455
455
|
|
456
456
|
##
|
457
457
|
# Creates a new key pair of the specified +length+ and +algorithm+. The
|
458
|
-
# default is a
|
458
|
+
# default is a 3072 bit RSA key.
|
459
459
|
|
460
460
|
def self.create_key length = KEY_LENGTH, algorithm = KEY_ALGORITHM
|
461
461
|
algorithm.new length
|
data/lib/rubygems/server.rb
CHANGED
@@ -657,7 +657,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
|
657
657
|
"only_one_executable" => true,
|
658
658
|
"full_name" => "rubygems-#{Gem::VERSION}",
|
659
659
|
"has_deps" => false,
|
660
|
-
"homepage" => "http://
|
660
|
+
"homepage" => "http://guides.rubygems.org/",
|
661
661
|
"name" => 'rubygems',
|
662
662
|
"ri_installed" => true,
|
663
663
|
"summary" => "RubyGems itself",
|
@@ -108,6 +108,8 @@ class Gem::Specification < Gem::BasicSpecification
|
|
108
108
|
|
109
109
|
private_constant :LOAD_CACHE if defined? private_constant
|
110
110
|
|
111
|
+
VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/ # :nodoc:
|
112
|
+
|
111
113
|
# :startdoc:
|
112
114
|
|
113
115
|
##
|
@@ -1099,7 +1101,7 @@ class Gem::Specification < Gem::BasicSpecification
|
|
1099
1101
|
Gem.load_yaml
|
1100
1102
|
|
1101
1103
|
input = normalize_yaml_input input
|
1102
|
-
spec =
|
1104
|
+
spec = Gem::SafeYAML.safe_load input
|
1103
1105
|
|
1104
1106
|
if spec && spec.class == FalseClass then
|
1105
1107
|
raise Gem::EndOfYAMLException
|
@@ -2102,7 +2104,7 @@ class Gem::Specification < Gem::BasicSpecification
|
|
2102
2104
|
if $DEBUG
|
2103
2105
|
super
|
2104
2106
|
else
|
2105
|
-
"
|
2107
|
+
"#{super[0..-2]} #{full_name}>"
|
2106
2108
|
end
|
2107
2109
|
end
|
2108
2110
|
|
@@ -2668,9 +2670,15 @@ class Gem::Specification < Gem::BasicSpecification
|
|
2668
2670
|
end
|
2669
2671
|
end
|
2670
2672
|
|
2671
|
-
|
2673
|
+
if !name.is_a?(String) then
|
2674
|
+
raise Gem::InvalidSpecificationException,
|
2675
|
+
"invalid value for attribute name: \"#{name.inspect}\" must be a string"
|
2676
|
+
elsif name !~ /[a-zA-Z]/ then
|
2677
|
+
raise Gem::InvalidSpecificationException,
|
2678
|
+
"invalid value for attribute name: #{name.dump} must include at least one letter"
|
2679
|
+
elsif name !~ VALID_NAME_PATTERN then
|
2672
2680
|
raise Gem::InvalidSpecificationException,
|
2673
|
-
"invalid value for attribute name:
|
2681
|
+
"invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores"
|
2674
2682
|
end
|
2675
2683
|
|
2676
2684
|
if raw_require_paths.empty? then
|
data/lib/rubygems/test_case.rb
CHANGED
@@ -484,7 +484,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
|
|
484
484
|
|
485
485
|
system @git, 'add', gemspec
|
486
486
|
system @git, 'commit', '-a', '-m', 'a non-empty commit message', '--quiet'
|
487
|
-
head = Gem::Util.popen(
|
487
|
+
head = Gem::Util.popen(@git, 'rev-parse', 'master').strip
|
488
488
|
end
|
489
489
|
|
490
490
|
return name, git_spec.version, directory, head
|
@@ -1498,6 +1498,8 @@ end
|
|
1498
1498
|
begin
|
1499
1499
|
gem 'rdoc'
|
1500
1500
|
require 'rdoc'
|
1501
|
+
|
1502
|
+
require 'rubygems/rdoc'
|
1501
1503
|
rescue LoadError, Gem::LoadError
|
1502
1504
|
end
|
1503
1505
|
|
@@ -1514,3 +1516,4 @@ tmpdirs << (ENV['GEM_PATH'] = Dir.mktmpdir("path"))
|
|
1514
1516
|
pid = $$
|
1515
1517
|
END {tmpdirs.each {|dir| Dir.rmdir(dir)} if $$ == pid}
|
1516
1518
|
Gem.clear_paths
|
1519
|
+
Gem.loaded_specs.clear
|
data/lib/rubygems/text.rb
CHANGED
@@ -6,13 +6,26 @@ require 'rubygems'
|
|
6
6
|
|
7
7
|
module Gem::Text
|
8
8
|
|
9
|
+
##
|
10
|
+
# Remove any non-printable characters and make the text suitable for
|
11
|
+
# printing.
|
12
|
+
def clean_text(text)
|
13
|
+
text.gsub(/[\000-\b\v-\f\016-\037\177]/, ".".freeze)
|
14
|
+
end
|
15
|
+
|
16
|
+
def truncate_text(text, description, max_length = 100_000)
|
17
|
+
raise ArgumentError, "max_length must be positive" unless max_length > 0
|
18
|
+
return text if text.size <= max_length
|
19
|
+
"Truncating #{description} to #{max_length.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse} characters:\n" + text[0, max_length]
|
20
|
+
end
|
21
|
+
|
9
22
|
##
|
10
23
|
# Wraps +text+ to +wrap+ characters and optionally indents by +indent+
|
11
24
|
# characters
|
12
25
|
|
13
26
|
def format_text(text, wrap, indent=0)
|
14
27
|
result = []
|
15
|
-
work = text
|
28
|
+
work = clean_text(text)
|
16
29
|
|
17
30
|
while work.length > wrap do
|
18
31
|
if work =~ /^(.{0,#{wrap}})[ \n]/ then
|
data/test/rubygems/test_gem.rb
CHANGED
@@ -75,6 +75,29 @@ class TestGem < Gem::TestCase
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
+
def test_self_finish_resolve_respects_loaded_specs
|
79
|
+
save_loaded_features do
|
80
|
+
a1 = new_spec "a", "1", "b" => "> 0"
|
81
|
+
b1 = new_spec "b", "1", "c" => ">= 1"
|
82
|
+
b2 = new_spec "b", "2", "c" => ">= 2"
|
83
|
+
c1 = new_spec "c", "1"
|
84
|
+
c2 = new_spec "c", "2"
|
85
|
+
|
86
|
+
install_specs c1, c2, b1, b2, a1
|
87
|
+
|
88
|
+
a1.activate
|
89
|
+
c1.activate
|
90
|
+
|
91
|
+
assert_equal %w(a-1 c-1), loaded_spec_names
|
92
|
+
assert_equal ["b (> 0)"], unresolved_names
|
93
|
+
|
94
|
+
Gem.finish_resolve
|
95
|
+
|
96
|
+
assert_equal %w(a-1 b-1 c-1), loaded_spec_names
|
97
|
+
assert_equal [], unresolved_names
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
78
101
|
def test_self_install
|
79
102
|
spec_fetcher do |f|
|
80
103
|
f.gem 'a', 1
|
@@ -492,7 +515,7 @@ class TestGem < Gem::TestCase
|
|
492
515
|
skip if RUBY_VERSION <= "1.8.7"
|
493
516
|
|
494
517
|
cwd = File.expand_path("test/rubygems", @@project_dir)
|
495
|
-
$LOAD_PATH.unshift
|
518
|
+
actual_load_path = $LOAD_PATH.unshift(cwd).dup
|
496
519
|
|
497
520
|
discover_path = File.join 'lib', 'sff', 'discover.rb'
|
498
521
|
|
@@ -518,12 +541,12 @@ class TestGem < Gem::TestCase
|
|
518
541
|
expected = [
|
519
542
|
File.expand_path('test/rubygems/sff/discover.rb', @@project_dir),
|
520
543
|
File.join(foo1.full_gem_path, discover_path)
|
521
|
-
]
|
544
|
+
].sort
|
522
545
|
|
523
|
-
assert_equal expected, Gem.find_files('sff/discover')
|
524
|
-
assert_equal expected, Gem.find_files('sff/**.rb'), '[ruby-core:31730]'
|
546
|
+
assert_equal expected, Gem.find_files('sff/discover').sort
|
547
|
+
assert_equal expected, Gem.find_files('sff/**.rb').sort, '[ruby-core:31730]'
|
525
548
|
ensure
|
526
|
-
assert_equal cwd,
|
549
|
+
assert_equal cwd, actual_load_path.shift unless RUBY_VERSION <= "1.8.7"
|
527
550
|
end
|
528
551
|
|
529
552
|
def test_self_find_latest_files
|
@@ -24,7 +24,8 @@ class TestGemCommandsOpenCommand < Gem::TestCase
|
|
24
24
|
@cmd.options[:args] = %w[foo]
|
25
25
|
@cmd.options[:editor] = "#{Gem.ruby} -e0 --"
|
26
26
|
|
27
|
-
|
27
|
+
gem 'foo', '1.0.0'
|
28
|
+
spec = gem 'foo', '1.0.1'
|
28
29
|
mock = MiniTest::Mock.new
|
29
30
|
mock.expect(:call, true, [spec.full_gem_path])
|
30
31
|
|
@@ -116,6 +116,86 @@ a (2)
|
|
116
116
|
This is a lot of text. This is a lot of text. This is a lot of text.
|
117
117
|
This is a lot of text.
|
118
118
|
|
119
|
+
pl (1)
|
120
|
+
Platform: i386-linux
|
121
|
+
Author: A User
|
122
|
+
Homepage: http://example.com
|
123
|
+
|
124
|
+
this is a summary
|
125
|
+
EOF
|
126
|
+
|
127
|
+
assert_equal expected, @ui.output
|
128
|
+
assert_equal '', @ui.error
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_execute_details_cleans_text
|
132
|
+
spec_fetcher do |fetcher|
|
133
|
+
fetcher.spec 'a', 2 do |s|
|
134
|
+
s.summary = 'This is a lot of text. ' * 4
|
135
|
+
s.authors = ["Abraham Lincoln \x01", "\x02 Hirohito"]
|
136
|
+
s.homepage = "http://a.example.com/\x03"
|
137
|
+
end
|
138
|
+
|
139
|
+
fetcher.legacy_platform
|
140
|
+
end
|
141
|
+
|
142
|
+
@cmd.handle_options %w[-r -d]
|
143
|
+
|
144
|
+
use_ui @ui do
|
145
|
+
@cmd.execute
|
146
|
+
end
|
147
|
+
|
148
|
+
expected = <<-EOF
|
149
|
+
|
150
|
+
*** REMOTE GEMS ***
|
151
|
+
|
152
|
+
a (2)
|
153
|
+
Authors: Abraham Lincoln ., . Hirohito
|
154
|
+
Homepage: http://a.example.com/.
|
155
|
+
|
156
|
+
This is a lot of text. This is a lot of text. This is a lot of text.
|
157
|
+
This is a lot of text.
|
158
|
+
|
159
|
+
pl (1)
|
160
|
+
Platform: i386-linux
|
161
|
+
Author: A User
|
162
|
+
Homepage: http://example.com
|
163
|
+
|
164
|
+
this is a summary
|
165
|
+
EOF
|
166
|
+
|
167
|
+
assert_equal expected, @ui.output
|
168
|
+
assert_equal '', @ui.error
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_execute_details_truncates_summary
|
172
|
+
spec_fetcher do |fetcher|
|
173
|
+
fetcher.spec 'a', 2 do |s|
|
174
|
+
s.summary = 'This is a lot of text. ' * 10_000
|
175
|
+
s.authors = ["Abraham Lincoln \x01", "\x02 Hirohito"]
|
176
|
+
s.homepage = "http://a.example.com/\x03"
|
177
|
+
end
|
178
|
+
|
179
|
+
fetcher.legacy_platform
|
180
|
+
end
|
181
|
+
|
182
|
+
@cmd.handle_options %w[-r -d]
|
183
|
+
|
184
|
+
use_ui @ui do
|
185
|
+
@cmd.execute
|
186
|
+
end
|
187
|
+
|
188
|
+
expected = <<-EOF
|
189
|
+
|
190
|
+
*** REMOTE GEMS ***
|
191
|
+
|
192
|
+
a (2)
|
193
|
+
Authors: Abraham Lincoln ., . Hirohito
|
194
|
+
Homepage: http://a.example.com/.
|
195
|
+
|
196
|
+
Truncating the summary for a-2 to 100,000 characters:
|
197
|
+
#{" This is a lot of text. This is a lot of text. This is a lot of text.\n" * 1449} This is a lot of te
|
198
|
+
|
119
199
|
pl (1)
|
120
200
|
Platform: i386-linux
|
121
201
|
Author: A User
|
@@ -642,7 +722,7 @@ pl (1)
|
|
642
722
|
assert_equal expected, @ui.output
|
643
723
|
end
|
644
724
|
|
645
|
-
def
|
725
|
+
def test_execute_exact_remote
|
646
726
|
spec_fetcher do |fetcher|
|
647
727
|
fetcher.spec 'coolgem-omg', 3
|
648
728
|
fetcher.spec 'coolgem', '4.2.1'
|
@@ -665,6 +745,60 @@ coolgem (4.2.1)
|
|
665
745
|
assert_equal expected, @ui.output
|
666
746
|
end
|
667
747
|
|
748
|
+
def test_execute_exact_local
|
749
|
+
spec_fetcher do |fetcher|
|
750
|
+
fetcher.spec 'coolgem-omg', 3
|
751
|
+
fetcher.spec 'coolgem', '4.2.1'
|
752
|
+
fetcher.spec 'wow_coolgem', 1
|
753
|
+
end
|
754
|
+
|
755
|
+
@cmd.handle_options %w[--exact coolgem]
|
756
|
+
|
757
|
+
use_ui @ui do
|
758
|
+
@cmd.execute
|
759
|
+
end
|
760
|
+
|
761
|
+
expected = <<-EOF
|
762
|
+
|
763
|
+
*** LOCAL GEMS ***
|
764
|
+
|
765
|
+
coolgem (4.2.1)
|
766
|
+
EOF
|
767
|
+
|
768
|
+
assert_equal expected, @ui.output
|
769
|
+
end
|
770
|
+
|
771
|
+
def test_execute_exact_multiple
|
772
|
+
spec_fetcher do |fetcher|
|
773
|
+
fetcher.spec 'coolgem-omg', 3
|
774
|
+
fetcher.spec 'coolgem', '4.2.1'
|
775
|
+
fetcher.spec 'wow_coolgem', 1
|
776
|
+
|
777
|
+
fetcher.spec 'othergem-omg', 3
|
778
|
+
fetcher.spec 'othergem', '1.2.3'
|
779
|
+
fetcher.spec 'wow_othergem', 1
|
780
|
+
end
|
781
|
+
|
782
|
+
@cmd.handle_options %w[--exact coolgem othergem]
|
783
|
+
|
784
|
+
use_ui @ui do
|
785
|
+
@cmd.execute
|
786
|
+
end
|
787
|
+
|
788
|
+
expected = <<-EOF
|
789
|
+
|
790
|
+
*** LOCAL GEMS ***
|
791
|
+
|
792
|
+
coolgem (4.2.1)
|
793
|
+
|
794
|
+
*** LOCAL GEMS ***
|
795
|
+
|
796
|
+
othergem (1.2.3)
|
797
|
+
EOF
|
798
|
+
|
799
|
+
assert_equal expected, @ui.output
|
800
|
+
end
|
801
|
+
|
668
802
|
private
|
669
803
|
|
670
804
|
def add_gems_to_fetcher
|
@@ -108,6 +108,58 @@ source #{@gem_repo} already present in the cache
|
|
108
108
|
assert_equal '', @ui.error
|
109
109
|
end
|
110
110
|
|
111
|
+
def test_execute_add_redundant_source_trailing_slash
|
112
|
+
# Remove pre-existing gem source (w/ slash)
|
113
|
+
repo_with_slash = "http://gems.example.com/"
|
114
|
+
@cmd.handle_options %W[--remove #{repo_with_slash}]
|
115
|
+
use_ui @ui do
|
116
|
+
@cmd.execute
|
117
|
+
end
|
118
|
+
source = Gem::Source.new repo_with_slash
|
119
|
+
assert_equal false, Gem.sources.include?(source)
|
120
|
+
|
121
|
+
expected = <<-EOF
|
122
|
+
#{repo_with_slash} removed from sources
|
123
|
+
EOF
|
124
|
+
|
125
|
+
assert_equal expected, @ui.output
|
126
|
+
assert_equal '', @ui.error
|
127
|
+
|
128
|
+
# Re-add pre-existing gem source (w/o slash)
|
129
|
+
repo_without_slash = "http://gems.example.com"
|
130
|
+
@cmd.handle_options %W[--add #{repo_without_slash}]
|
131
|
+
use_ui @ui do
|
132
|
+
@cmd.execute
|
133
|
+
end
|
134
|
+
source = Gem::Source.new repo_without_slash
|
135
|
+
assert_equal true, Gem.sources.include?(source)
|
136
|
+
|
137
|
+
expected = <<-EOF
|
138
|
+
http://gems.example.com/ removed from sources
|
139
|
+
http://gems.example.com added to sources
|
140
|
+
EOF
|
141
|
+
|
142
|
+
assert_equal expected, @ui.output
|
143
|
+
assert_equal '', @ui.error
|
144
|
+
|
145
|
+
# Re-add original gem source (w/ slash)
|
146
|
+
@cmd.handle_options %W[--add #{repo_with_slash}]
|
147
|
+
use_ui @ui do
|
148
|
+
@cmd.execute
|
149
|
+
end
|
150
|
+
source = Gem::Source.new repo_with_slash
|
151
|
+
assert_equal true, Gem.sources.include?(source)
|
152
|
+
|
153
|
+
expected = <<-EOF
|
154
|
+
http://gems.example.com/ removed from sources
|
155
|
+
http://gems.example.com added to sources
|
156
|
+
source http://gems.example.com/ already present in the cache
|
157
|
+
EOF
|
158
|
+
|
159
|
+
assert_equal expected, @ui.output
|
160
|
+
assert_equal '', @ui.error
|
161
|
+
end
|
162
|
+
|
111
163
|
def test_execute_add_http_rubygems_org
|
112
164
|
http_rubygems_org = 'http://rubygems.org'
|
113
165
|
|
@@ -62,7 +62,12 @@ if ARGV.first
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
if Gem.respond_to?(:activate_bin_path)
|
65
66
|
load Gem.activate_bin_path('a', 'executable', version)
|
67
|
+
else
|
68
|
+
gem "a", version
|
69
|
+
load Gem.bin_path("a", "executable", version)
|
70
|
+
end
|
66
71
|
EOF
|
67
72
|
|
68
73
|
wrapper = @installer.app_script_text 'executable'
|
@@ -1443,6 +1448,26 @@ gem 'other', version
|
|
1443
1448
|
end
|
1444
1449
|
end
|
1445
1450
|
|
1451
|
+
def test_pre_install_checks_malicious_name
|
1452
|
+
spec = util_spec '../malicious', '1'
|
1453
|
+
def spec.full_name # so the spec is buildable
|
1454
|
+
"malicious-1"
|
1455
|
+
end
|
1456
|
+
def spec.validate; end
|
1457
|
+
|
1458
|
+
util_build_gem spec
|
1459
|
+
|
1460
|
+
gem = File.join(@gemhome, 'cache', spec.file_name)
|
1461
|
+
|
1462
|
+
use_ui @ui do
|
1463
|
+
@installer = Gem::Installer.at gem
|
1464
|
+
e = assert_raises Gem::InstallError do
|
1465
|
+
@installer.pre_install_checks
|
1466
|
+
end
|
1467
|
+
assert_equal '#<Gem::Specification name=../malicious version=1> has an invalid name', e.message
|
1468
|
+
end
|
1469
|
+
end
|
1470
|
+
|
1446
1471
|
def test_shebang
|
1447
1472
|
util_make_exec @spec, "#!/usr/bin/ruby"
|
1448
1473
|
|
@@ -241,6 +241,21 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|
241
241
|
dns.verify
|
242
242
|
end
|
243
243
|
|
244
|
+
def test_api_endpoint_ignores_trans_domain_values_that_end_with_original_in_path
|
245
|
+
uri = URI.parse "http://example.com/foo"
|
246
|
+
target = MiniTest::Mock.new
|
247
|
+
target.expect :target, "evil.com/a.example.com"
|
248
|
+
|
249
|
+
dns = MiniTest::Mock.new
|
250
|
+
dns.expect :getresource, target, [String, Object]
|
251
|
+
|
252
|
+
fetch = Gem::RemoteFetcher.new nil, dns
|
253
|
+
assert_equal URI.parse("http://example.com/foo"), fetch.api_endpoint(uri)
|
254
|
+
|
255
|
+
target.verify
|
256
|
+
dns.verify
|
257
|
+
end
|
258
|
+
|
244
259
|
def test_api_endpoint_timeout_warning
|
245
260
|
uri = URI.parse "http://gems.example.com/foo"
|
246
261
|
|
@@ -2985,7 +2985,37 @@ Did you mean 'Ruby'?
|
|
2985
2985
|
@a1.validate
|
2986
2986
|
end
|
2987
2987
|
|
2988
|
-
assert_equal 'invalid value for attribute name: ":json"', e.message
|
2988
|
+
assert_equal 'invalid value for attribute name: ":json" must be a string', e.message
|
2989
|
+
|
2990
|
+
@a1.name = []
|
2991
|
+
e = assert_raises Gem::InvalidSpecificationException do
|
2992
|
+
@a1.validate
|
2993
|
+
end
|
2994
|
+
assert_equal "invalid value for attribute name: \"[]\" must be a string", e.message
|
2995
|
+
|
2996
|
+
@a1.name = ""
|
2997
|
+
e = assert_raises Gem::InvalidSpecificationException do
|
2998
|
+
@a1.validate
|
2999
|
+
end
|
3000
|
+
assert_equal "invalid value for attribute name: \"\" must include at least one letter", e.message
|
3001
|
+
|
3002
|
+
@a1.name = "12345"
|
3003
|
+
e = assert_raises Gem::InvalidSpecificationException do
|
3004
|
+
@a1.validate
|
3005
|
+
end
|
3006
|
+
assert_equal "invalid value for attribute name: \"12345\" must include at least one letter", e.message
|
3007
|
+
|
3008
|
+
@a1.name = "../malicious"
|
3009
|
+
e = assert_raises Gem::InvalidSpecificationException do
|
3010
|
+
@a1.validate
|
3011
|
+
end
|
3012
|
+
assert_equal "invalid value for attribute name: \"../malicious\" can only include letters, numbers, dashes, and underscores", e.message
|
3013
|
+
|
3014
|
+
@a1.name = "\ba\t"
|
3015
|
+
e = assert_raises Gem::InvalidSpecificationException do
|
3016
|
+
@a1.validate
|
3017
|
+
end
|
3018
|
+
assert_equal "invalid value for attribute name: \"\\ba\\t\" can only include letters, numbers, dashes, and underscores", e.message
|
2989
3019
|
end
|
2990
3020
|
|
2991
3021
|
def test_validate_non_nil
|
@@ -36,6 +36,10 @@ Without the wrapping, the text might not look good in the RSS feed.
|
|
36
36
|
assert_equal expected, format_text(text, 78)
|
37
37
|
end
|
38
38
|
|
39
|
+
def test_format_removes_nonprintable_characters
|
40
|
+
assert_equal "text with weird .. stuff .", format_text("text with weird \x1b\x02 stuff \x7f", 40)
|
41
|
+
end
|
42
|
+
|
39
43
|
def test_min3
|
40
44
|
assert_equal 1, min3(1, 1, 1)
|
41
45
|
assert_equal 1, min3(1, 1, 2)
|
@@ -74,4 +78,11 @@ Without the wrapping, the text might not look good in the RSS feed.
|
|
74
78
|
assert_equal 7, levenshtein_distance("xxxxxxx", "ZenTest")
|
75
79
|
assert_equal 7, levenshtein_distance("zentest", "xxxxxxx")
|
76
80
|
end
|
81
|
+
|
82
|
+
def test_truncate_text
|
83
|
+
assert_equal "abc", truncate_text("abc", "desc")
|
84
|
+
assert_equal "Truncating desc to 2 characters:\nab", truncate_text("abc", "desc", 2)
|
85
|
+
s = "ab" * 500_001
|
86
|
+
assert_equal "Truncating desc to 1,000,000 characters:\n#{s[0, 1_000_000]}", truncate_text(s, "desc", 1_000_000)
|
87
|
+
end
|
77
88
|
end
|
@@ -301,6 +301,17 @@ class TestGemRequire < Gem::TestCase
|
|
301
301
|
assert_equal %w(default-2.0.0.0), loaded_spec_names
|
302
302
|
end
|
303
303
|
|
304
|
+
def test_realworld_default_gem
|
305
|
+
skip "no default gems on ruby < 2.0" unless RUBY_VERSION >= "2"
|
306
|
+
cmd = <<-RUBY
|
307
|
+
$stderr = $stdout
|
308
|
+
require "json"
|
309
|
+
puts Gem.loaded_specs["json"].default_gem?
|
310
|
+
RUBY
|
311
|
+
output = Gem::Util.popen(Gem.ruby, "-e", cmd).strip
|
312
|
+
assert_equal "true", output
|
313
|
+
end
|
314
|
+
|
304
315
|
def test_default_gem_and_normal_gem
|
305
316
|
default_gem_spec = new_default_spec("default", "2.0.0.0",
|
306
317
|
nil, "default/gem.rb")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubygems-update
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.6.
|
4
|
+
version: 2.6.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Weirich
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-
|
13
|
+
date: 2017-10-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: builder
|
@@ -553,6 +553,7 @@ files:
|
|
553
553
|
- lib/rubygems/resolver/stats.rb
|
554
554
|
- lib/rubygems/resolver/vendor_set.rb
|
555
555
|
- lib/rubygems/resolver/vendor_specification.rb
|
556
|
+
- lib/rubygems/safe_yaml.rb
|
556
557
|
- lib/rubygems/security.rb
|
557
558
|
- lib/rubygems/security/policies.rb
|
558
559
|
- lib/rubygems/security/policy.rb
|
@@ -800,7 +801,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
800
801
|
version: '0'
|
801
802
|
requirements: []
|
802
803
|
rubyforge_project:
|
803
|
-
rubygems_version: 2.6.
|
804
|
+
rubygems_version: 2.6.13
|
804
805
|
signing_key:
|
805
806
|
specification_version: 4
|
806
807
|
summary: RubyGems is a package management framework for Ruby
|