mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/rubygems/config_file.rb: Lazily load .gem/credentials to only
check permissions when necessary. RubyGems bug #465 * test/rubygems/test_gem_config_file.rb: Test for the above. * test/rubygems/test_gem_commands_push_command.rb: Remove duplicated test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39491 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
be26224be5
commit
e276482efc
4 changed files with 75 additions and 31 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
Mon Feb 25 16:30:30 2013 Eric Hodel <drbrain@segment7.net>
|
||||||
|
|
||||||
|
* lib/rubygems/config_file.rb: Lazily load .gem/credentials to only
|
||||||
|
check permissions when necessary. RubyGems bug #465
|
||||||
|
* test/rubygems/test_gem_config_file.rb: Test for the above.
|
||||||
|
|
||||||
|
* test/rubygems/test_gem_commands_push_command.rb: Remove duplicated
|
||||||
|
test.
|
||||||
|
|
||||||
Mon Feb 25 15:47:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Mon Feb 25 15:47:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* enc/depend (ARFLAGS): VisualC++ linker does not allow spaces between
|
* enc/depend (ARFLAGS): VisualC++ linker does not allow spaces between
|
||||||
|
|
|
@ -126,16 +126,6 @@ class Gem::ConfigFile
|
||||||
|
|
||||||
attr_accessor :update_sources
|
attr_accessor :update_sources
|
||||||
|
|
||||||
##
|
|
||||||
# API key for RubyGems.org
|
|
||||||
|
|
||||||
attr_reader :rubygems_api_key
|
|
||||||
|
|
||||||
##
|
|
||||||
# Hash of RubyGems.org and alternate API keys
|
|
||||||
|
|
||||||
attr_reader :api_keys
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# True if we want to force specification of gem server when pushing a gem
|
# True if we want to force specification of gem server when pushing a gem
|
||||||
|
|
||||||
|
@ -221,12 +211,22 @@ class Gem::ConfigFile
|
||||||
@ssl_verify_mode = @hash[:ssl_verify_mode] if @hash.key? :ssl_verify_mode
|
@ssl_verify_mode = @hash[:ssl_verify_mode] if @hash.key? :ssl_verify_mode
|
||||||
@ssl_ca_cert = @hash[:ssl_ca_cert] if @hash.key? :ssl_ca_cert
|
@ssl_ca_cert = @hash[:ssl_ca_cert] if @hash.key? :ssl_ca_cert
|
||||||
|
|
||||||
load_api_keys
|
@api_keys = nil
|
||||||
|
@rubygems_api_key = nil
|
||||||
|
|
||||||
Gem.sources = @hash[:sources] if @hash.key? :sources
|
Gem.sources = @hash[:sources] if @hash.key? :sources
|
||||||
handle_arguments arg_list
|
handle_arguments arg_list
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Hash of RubyGems.org and alternate API keys
|
||||||
|
|
||||||
|
def api_keys
|
||||||
|
load_api_keys unless @api_keys
|
||||||
|
|
||||||
|
@api_keys
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Checks the permissions of the credentials file. If they are not 0600 an
|
# Checks the permissions of the credentials file. If they are not 0600 an
|
||||||
# error message is displayed and RubyGems aborts.
|
# error message is displayed and RubyGems aborts.
|
||||||
|
@ -273,11 +273,24 @@ if you believe they were disclosed to a third party.
|
||||||
end
|
end
|
||||||
|
|
||||||
if @api_keys.key? :rubygems_api_key then
|
if @api_keys.key? :rubygems_api_key then
|
||||||
@rubygems_api_key = @api_keys[:rubygems_api_key]
|
@rubygems_api_key = @api_keys[:rubygems_api_key]
|
||||||
@api_keys[:rubygems] = @api_keys.delete :rubygems_api_key unless @api_keys.key? :rubygems
|
@api_keys[:rubygems] = @api_keys.delete :rubygems_api_key unless
|
||||||
|
@api_keys.key? :rubygems
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Returns the RubyGems.org API key
|
||||||
|
|
||||||
|
def rubygems_api_key
|
||||||
|
load_api_keys unless @rubygems_api_key
|
||||||
|
|
||||||
|
@rubygems_api_key
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Sets the RubyGems.org API key to +api_key+
|
||||||
|
|
||||||
def rubygems_api_key= api_key
|
def rubygems_api_key= api_key
|
||||||
check_credentials_permissions
|
check_credentials_permissions
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
||||||
"ed244fbf2b1a52e012da8616c512fa47f9aa5250"
|
"ed244fbf2b1a52e012da8616c512fa47f9aa5250"
|
||||||
|
|
||||||
@spec, @path = util_gem "freewill", "1.0.0"
|
@spec, @path = util_gem "freewill", "1.0.0"
|
||||||
@host = Gem.host
|
@host = 'https://rubygems.example'
|
||||||
@api_key = Gem.configuration.rubygems_api_key
|
@api_key = Gem.configuration.rubygems_api_key
|
||||||
|
|
||||||
@fetcher = Gem::FakeFetcher.new
|
@fetcher = Gem::FakeFetcher.new
|
||||||
|
@ -61,6 +61,27 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
||||||
assert_match @response, @ui.output
|
assert_match @response, @ui.output
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_execute_host
|
||||||
|
host = 'https://other.example'
|
||||||
|
|
||||||
|
open 'example', 'w' do |io| io.write 'hello' end
|
||||||
|
|
||||||
|
@response = "Successfully registered gem: freewill (1.0.0)"
|
||||||
|
@fetcher.data["#{host}/api/v1/gems"] = [@response, 200, 'OK']
|
||||||
|
@fetcher.data["#{Gem.host}/api/v1/gems"] =
|
||||||
|
['fail', 500, 'Internal Server Error']
|
||||||
|
|
||||||
|
@cmd.options[:host] = host
|
||||||
|
@cmd.options[:args] = %w[example]
|
||||||
|
|
||||||
|
@cmd.execute
|
||||||
|
|
||||||
|
assert_equal Net::HTTP::Post, @fetcher.last_request.class
|
||||||
|
assert_equal 'hello', @fetcher.last_request.body
|
||||||
|
assert_equal "application/octet-stream",
|
||||||
|
@fetcher.last_request["Content-Type"]
|
||||||
|
end
|
||||||
|
|
||||||
def test_sending_when_default_host_disabled
|
def test_sending_when_default_host_disabled
|
||||||
Gem.configuration.disable_default_gem_server = true
|
Gem.configuration.disable_default_gem_server = true
|
||||||
response = "You must specify a gem server"
|
response = "You must specify a gem server"
|
||||||
|
@ -110,29 +131,13 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
||||||
send_battery
|
send_battery
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_sending_gem_default
|
def test_sending_gem
|
||||||
@response = "Successfully registered gem: freewill (1.0.0)"
|
@response = "Successfully registered gem: freewill (1.0.0)"
|
||||||
@fetcher.data["#{@host}/api/v1/gems"] = [@response, 200, 'OK']
|
@fetcher.data["#{@host}/api/v1/gems"] = [@response, 200, 'OK']
|
||||||
|
|
||||||
send_battery
|
send_battery
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_sending_gem_host
|
|
||||||
@response = "Successfully registered gem: freewill (1.0.0)"
|
|
||||||
@fetcher.data["#{@host}/api/v1/gems"] = [@response, 200, 'OK']
|
|
||||||
@cmd.options['host'] = "#{Gem.host}"
|
|
||||||
|
|
||||||
send_battery
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_sending_gem_ENV
|
|
||||||
@response = "Successfully registered gem: freewill (1.0.0)"
|
|
||||||
@fetcher.data["#{@host}/api/v1/gems"] = [@response, 200, 'OK']
|
|
||||||
ENV["RUBYGEMS_HOST"] = "#{Gem.host}"
|
|
||||||
|
|
||||||
send_battery
|
|
||||||
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
|
||||||
|
@ -143,6 +148,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
||||||
def test_sending_gem_denied
|
def test_sending_gem_denied
|
||||||
response = "You don't have permission to push to this gem"
|
response = "You don't have permission to push to this gem"
|
||||||
@fetcher.data["#{@host}/api/v1/gems"] = [response, 403, 'Forbidden']
|
@fetcher.data["#{@host}/api/v1/gems"] = [response, 403, 'Forbidden']
|
||||||
|
@cmd.instance_variable_set :@host, @host
|
||||||
|
|
||||||
assert_raises Gem::MockGemUi::TermError do
|
assert_raises Gem::MockGemUi::TermError do
|
||||||
use_ui @ui do
|
use_ui @ui do
|
||||||
|
@ -162,6 +168,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
|
||||||
Gem.configuration.load_api_keys
|
Gem.configuration.load_api_keys
|
||||||
|
|
||||||
@cmd.handle_options %w(-k other)
|
@cmd.handle_options %w(-k other)
|
||||||
|
@cmd.instance_variable_set :@host, @host
|
||||||
@cmd.send_gem(@path)
|
@cmd.send_gem(@path)
|
||||||
|
|
||||||
assert_equal Gem.configuration.api_keys[:other],
|
assert_equal Gem.configuration.api_keys[:other],
|
||||||
|
|
|
@ -164,6 +164,21 @@ class TestGemConfigFile < Gem::TestCase
|
||||||
assert_equal 2048, @cfg.bulk_threshold
|
assert_equal 2048, @cfg.bulk_threshold
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_api_keys
|
||||||
|
assert_nil @cfg.instance_variable_get :@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'
|
||||||
|
end
|
||||||
|
|
||||||
|
util_config_file
|
||||||
|
|
||||||
|
assert_equal({:rubygems => '701229f217cdf23b1344c7b4b54ca97'},
|
||||||
|
@cfg.api_keys)
|
||||||
|
end
|
||||||
|
|
||||||
def test_check_credentials_permissions
|
def test_check_credentials_permissions
|
||||||
skip 'chmod not supported' if win_platform?
|
skip 'chmod not supported' if win_platform?
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue