mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/rubygems/commands/push_command.rb: Fixed credential download for
`gem push --host` * lib/rubygems/gemcutter_utilities.rb: ditto. * test/rubygems/test_gem_commands_push_command.rb: Test for the above. * test/rubygems/test_gem_gemcutter_utilities.rb: ditto. * lib/rubygems/config_file.rb: Abort if the `gem push` credentials file has insecure permissions. * test/rubygems/test_gem_config_file.rb: Test for the above. * lib/rubygems/ext/builder.rb: Do not look for Gemfile, Isolate, etc. while building gem extensions. * lib/rubygems/package.rb: Unset spec and files list if a gem's signatures cannot be verified. * test/rubygems/test_gem_package.rb: Test for the above. * lib/rubygems/specification.rb: Reduce use of eval. * lib/rubygems/test_case.rb: ditto. * test/rubygems/test_gem_specification.rb: Test setting specification_version for legacy gems. Dup Gem.ruby before untainting in case it's frozen. * lib/rubygems.rb: Reduce use of eval. Only read files when looking for Gemfile, Isolate, etc. * test/rubygems/test_gem.rb: Test for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39055 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
6dfd56696f
commit
1633e543db
15 changed files with 274 additions and 92 deletions
30
ChangeLog
30
ChangeLog
|
@ -1,3 +1,33 @@
|
||||||
|
Tue Feb 5 11:35:35 2013 Eric Hodel <drbrain@segment7.net>
|
||||||
|
|
||||||
|
* lib/rubygems/commands/push_command.rb: Fixed credential download for
|
||||||
|
`gem push --host`
|
||||||
|
* lib/rubygems/gemcutter_utilities.rb: ditto.
|
||||||
|
* test/rubygems/test_gem_commands_push_command.rb: Test for the above.
|
||||||
|
* test/rubygems/test_gem_gemcutter_utilities.rb: ditto.
|
||||||
|
|
||||||
|
* lib/rubygems/config_file.rb: Abort if the `gem push` credentials
|
||||||
|
file has insecure permissions.
|
||||||
|
* test/rubygems/test_gem_config_file.rb: Test for the above.
|
||||||
|
|
||||||
|
* lib/rubygems/ext/builder.rb: Do not look for Gemfile, Isolate, etc.
|
||||||
|
while building gem extensions.
|
||||||
|
|
||||||
|
* lib/rubygems/package.rb: Unset spec and files list if a gem's
|
||||||
|
signatures cannot be verified.
|
||||||
|
* test/rubygems/test_gem_package.rb: Test for the above.
|
||||||
|
|
||||||
|
* lib/rubygems/specification.rb: Reduce use of eval.
|
||||||
|
* lib/rubygems/test_case.rb: ditto.
|
||||||
|
|
||||||
|
* test/rubygems/test_gem_specification.rb: Test setting
|
||||||
|
specification_version for legacy gems. Dup Gem.ruby before
|
||||||
|
untainting in case it's frozen.
|
||||||
|
|
||||||
|
* lib/rubygems.rb: Reduce use of eval. Only read files when looking
|
||||||
|
for Gemfile, Isolate, etc.
|
||||||
|
* test/rubygems/test_gem.rb: Test for the above.
|
||||||
|
|
||||||
Tue Feb 5 10:15:00 2013 Zachary Scott <zachary@zacharyscott.net>
|
Tue Feb 5 10:15:00 2013 Zachary Scott <zachary@zacharyscott.net>
|
||||||
|
|
||||||
* doc/security.rdoc: Wrap security guide at 80 columns
|
* doc/security.rdoc: Wrap security guide at 80 columns
|
||||||
|
|
|
@ -207,7 +207,7 @@ module Gem
|
||||||
|
|
||||||
begin
|
begin
|
||||||
while true
|
while true
|
||||||
path = GEM_DEP_FILES.find { |f| File.exists?(f) }
|
path = GEM_DEP_FILES.find { |f| File.file?(f) }
|
||||||
|
|
||||||
if path
|
if path
|
||||||
path = File.join here, path
|
path = File.join here, path
|
||||||
|
@ -226,7 +226,9 @@ module Gem
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return unless File.exists? path
|
path.untaint
|
||||||
|
|
||||||
|
return unless File.file? path
|
||||||
|
|
||||||
rs = Gem::RequestSet.new
|
rs = Gem::RequestSet.new
|
||||||
rs.load_gemdeps path
|
rs.load_gemdeps path
|
||||||
|
@ -369,29 +371,6 @@ module Gem
|
||||||
paths.path
|
paths.path
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
|
||||||
# Expand each partial gem path with each of the required paths specified
|
|
||||||
# in the Gem spec. Each expanded path is yielded.
|
|
||||||
|
|
||||||
def self.each_load_path(partials)
|
|
||||||
partials.each do |gp|
|
|
||||||
base = File.basename gp
|
|
||||||
specfn = File.join(dir, "specifications", "#{base}.gemspec")
|
|
||||||
if File.exists? specfn
|
|
||||||
spec = eval(File.read(specfn))
|
|
||||||
spec.require_paths.each do |rp|
|
|
||||||
yield File.join(gp,rp)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
filename = File.join(gp, 'lib')
|
|
||||||
yield(filename) if File.exists? filename
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private_class_method :each_load_path
|
|
||||||
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# Quietly ensure the named Gem directory contains all the proper
|
# Quietly ensure the named Gem directory contains all the proper
|
||||||
# subdirectories. If we can't create a directory due to a permission
|
# subdirectories. If we can't create a directory due to a permission
|
||||||
|
|
|
@ -24,16 +24,19 @@ class Gem::Commands::PushCommand < Gem::Command
|
||||||
add_proxy_option
|
add_proxy_option
|
||||||
add_key_option
|
add_key_option
|
||||||
|
|
||||||
add_option(
|
add_option('--host HOST',
|
||||||
'--host HOST',
|
'Push to another gemcutter-compatible host') do |value, options|
|
||||||
'Push to another gemcutter-compatible host'
|
|
||||||
) do |value, options|
|
|
||||||
options[:host] = value
|
options[:host] = value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@host = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def execute
|
def execute
|
||||||
sign_in
|
@host = options[:host]
|
||||||
|
|
||||||
|
sign_in @host
|
||||||
|
|
||||||
send_gem get_one_gem_name
|
send_gem get_one_gem_name
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -44,26 +47,30 @@ class Gem::Commands::PushCommand < Gem::Command
|
||||||
|
|
||||||
if latest_rubygems_version < Gem.rubygems_version and
|
if latest_rubygems_version < Gem.rubygems_version and
|
||||||
Gem.rubygems_version.prerelease? and
|
Gem.rubygems_version.prerelease? and
|
||||||
Gem::Version.new('2.0.0.preview3') != Gem.rubygems_version then
|
Gem::Version.new('2.0.0.rc.2') != Gem.rubygems_version then
|
||||||
alert_error <<-ERROR
|
alert_error <<-ERROR
|
||||||
You are using a beta release of RubyGems (#{Gem::VERSION}) which is not
|
You are using a beta release of RubyGems (#{Gem::VERSION}) which is not
|
||||||
allowed to push gems. Please downgrade or upgrade to a release version.
|
allowed to push gems. Please downgrade or upgrade to a release version.
|
||||||
|
|
||||||
The latest released RubyGems version is #{latest_rubygems_version}
|
The latest released RubyGems version is #{latest_rubygems_version}
|
||||||
|
|
||||||
|
You can upgrade or downgrade to the latest release version with:
|
||||||
|
|
||||||
|
gem update --system=#{latest_rubygems_version}
|
||||||
|
|
||||||
ERROR
|
ERROR
|
||||||
terminate_interaction 1
|
terminate_interaction 1
|
||||||
end
|
end
|
||||||
|
|
||||||
host = options[:host]
|
unless @host then
|
||||||
unless host
|
|
||||||
if gem_data = Gem::Package.new(name) then
|
if gem_data = Gem::Package.new(name) then
|
||||||
host = gem_data.spec.metadata['default_gem_server']
|
@host = gem_data.spec.metadata['default_gem_server']
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
args << host if host
|
args << @host if @host
|
||||||
|
|
||||||
say "Pushing gem to #{host || Gem.host}..."
|
say "Pushing gem to #{@host || Gem.host}..."
|
||||||
|
|
||||||
response = rubygems_api_request(*args) do |request|
|
response = rubygems_api_request(*args) do |request|
|
||||||
request.body = Gem.read_binary name
|
request.body = Gem.read_binary name
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
|
|
||||||
class Gem::ConfigFile
|
class Gem::ConfigFile
|
||||||
|
|
||||||
|
include Gem::UserInteraction
|
||||||
|
|
||||||
DEFAULT_BACKTRACE = false
|
DEFAULT_BACKTRACE = false
|
||||||
DEFAULT_BULK_THRESHOLD = 1000
|
DEFAULT_BULK_THRESHOLD = 1000
|
||||||
DEFAULT_VERBOSITY = true
|
DEFAULT_VERBOSITY = true
|
||||||
|
@ -223,6 +225,34 @@ class Gem::ConfigFile
|
||||||
handle_arguments arg_list
|
handle_arguments arg_list
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Checks the permissions of the credentials file. If they are not 0600 an
|
||||||
|
# error message is displayed and RubyGems aborts.
|
||||||
|
|
||||||
|
def check_credentials_permissions
|
||||||
|
return unless File.exist? credentials_path
|
||||||
|
|
||||||
|
existing_permissions = File.stat(credentials_path).mode & 0777
|
||||||
|
|
||||||
|
return if existing_permissions == 0600
|
||||||
|
|
||||||
|
alert_error <<-ERROR
|
||||||
|
Your gem push credentials file located at:
|
||||||
|
|
||||||
|
\t#{credentials_path}
|
||||||
|
|
||||||
|
has file permissions of 0#{existing_permissions.to_s 8} but 0600 is required.
|
||||||
|
|
||||||
|
You should reset your credentials at:
|
||||||
|
|
||||||
|
\thttps://rubygems.org/profile/edit
|
||||||
|
|
||||||
|
if you believe they were disclosed to a third party.
|
||||||
|
ERROR
|
||||||
|
|
||||||
|
terminate_interaction 1
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Location of RubyGems.org credentials
|
# Location of RubyGems.org credentials
|
||||||
|
|
||||||
|
@ -231,6 +261,8 @@ class Gem::ConfigFile
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_api_keys
|
def load_api_keys
|
||||||
|
check_credentials_permissions
|
||||||
|
|
||||||
@api_keys = if File.exist? credentials_path then
|
@api_keys = if File.exist? credentials_path then
|
||||||
load_file(credentials_path)
|
load_file(credentials_path)
|
||||||
else
|
else
|
||||||
|
@ -243,7 +275,9 @@ class Gem::ConfigFile
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def rubygems_api_key=(api_key)
|
def rubygems_api_key= api_key
|
||||||
|
check_credentials_permissions
|
||||||
|
|
||||||
config = load_file(credentials_path).merge(:rubygems_api_key => api_key)
|
config = load_file(credentials_path).merge(:rubygems_api_key => api_key)
|
||||||
|
|
||||||
dirname = File.dirname credentials_path
|
dirname = File.dirname credentials_path
|
||||||
|
|
|
@ -43,12 +43,18 @@ class Gem::Ext::Builder
|
||||||
def self.run(command, results, command_name = nil)
|
def self.run(command, results, command_name = nil)
|
||||||
verbose = Gem.configuration.really_verbose
|
verbose = Gem.configuration.really_verbose
|
||||||
|
|
||||||
if verbose
|
begin
|
||||||
puts(command)
|
# TODO use Process.spawn when ruby 1.8 support is dropped.
|
||||||
system(command)
|
rubygems_gemdeps, ENV['RUBYGEMS_GEMDEPS'] = ENV['RUBYGEMS_GEMDEPS'], nil
|
||||||
else
|
if verbose
|
||||||
results << command
|
puts(command)
|
||||||
results << `#{command} #{redirector}`
|
system(command)
|
||||||
|
else
|
||||||
|
results << command
|
||||||
|
results << `#{command} #{redirector}`
|
||||||
|
end
|
||||||
|
ensure
|
||||||
|
ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps
|
||||||
end
|
end
|
||||||
|
|
||||||
unless $?.success? then
|
unless $?.success? then
|
||||||
|
|
|
@ -27,17 +27,25 @@ module Gem::GemcutterUtilities
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def sign_in
|
def sign_in sign_in_host = self.host
|
||||||
return if Gem.configuration.rubygems_api_key
|
return if Gem.configuration.rubygems_api_key
|
||||||
|
|
||||||
say "Enter your RubyGems.org credentials."
|
pretty_host = if Gem::DEFAULT_HOST == sign_in_host then
|
||||||
say "Don't have an account yet? Create one at http://rubygems.org/sign_up"
|
'RubyGems.org'
|
||||||
|
else
|
||||||
|
sign_in_host
|
||||||
|
end
|
||||||
|
|
||||||
|
say "Enter your #{pretty_host} credentials."
|
||||||
|
say "Don't have an account yet? " +
|
||||||
|
"Create one at https://#{sign_in_host}/sign_up"
|
||||||
|
|
||||||
email = ask " Email: "
|
email = ask " Email: "
|
||||||
password = ask_for_password "Password: "
|
password = ask_for_password "Password: "
|
||||||
say "\n"
|
say "\n"
|
||||||
|
|
||||||
response = rubygems_api_request :get, "api/v1/api_key" do |request|
|
response = rubygems_api_request(:get, "api/v1/api_key",
|
||||||
|
sign_in_host) do |request|
|
||||||
request.basic_auth email, password
|
request.basic_auth email, password
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -473,6 +473,10 @@ EOM
|
||||||
@security_policy
|
@security_policy
|
||||||
|
|
||||||
true
|
true
|
||||||
|
rescue Gem::Security::Exception
|
||||||
|
@spec = nil
|
||||||
|
@files = []
|
||||||
|
raise
|
||||||
rescue Errno::ENOENT => e
|
rescue Errno::ENOENT => e
|
||||||
raise Gem::Package::FormatError.new e.message
|
raise Gem::Package::FormatError.new e.message
|
||||||
rescue Gem::Package::TarInvalidError => e
|
rescue Gem::Package::TarInvalidError => e
|
||||||
|
|
|
@ -904,7 +904,7 @@ class Gem::Specification
|
||||||
raise Gem::Exception, "YAML data doesn't evaluate to gem specification"
|
raise Gem::Exception, "YAML data doesn't evaluate to gem specification"
|
||||||
end
|
end
|
||||||
|
|
||||||
spec.instance_eval { @specification_version ||= NONEXISTENT_SPECIFICATION_VERSION }
|
spec.specification_version ||= NONEXISTENT_SPECIFICATION_VERSION
|
||||||
spec.reset_nil_attributes_to_default
|
spec.reset_nil_attributes_to_default
|
||||||
|
|
||||||
spec
|
spec
|
||||||
|
|
|
@ -143,8 +143,9 @@ class Gem::TestCase < MiniTest::Unit::TestCase
|
||||||
@gemhome = File.join @tempdir, 'gemhome'
|
@gemhome = File.join @tempdir, 'gemhome'
|
||||||
@userhome = File.join @tempdir, 'userhome'
|
@userhome = File.join @tempdir, 'userhome'
|
||||||
|
|
||||||
@orig_ruby = if ruby = ENV['RUBY'] then
|
@orig_ruby = if ENV['RUBY'] then
|
||||||
Gem.class_eval { ruby, @ruby = @ruby, ruby.dup }
|
ruby = Gem.instance_variable_get :@ruby
|
||||||
|
Gem.instance_variable_set :@ruby, ENV['RUBY']
|
||||||
ruby
|
ruby
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -264,7 +265,7 @@ class Gem::TestCase < MiniTest::Unit::TestCase
|
||||||
ENV['GEM_PATH'] = @orig_gem_path
|
ENV['GEM_PATH'] = @orig_gem_path
|
||||||
|
|
||||||
_ = @orig_ruby
|
_ = @orig_ruby
|
||||||
Gem.class_eval { @ruby = _ } if _
|
Gem.instance_variable_set :@ruby, @orig_ruby if @orig_ruby
|
||||||
|
|
||||||
if @orig_ENV_HOME then
|
if @orig_ENV_HOME then
|
||||||
ENV['HOME'] = @orig_ENV_HOME
|
ENV['HOME'] = @orig_ENV_HOME
|
||||||
|
|
|
@ -667,6 +667,25 @@ class TestGem < Gem::TestCase
|
||||||
assert_equal %w[http://rubygems.org/], Gem.default_sources
|
assert_equal %w[http://rubygems.org/], Gem.default_sources
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_self_detect_gemdeps
|
||||||
|
rubygems_gemdeps, ENV['RUBYGEMS_GEMDEPS'] = ENV['RUBYGEMS_GEMDEPS'], '-'
|
||||||
|
|
||||||
|
FileUtils.mkdir_p 'detect/a/b'
|
||||||
|
FileUtils.mkdir_p 'detect/a/Isolate'
|
||||||
|
|
||||||
|
FileUtils.touch 'detect/Isolate'
|
||||||
|
|
||||||
|
begin
|
||||||
|
Dir.chdir 'detect/a/b'
|
||||||
|
|
||||||
|
assert_empty Gem.detect_gemdeps
|
||||||
|
ensure
|
||||||
|
Dir.chdir @tempdir
|
||||||
|
end
|
||||||
|
ensure
|
||||||
|
ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps
|
||||||
|
end
|
||||||
|
|
||||||
def test_self_dir
|
def test_self_dir
|
||||||
assert_equal @gemhome, Gem.dir
|
assert_equal @gemhome, Gem.dir
|
||||||
end
|
end
|
||||||
|
@ -1457,7 +1476,7 @@ class TestGem < Gem::TestCase
|
||||||
ENV['GEM_PATH'] = path
|
ENV['GEM_PATH'] = path
|
||||||
ENV['RUBYGEMS_GEMDEPS'] = "-"
|
ENV['RUBYGEMS_GEMDEPS'] = "-"
|
||||||
|
|
||||||
out = `#{Gem.ruby.untaint} -I #{LIB_PATH.untaint} -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
|
out = `#{Gem.ruby.dup.untaint} -I #{LIB_PATH.untaint} -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
|
||||||
|
|
||||||
assert_equal '["a-1", "b-1", "c-1"]', out.strip
|
assert_equal '["a-1", "b-1", "c-1"]', out.strip
|
||||||
end
|
end
|
||||||
|
@ -1489,7 +1508,7 @@ class TestGem < Gem::TestCase
|
||||||
|
|
||||||
Dir.mkdir "sub1"
|
Dir.mkdir "sub1"
|
||||||
out = Dir.chdir "sub1" do
|
out = Dir.chdir "sub1" do
|
||||||
`#{Gem.ruby.untaint} -I #{LIB_PATH.untaint} -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
|
`#{Gem.ruby.dup.untaint} -I #{LIB_PATH.untaint} -rubygems -e "p Gem.loaded_specs.values.map(&:full_name).sort"`
|
||||||
end
|
end
|
||||||
|
|
||||||
Dir.rmdir "sub1"
|
Dir.rmdir "sub1"
|
||||||
|
|
|
@ -46,6 +46,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
||||||
|
|
||||||
def send_battery
|
def send_battery
|
||||||
use_ui @ui do
|
use_ui @ui do
|
||||||
|
@cmd.instance_variable_set :@host, @host
|
||||||
@cmd.send_gem(@path)
|
@cmd.send_gem(@path)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -133,7 +134,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_raises_error_with_no_arguments
|
def test_raises_error_with_no_arguments
|
||||||
def @cmd.sign_in; end
|
def @cmd.sign_in(*); end
|
||||||
assert_raises Gem::CommandLineError do
|
assert_raises Gem::CommandLineError do
|
||||||
@cmd.execute
|
@cmd.execute
|
||||||
end
|
end
|
||||||
|
|
|
@ -164,6 +164,36 @@ class TestGemConfigFile < Gem::TestCase
|
||||||
assert_equal 2048, @cfg.bulk_threshold
|
assert_equal 2048, @cfg.bulk_threshold
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_check_credentials_permissions
|
||||||
|
@cfg.rubygems_api_key = 'x'
|
||||||
|
|
||||||
|
File.chmod 0644, @cfg.credentials_path
|
||||||
|
|
||||||
|
use_ui @ui do
|
||||||
|
assert_raises Gem::MockGemUi::TermError do
|
||||||
|
@cfg.load_api_keys
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_empty @ui.output
|
||||||
|
|
||||||
|
expected = <<-EXPECTED
|
||||||
|
ERROR: Your gem push credentials file located at:
|
||||||
|
|
||||||
|
\t#{@cfg.credentials_path}
|
||||||
|
|
||||||
|
has file permissions of 0644 but 0600 is required.
|
||||||
|
|
||||||
|
You should reset your credentials at:
|
||||||
|
|
||||||
|
\thttps://rubygems.org/profile/edit
|
||||||
|
|
||||||
|
if you believe they were disclosed to a third party.
|
||||||
|
EXPECTED
|
||||||
|
|
||||||
|
assert_equal expected, @ui.error
|
||||||
|
end
|
||||||
|
|
||||||
def test_handle_arguments
|
def test_handle_arguments
|
||||||
args = %w[--backtrace --bunch --of --args here]
|
args = %w[--backtrace --bunch --of --args here]
|
||||||
|
|
||||||
|
@ -215,6 +245,32 @@ class TestGemConfigFile < Gem::TestCase
|
||||||
assert_equal true, @cfg.backtrace
|
assert_equal true, @cfg.backtrace
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_load_api_keys
|
||||||
|
temp_cred = File.join Gem.user_home, '.gem', 'credentials'
|
||||||
|
FileUtils.mkdir File.dirname(temp_cred)
|
||||||
|
File.open temp_cred, 'w', 0600 do |fp|
|
||||||
|
fp.puts ":rubygems_api_key: 701229f217cdf23b1344c7b4b54ca97"
|
||||||
|
fp.puts ":other: a5fdbb6ba150cbb83aad2bb2fede64c"
|
||||||
|
end
|
||||||
|
|
||||||
|
util_config_file
|
||||||
|
|
||||||
|
assert_equal({:rubygems => '701229f217cdf23b1344c7b4b54ca97',
|
||||||
|
:other => 'a5fdbb6ba150cbb83aad2bb2fede64c'}, @cfg.api_keys)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_load_api_keys_bad_permission
|
||||||
|
skip 'chmod not supported' if win_platform?
|
||||||
|
|
||||||
|
@cfg.rubygems_api_key = 'x'
|
||||||
|
|
||||||
|
File.chmod 0644, @cfg.credentials_path
|
||||||
|
|
||||||
|
assert_raises Gem::MockGemUi::TermError do
|
||||||
|
@cfg.load_api_keys
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_really_verbose
|
def test_really_verbose
|
||||||
assert_equal false, @cfg.really_verbose
|
assert_equal false, @cfg.really_verbose
|
||||||
|
|
||||||
|
@ -227,6 +283,46 @@ class TestGemConfigFile < Gem::TestCase
|
||||||
assert_equal true, @cfg.really_verbose
|
assert_equal true, @cfg.really_verbose
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_rubygems_api_key_equals
|
||||||
|
@cfg.rubygems_api_key = 'x'
|
||||||
|
|
||||||
|
assert_equal 'x', @cfg.rubygems_api_key
|
||||||
|
|
||||||
|
expected = {
|
||||||
|
:rubygems_api_key => 'x',
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_equal expected, YAML.load_file(@cfg.credentials_path)
|
||||||
|
|
||||||
|
unless win_platform? then
|
||||||
|
stat = File.stat @cfg.credentials_path
|
||||||
|
|
||||||
|
assert_equal 0600, stat.mode & 0600
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_rubygems_api_key_equals_bad_permission
|
||||||
|
skip 'chmod not supported' if win_platform?
|
||||||
|
|
||||||
|
@cfg.rubygems_api_key = 'x'
|
||||||
|
|
||||||
|
File.chmod 0644, @cfg.credentials_path
|
||||||
|
|
||||||
|
assert_raises Gem::MockGemUi::TermError do
|
||||||
|
@cfg.rubygems_api_key = 'y'
|
||||||
|
end
|
||||||
|
|
||||||
|
expected = {
|
||||||
|
:rubygems_api_key => 'x',
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_equal expected, YAML.load_file(@cfg.credentials_path)
|
||||||
|
|
||||||
|
stat = File.stat @cfg.credentials_path
|
||||||
|
|
||||||
|
assert_equal 0644, stat.mode & 0644
|
||||||
|
end
|
||||||
|
|
||||||
def test_write
|
def test_write
|
||||||
@cfg.backtrace = true
|
@cfg.backtrace = true
|
||||||
@cfg.update_sources = false
|
@cfg.update_sources = false
|
||||||
|
@ -287,40 +383,6 @@ class TestGemConfigFile < Gem::TestCase
|
||||||
assert_equal %w[http://even-more-gems.example.com], Gem.sources
|
assert_equal %w[http://even-more-gems.example.com], Gem.sources
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_load_rubygems_api_key_from_credentials
|
|
||||||
temp_cred = File.join Gem.user_home, '.gem', 'credentials'
|
|
||||||
FileUtils.mkdir File.dirname(temp_cred)
|
|
||||||
File.open temp_cred, 'w' do |fp|
|
|
||||||
fp.puts ":rubygems_api_key: 701229f217cdf23b1344c7b4b54ca97"
|
|
||||||
end
|
|
||||||
|
|
||||||
util_config_file
|
|
||||||
|
|
||||||
assert_equal "701229f217cdf23b1344c7b4b54ca97", @cfg.rubygems_api_key
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_load_api_keys_from_config
|
|
||||||
temp_cred = File.join Gem.user_home, '.gem', 'credentials'
|
|
||||||
FileUtils.mkdir File.dirname(temp_cred)
|
|
||||||
File.open temp_cred, 'w' do |fp|
|
|
||||||
fp.puts ":rubygems_api_key: 701229f217cdf23b1344c7b4b54ca97"
|
|
||||||
fp.puts ":other: a5fdbb6ba150cbb83aad2bb2fede64c"
|
|
||||||
end
|
|
||||||
|
|
||||||
util_config_file
|
|
||||||
|
|
||||||
assert_equal({:rubygems => '701229f217cdf23b1344c7b4b54ca97',
|
|
||||||
:other => 'a5fdbb6ba150cbb83aad2bb2fede64c'}, @cfg.api_keys)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_save_credentials_file_with_strict_permissions
|
|
||||||
util_config_file
|
|
||||||
FileUtils.mkdir File.dirname(@cfg.credentials_path)
|
|
||||||
@cfg.rubygems_api_key = '701229f217cdf23b1344c7b4b54ca97'
|
|
||||||
mode = 0100600 & (~File.umask)
|
|
||||||
assert_equal mode, File.stat(@cfg.credentials_path).mode unless win_platform?
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ignore_invalid_config_file
|
def test_ignore_invalid_config_file
|
||||||
File.open @temp_conf, 'w' do |fp|
|
File.open @temp_conf, 'w' do |fp|
|
||||||
fp.puts "some-non-yaml-hash-string"
|
fp.puts "some-non-yaml-hash-string"
|
||||||
|
|
|
@ -77,9 +77,24 @@ class TestGemGemcutterUtilities < Gem::TestCase
|
||||||
|
|
||||||
def test_sign_in_with_host
|
def test_sign_in_with_host
|
||||||
api_key = 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903'
|
api_key = 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903'
|
||||||
|
|
||||||
|
util_sign_in [api_key, 200, 'OK'], 'http://example.com', :param
|
||||||
|
|
||||||
|
assert_match "Enter your http://example.com credentials.",
|
||||||
|
@sign_in_ui.output
|
||||||
|
assert @fetcher.last_request["authorization"]
|
||||||
|
assert_match %r{Signed in.}, @sign_in_ui.output
|
||||||
|
|
||||||
|
credentials = YAML.load_file Gem.configuration.credentials_path
|
||||||
|
assert_equal api_key, credentials[:rubygems_api_key]
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_sign_in_with_host_ENV
|
||||||
|
api_key = 'a5fdbb6ba150cbb83aad2bb2fede64cf040453903'
|
||||||
util_sign_in [api_key, 200, 'OK'], 'http://example.com'
|
util_sign_in [api_key, 200, 'OK'], 'http://example.com'
|
||||||
|
|
||||||
assert_match %r{Enter your RubyGems.org credentials.}, @sign_in_ui.output
|
assert_match "Enter your http://example.com credentials.",
|
||||||
|
@sign_in_ui.output
|
||||||
assert @fetcher.last_request["authorization"]
|
assert @fetcher.last_request["authorization"]
|
||||||
assert_match %r{Signed in.}, @sign_in_ui.output
|
assert_match %r{Signed in.}, @sign_in_ui.output
|
||||||
|
|
||||||
|
@ -125,14 +140,14 @@ class TestGemGemcutterUtilities < Gem::TestCase
|
||||||
assert_match %r{Access Denied.}, @sign_in_ui.output
|
assert_match %r{Access Denied.}, @sign_in_ui.output
|
||||||
end
|
end
|
||||||
|
|
||||||
def util_sign_in response, host = nil
|
def util_sign_in response, host = nil, style = :ENV
|
||||||
skip 'Always uses $stdin on windows' if Gem.win_platform?
|
skip 'Always uses $stdin on windows' if Gem.win_platform?
|
||||||
|
|
||||||
email = 'you@example.com'
|
email = 'you@example.com'
|
||||||
password = 'secret'
|
password = 'secret'
|
||||||
|
|
||||||
if host
|
if host
|
||||||
ENV['RUBYGEMS_HOST'] = host
|
ENV['RUBYGEMS_HOST'] = host if style == :ENV
|
||||||
else
|
else
|
||||||
host = Gem.host
|
host = Gem.host
|
||||||
end
|
end
|
||||||
|
@ -144,7 +159,11 @@ class TestGemGemcutterUtilities < Gem::TestCase
|
||||||
@sign_in_ui = Gem::MockGemUi.new "#{email}\n#{password}\n"
|
@sign_in_ui = Gem::MockGemUi.new "#{email}\n#{password}\n"
|
||||||
|
|
||||||
use_ui @sign_in_ui do
|
use_ui @sign_in_ui do
|
||||||
@cmd.sign_in
|
if style == :param then
|
||||||
|
@cmd.sign_in host
|
||||||
|
else
|
||||||
|
@cmd.sign_in
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -499,6 +499,9 @@ class TestGemPackage < Gem::Package::TarTestCase
|
||||||
|
|
||||||
assert_equal 'unsigned gems are not allowed by the High Security policy',
|
assert_equal 'unsigned gems are not allowed by the High Security policy',
|
||||||
e.message
|
e.message
|
||||||
|
|
||||||
|
refute package.instance_variable_get(:@spec), '@spec must not be loaded'
|
||||||
|
assert_empty package.instance_variable_get(:@files), '@files must empty'
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_verify_truncate
|
def test_verify_truncate
|
||||||
|
|
|
@ -118,6 +118,15 @@ end
|
||||||
assert_equal @current_version, new_spec.specification_version
|
assert_equal @current_version, new_spec.specification_version
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_self_from_yaml
|
||||||
|
@a1.instance_variable_set :@specification_version, nil
|
||||||
|
|
||||||
|
spec = Gem::Specification.from_yaml @a1.to_yaml
|
||||||
|
|
||||||
|
assert_equal Gem::Specification::NONEXISTENT_SPECIFICATION_VERSION,
|
||||||
|
spec.specification_version
|
||||||
|
end
|
||||||
|
|
||||||
def test_self_from_yaml_syck_date_bug
|
def test_self_from_yaml_syck_date_bug
|
||||||
# This is equivalent to (and totally valid) psych 1.0 output and
|
# This is equivalent to (and totally valid) psych 1.0 output and
|
||||||
# causes parse errors on syck.
|
# causes parse errors on syck.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue