rubygems-update 3.0.2 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/bundler/lib/bundler/build_metadata.rb +1 -1
  3. data/bundler/man/bundle-add.1 +58 -0
  4. data/bundler/man/bundle-binstubs.1 +40 -0
  5. data/bundler/man/bundle-check.1 +31 -0
  6. data/bundler/man/bundle-clean.1 +24 -0
  7. data/bundler/man/bundle-config.1 +497 -0
  8. data/bundler/man/bundle-doctor.1 +44 -0
  9. data/bundler/man/bundle-exec.1 +165 -0
  10. data/bundler/man/bundle-gem.1 +80 -0
  11. data/bundler/man/bundle-info.1 +20 -0
  12. data/bundler/man/bundle-init.1 +25 -0
  13. data/bundler/man/bundle-inject.1 +33 -0
  14. data/bundler/man/bundle-install.1 +308 -0
  15. data/bundler/man/bundle-list.1 +50 -0
  16. data/bundler/man/bundle-lock.1 +84 -0
  17. data/bundler/man/bundle-open.1 +32 -0
  18. data/bundler/man/bundle-outdated.1 +155 -0
  19. data/bundler/man/bundle-package.1 +55 -0
  20. data/bundler/man/bundle-platform.1 +61 -0
  21. data/bundler/man/bundle-pristine.1 +34 -0
  22. data/bundler/man/bundle-remove.1 +31 -0
  23. data/bundler/man/bundle-show.1 +23 -0
  24. data/bundler/man/bundle-update.1 +394 -0
  25. data/bundler/man/bundle-viz.1 +39 -0
  26. data/bundler/man/bundle.1 +136 -0
  27. data/lib/rubygems.rb +1 -1
  28. data/lib/rubygems/command_manager.rb +6 -4
  29. data/lib/rubygems/commands/owner_command.rb +4 -1
  30. data/lib/rubygems/gemcutter_utilities.rb +5 -2
  31. data/lib/rubygems/installer.rb +24 -5
  32. data/lib/rubygems/package.rb +10 -0
  33. data/lib/rubygems/user_interaction.rb +4 -1
  34. data/rubygems-update.gemspec +1 -1
  35. data/test/rubygems/test_gem_installer.rb +106 -0
  36. data/test/rubygems/test_gem_package.rb +34 -0
  37. data/test/rubygems/test_gem_text.rb +5 -0
  38. metadata +51 -3
@@ -0,0 +1,136 @@
1
+ .\" generated with Ronn/v0.7.3
2
+ .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
+ .
4
+ .TH "BUNDLE" "1" "January 2019" "" ""
5
+ .
6
+ .SH "NAME"
7
+ \fBbundle\fR \- Ruby Dependency Management
8
+ .
9
+ .SH "SYNOPSIS"
10
+ \fBbundle\fR COMMAND [\-\-no\-color] [\-\-verbose] [ARGS]
11
+ .
12
+ .SH "DESCRIPTION"
13
+ Bundler manages an \fBapplication\'s dependencies\fR through its entire life across many machines systematically and repeatably\.
14
+ .
15
+ .P
16
+ See the bundler website \fIhttp://bundler\.io\fR for information on getting started, and Gemfile(5) for more information on the \fBGemfile\fR format\.
17
+ .
18
+ .SH "OPTIONS"
19
+ .
20
+ .TP
21
+ \fB\-\-no\-color\fR
22
+ Print all output without color
23
+ .
24
+ .TP
25
+ \fB\-\-retry\fR, \fB\-r\fR
26
+ Specify the number of times you wish to attempt network commands
27
+ .
28
+ .TP
29
+ \fB\-\-verbose\fR, \fB\-V\fR
30
+ Print out additional logging information
31
+ .
32
+ .SH "BUNDLE COMMANDS"
33
+ We divide \fBbundle\fR subcommands into primary commands and utilities:
34
+ .
35
+ .SH "PRIMARY COMMANDS"
36
+ .
37
+ .TP
38
+ \fBbundle install(1)\fR \fIbundle\-install\.1\.html\fR
39
+ Install the gems specified by the \fBGemfile\fR or \fBGemfile\.lock\fR
40
+ .
41
+ .TP
42
+ \fBbundle update(1)\fR \fIbundle\-update\.1\.html\fR
43
+ Update dependencies to their latest versions
44
+ .
45
+ .TP
46
+ \fBbundle package(1)\fR \fIbundle\-package\.1\.html\fR
47
+ Package the \.gem files required by your application into the \fBvendor/cache\fR directory
48
+ .
49
+ .TP
50
+ \fBbundle exec(1)\fR \fIbundle\-exec\.1\.html\fR
51
+ Execute a script in the current bundle
52
+ .
53
+ .TP
54
+ \fBbundle config(1)\fR \fIbundle\-config\.1\.html\fR
55
+ Specify and read configuration options for Bundler
56
+ .
57
+ .TP
58
+ \fBbundle help(1)\fR
59
+ Display detailed help for each subcommand
60
+ .
61
+ .SH "UTILITIES"
62
+ .
63
+ .TP
64
+ \fBbundle add(1)\fR \fIbundle\-add\.1\.html\fR
65
+ Add the named gem to the Gemfile and run \fBbundle install\fR
66
+ .
67
+ .TP
68
+ \fBbundle binstubs(1)\fR \fIbundle\-binstubs\.1\.html\fR
69
+ Generate binstubs for executables in a gem
70
+ .
71
+ .TP
72
+ \fBbundle check(1)\fR \fIbundle\-check\.1\.html\fR
73
+ Determine whether the requirements for your application are installed and available to Bundler
74
+ .
75
+ .TP
76
+ \fBbundle show(1)\fR \fIbundle\-show\.1\.html\fR
77
+ Show the source location of a particular gem in the bundle
78
+ .
79
+ .TP
80
+ \fBbundle outdated(1)\fR \fIbundle\-outdated\.1\.html\fR
81
+ Show all of the outdated gems in the current bundle
82
+ .
83
+ .TP
84
+ \fBbundle console(1)\fR
85
+ Start an IRB session in the current bundle
86
+ .
87
+ .TP
88
+ \fBbundle open(1)\fR \fIbundle\-open\.1\.html\fR
89
+ Open an installed gem in the editor
90
+ .
91
+ .TP
92
+ \fBbundle lock(1)\fR \fIbundle\-lock\.1\.hmtl\fR
93
+ Generate a lockfile for your dependencies
94
+ .
95
+ .TP
96
+ \fBbundle viz(1)\fR \fIbundle\-viz\.1\.html\fR
97
+ Generate a visual representation of your dependencies
98
+ .
99
+ .TP
100
+ \fBbundle init(1)\fR \fIbundle\-init\.1\.html\fR
101
+ Generate a simple \fBGemfile\fR, placed in the current directory
102
+ .
103
+ .TP
104
+ \fBbundle gem(1)\fR \fIbundle\-gem\.1\.html\fR
105
+ Create a simple gem, suitable for development with Bundler
106
+ .
107
+ .TP
108
+ \fBbundle platform(1)\fR \fIbundle\-platform\.1\.html\fR
109
+ Display platform compatibility information
110
+ .
111
+ .TP
112
+ \fBbundle clean(1)\fR \fIbundle\-clean\.1\.html\fR
113
+ Clean up unused gems in your Bundler directory
114
+ .
115
+ .TP
116
+ \fBbundle doctor(1)\fR \fIbundle\-doctor\.1\.html\fR
117
+ Display warnings about common problems
118
+ .
119
+ .TP
120
+ \fBbundle remove(1)\fR \fIbundle\-remove\.1\.html\fR
121
+ Removes gems from the Gemfile
122
+ .
123
+ .SH "PLUGINS"
124
+ When running a command that isn\'t listed in PRIMARY COMMANDS or UTILITIES, Bundler will try to find an executable on your path named \fBbundler\-<command>\fR and execute it, passing down any extra arguments to it\.
125
+ .
126
+ .SH "OBSOLETE"
127
+ These commands are obsolete and should no longer be used:
128
+ .
129
+ .IP "\(bu" 4
130
+ \fBbundle cache(1)\fR
131
+ .
132
+ .IP "\(bu" 4
133
+ \fBbundle show(1)\fR
134
+ .
135
+ .IP "" 0
136
+
@@ -9,7 +9,7 @@
9
9
  require 'rbconfig'
10
10
 
11
11
  module Gem
12
- VERSION = "3.0.2".freeze
12
+ VERSION = "3.0.3".freeze
13
13
  end
14
14
 
15
15
  # Must be first since it unloads the prelude from 1.9.2
@@ -7,6 +7,7 @@
7
7
 
8
8
  require 'rubygems/command'
9
9
  require 'rubygems/user_interaction'
10
+ require 'rubygems/text'
10
11
 
11
12
  ##
12
13
  # The command manager registers and installs all the individual sub-commands
@@ -32,6 +33,7 @@ require 'rubygems/user_interaction'
32
33
 
33
34
  class Gem::CommandManager
34
35
 
36
+ include Gem::Text
35
37
  include Gem::UserInteraction
36
38
 
37
39
  BUILTIN_COMMANDS = [ # :nodoc:
@@ -145,12 +147,12 @@ class Gem::CommandManager
145
147
  def run(args, build_args=nil)
146
148
  process_args(args, build_args)
147
149
  rescue StandardError, Timeout::Error => ex
148
- alert_error "While executing gem ... (#{ex.class})\n #{ex}"
150
+ alert_error clean_text("While executing gem ... (#{ex.class})\n #{ex}")
149
151
  ui.backtrace ex
150
152
 
151
153
  terminate_interaction(1)
152
154
  rescue Interrupt
153
- alert_error "Interrupted"
155
+ alert_error clean_text("Interrupted")
154
156
  terminate_interaction(1)
155
157
  end
156
158
 
@@ -168,7 +170,7 @@ class Gem::CommandManager
168
170
  say Gem::VERSION
169
171
  terminate_interaction 0
170
172
  when /^-/ then
171
- alert_error "Invalid option: #{args.first}. See 'gem --help'."
173
+ alert_error clean_text("Invalid option: #{args.first}. See 'gem --help'.")
172
174
  terminate_interaction 1
173
175
  else
174
176
  cmd_name = args.shift.downcase
@@ -224,7 +226,7 @@ class Gem::CommandManager
224
226
  rescue Exception => e
225
227
  e = load_error if load_error
226
228
 
227
- alert_error "Loading command: #{command_name} (#{e.class})\n\t#{e}"
229
+ alert_error clean_text("Loading command: #{command_name} (#{e.class})\n\t#{e}")
228
230
  ui.backtrace e
229
231
  end
230
232
  end
@@ -2,8 +2,11 @@
2
2
  require 'rubygems/command'
3
3
  require 'rubygems/local_remote_options'
4
4
  require 'rubygems/gemcutter_utilities'
5
+ require 'rubygems/text'
5
6
 
6
7
  class Gem::Commands::OwnerCommand < Gem::Command
8
+
9
+ include Gem::Text
7
10
  include Gem::LocalRemoteOptions
8
11
  include Gem::GemcutterUtilities
9
12
 
@@ -65,7 +68,7 @@ permission to.
65
68
  end
66
69
 
67
70
  with_response response do |resp|
68
- owners = Gem::SafeYAML.load resp.body
71
+ owners = Gem::SafeYAML.load clean_text(resp.body)
69
72
 
70
73
  say "Owners for gem: #{name}"
71
74
  owners.each do |owner|
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
  require 'rubygems/remote_fetcher'
3
+ require 'rubygems/text'
3
4
 
4
5
  ##
5
6
  # Utility methods for using the RubyGems API.
6
7
 
7
8
  module Gem::GemcutterUtilities
8
9
 
10
+ include Gem::Text
11
+
9
12
  # TODO: move to Gem::Command
10
13
  OptionParser.accept Symbol do |value|
11
14
  value.to_sym
@@ -162,13 +165,13 @@ module Gem::GemcutterUtilities
162
165
  if block_given?
163
166
  yield response
164
167
  else
165
- say response.body
168
+ say clean_text(response.body)
166
169
  end
167
170
  else
168
171
  message = response.body
169
172
  message = "#{error_prefix}: #{message}" if error_prefix
170
173
 
171
- say message
174
+ say clean_text(message)
172
175
  terminate_interaction 1 # TODO: question this
173
176
  end
174
177
  end
@@ -725,9 +725,26 @@ class Gem::Installer
725
725
  unpack or File.writable?(gem_home)
726
726
  end
727
727
 
728
- def verify_spec_name
729
- return if spec.name =~ Gem::Specification::VALID_NAME_PATTERN
730
- raise Gem::InstallError, "#{spec} has an invalid name"
728
+ def verify_spec
729
+ unless spec.name =~ Gem::Specification::VALID_NAME_PATTERN
730
+ raise Gem::InstallError, "#{spec} has an invalid name"
731
+ end
732
+
733
+ if spec.raw_require_paths.any?{|path| path =~ /\R/ }
734
+ raise Gem::InstallError, "#{spec} has an invalid require_paths"
735
+ end
736
+
737
+ if spec.extensions.any?{|ext| ext =~ /\R/ }
738
+ raise Gem::InstallError, "#{spec} has an invalid extensions"
739
+ end
740
+
741
+ unless spec.specification_version.to_s =~ /\A\d+\z/
742
+ raise Gem::InstallError, "#{spec} has an invalid specification_version"
743
+ end
744
+
745
+ if spec.dependencies.any? {|dep| dep.type =~ /\R/ || dep.name =~ /\R/ }
746
+ raise Gem::InstallError, "#{spec} has an invalid dependencies"
747
+ end
731
748
  end
732
749
 
733
750
  ##
@@ -876,9 +893,11 @@ TEXT
876
893
  def pre_install_checks
877
894
  verify_gem_home options[:unpack]
878
895
 
879
- ensure_loadable_spec
896
+ # The name and require_paths must be verified first, since it could contain
897
+ # ruby code that would be eval'ed in #ensure_loadable_spec
898
+ verify_spec
880
899
 
881
- verify_spec_name
900
+ ensure_loadable_spec
882
901
 
883
902
  if options[:install_as_default]
884
903
  Gem.ensure_default_gem_subdirectories gem_home
@@ -456,6 +456,16 @@ EOM
456
456
  raise Gem::Package::PathError.new(destination, destination_dir) unless
457
457
  destination.start_with? destination_dir + '/'
458
458
 
459
+ begin
460
+ real_destination = File.expand_path(File.realpath(destination))
461
+ rescue
462
+ # it's fine if the destination doesn't exist, because rm -rf'ing it can't cause any damage
463
+ nil
464
+ else
465
+ raise Gem::Package::PathError.new(real_destination, destination_dir) unless
466
+ real_destination.start_with? destination_dir + '/'
467
+ end
468
+
459
469
  destination.untaint
460
470
  destination
461
471
  end
@@ -7,6 +7,7 @@
7
7
 
8
8
  require 'rubygems/util'
9
9
  require 'rubygems/deprecate'
10
+ require 'rubygems/text'
10
11
 
11
12
  ##
12
13
  # Module that defines the default UserInteraction. Any class including this
@@ -14,6 +15,8 @@ require 'rubygems/deprecate'
14
15
 
15
16
  module Gem::DefaultUserInteraction
16
17
 
18
+ include Gem::Text
19
+
17
20
  ##
18
21
  # The default UI is a class variable of the singleton class for this
19
22
  # module.
@@ -162,7 +165,7 @@ module Gem::UserInteraction
162
165
  # is true.
163
166
 
164
167
  def verbose(msg = nil)
165
- say(msg || yield) if Gem.configuration.really_verbose
168
+ say(clean_text(msg || yield)) if Gem.configuration.really_verbose
166
169
  end
167
170
  end
168
171
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "rubygems-update"
5
- s.version = "3.0.2"
5
+ s.version = "3.0.3"
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
 
@@ -1446,6 +1446,112 @@ gem 'other', version
1446
1446
  end
1447
1447
  end
1448
1448
 
1449
+ def test_pre_install_checks_malicious_name_before_eval
1450
+ spec = util_spec "malicious\n::Object.const_set(:FROM_EVAL, true)#", '1'
1451
+ def spec.full_name # so the spec is buildable
1452
+ "malicious-1"
1453
+ end
1454
+ def spec.validate(*args); end
1455
+
1456
+ util_build_gem spec
1457
+
1458
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1459
+
1460
+ use_ui @ui do
1461
+ @installer = Gem::Installer.at gem
1462
+ e = assert_raises Gem::InstallError do
1463
+ @installer.pre_install_checks
1464
+ end
1465
+ assert_equal "#<Gem::Specification name=malicious\n::Object.const_set(:FROM_EVAL, true)# version=1> has an invalid name", e.message
1466
+ end
1467
+ refute defined?(::Object::FROM_EVAL)
1468
+ end
1469
+
1470
+ def test_pre_install_checks_malicious_require_paths_before_eval
1471
+ spec = util_spec "malicious", '1'
1472
+ def spec.full_name # so the spec is buildable
1473
+ "malicious-1"
1474
+ end
1475
+ def spec.validate(*args); end
1476
+ spec.require_paths = ["malicious\n``"]
1477
+
1478
+ util_build_gem spec
1479
+
1480
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1481
+
1482
+ use_ui @ui do
1483
+ @installer = Gem::Installer.at gem
1484
+ e = assert_raises Gem::InstallError do
1485
+ @installer.pre_install_checks
1486
+ end
1487
+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid require_paths", e.message
1488
+ end
1489
+ end
1490
+
1491
+ def test_pre_install_checks_malicious_extensions_before_eval
1492
+ spec = util_spec "malicious", '1'
1493
+ def spec.full_name # so the spec is buildable
1494
+ "malicious-1"
1495
+ end
1496
+ def spec.validate(*args); end
1497
+ spec.extensions = ["malicious\n``"]
1498
+
1499
+ util_build_gem spec
1500
+
1501
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1502
+
1503
+ use_ui @ui do
1504
+ @installer = Gem::Installer.at gem
1505
+ e = assert_raises Gem::InstallError do
1506
+ @installer.pre_install_checks
1507
+ end
1508
+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid extensions", e.message
1509
+ end
1510
+ end
1511
+
1512
+ def test_pre_install_checks_malicious_specification_version_before_eval
1513
+ spec = util_spec "malicious", '1'
1514
+ def spec.full_name # so the spec is buildable
1515
+ "malicious-1"
1516
+ end
1517
+ def spec.validate(*args); end
1518
+ spec.specification_version = "malicious\n``"
1519
+
1520
+ util_build_gem spec
1521
+
1522
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1523
+
1524
+ use_ui @ui do
1525
+ @installer = Gem::Installer.at gem
1526
+ e = assert_raises Gem::InstallError do
1527
+ @installer.pre_install_checks
1528
+ end
1529
+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid specification_version", e.message
1530
+ end
1531
+ end
1532
+
1533
+ def test_pre_install_checks_malicious_dependencies_before_eval
1534
+ spec = util_spec "malicious", '1'
1535
+ def spec.full_name # so the spec is buildable
1536
+ "malicious-1"
1537
+ end
1538
+ def spec.validate(*args); end
1539
+ spec.add_dependency "b\nfoo", '> 5'
1540
+
1541
+ util_build_gem spec
1542
+
1543
+ gem = File.join(@gemhome, 'cache', spec.file_name)
1544
+
1545
+ use_ui @ui do
1546
+ @installer = Gem::Installer.at gem
1547
+ @installer.ignore_dependencies = true
1548
+ e = assert_raises Gem::InstallError do
1549
+ @installer.pre_install_checks
1550
+ end
1551
+ assert_equal "#<Gem::Specification name=malicious version=1> has an invalid dependencies", e.message
1552
+ end
1553
+ end
1554
+
1449
1555
  def test_shebang
1450
1556
  util_make_exec @spec, "#!/usr/bin/ruby"
1451
1557