ruby-changes:27439
From: drbrain <ko1@a...>
Date: Mon, 25 Feb 2013 16:40:33 +0900 (JST)
Subject: [ruby-changes:27439] drbrain:r39491 (trunk): * lib/rubygems/config_file.rb: Lazily load .gem/credentials to only
drbrain 2013-02-25 16:30:41 +0900 (Mon, 25 Feb 2013) New Revision: 39491 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39491 Log: * 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. Modified files: trunk/ChangeLog trunk/lib/rubygems/config_file.rb trunk/test/rubygems/test_gem_commands_push_command.rb trunk/test/rubygems/test_gem_config_file.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 39490) +++ ChangeLog (revision 39491) @@ -1,3 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Mon Feb 25 16:30:30 2013 Eric Hodel <drbrain@s...> + + * 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@r...> * enc/depend (ARFLAGS): VisualC++ linker does not allow spaces between Index: lib/rubygems/config_file.rb =================================================================== --- lib/rubygems/config_file.rb (revision 39490) +++ lib/rubygems/config_file.rb (revision 39491) @@ -127,16 +127,6 @@ class Gem::ConfigFile https://github.com/ruby/ruby/blob/trunk/lib/rubygems/config_file.rb#L127 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 attr_accessor :disable_default_gem_server @@ -221,13 +211,23 @@ class Gem::ConfigFile https://github.com/ruby/ruby/blob/trunk/lib/rubygems/config_file.rb#L211 @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 - load_api_keys + @api_keys = nil + @rubygems_api_key = nil Gem.sources = @hash[:sources] if @hash.key? :sources handle_arguments arg_list 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 # error message is displayed and RubyGems aborts. @@ -273,11 +273,24 @@ if you believe they were disclosed to a https://github.com/ruby/ruby/blob/trunk/lib/rubygems/config_file.rb#L273 end if @api_keys.key? :rubygems_api_key then - @rubygems_api_key = @api_keys[:rubygems_api_key] - @api_keys[:rubygems] = @api_keys.delete :rubygems_api_key unless @api_keys.key? :rubygems + @rubygems_api_key = @api_keys[:rubygems_api_key] + @api_keys[:rubygems] = @api_keys.delete :rubygems_api_key unless + @api_keys.key? :rubygems 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 check_credentials_permissions Index: test/rubygems/test_gem_commands_push_command.rb =================================================================== --- test/rubygems/test_gem_commands_push_command.rb (revision 39490) +++ test/rubygems/test_gem_commands_push_command.rb (revision 39491) @@ -18,7 +18,7 @@ class TestGemCommandsPushCommand < Gem:: https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_commands_push_command.rb#L18 "ed244fbf2b1a52e012da8616c512fa47f9aa5250" @spec, @path = util_gem "freewill", "1.0.0" - @host = Gem.host + @host = 'https://rubygems.example' @api_key = Gem.configuration.rubygems_api_key @fetcher = Gem::FakeFetcher.new @@ -61,6 +61,27 @@ class TestGemCommandsPushCommand < Gem:: https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_commands_push_command.rb#L61 assert_match @response, @ui.output 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 Gem.configuration.disable_default_gem_server = true response = "You must specify a gem server" @@ -110,29 +131,13 @@ class TestGemCommandsPushCommand < Gem:: https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_commands_push_command.rb#L131 send_battery end - def test_sending_gem_default + def test_sending_gem @response = "Successfully registered gem: freewill (1.0.0)" @fetcher.data["#{@host}/api/v1/gems"] = [@response, 200, 'OK'] send_battery 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 @cmd.sign_in(*); end assert_raises Gem::CommandLineError do @@ -143,6 +148,7 @@ class TestGemCommandsPushCommand < Gem:: https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_commands_push_command.rb#L148 def test_sending_gem_denied response = "You don't have permission to push to this gem" @fetcher.data["#{@host}/api/v1/gems"] = [response, 403, 'Forbidden'] + @cmd.instance_variable_set :@host, @host assert_raises Gem::MockGemUi::TermError do use_ui @ui do @@ -162,6 +168,7 @@ class TestGemCommandsPushCommand < Gem:: https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_commands_push_command.rb#L168 Gem.configuration.load_api_keys @cmd.handle_options %w(-k other) + @cmd.instance_variable_set :@host, @host @cmd.send_gem(@path) assert_equal Gem.configuration.api_keys[:other], Index: test/rubygems/test_gem_config_file.rb =================================================================== --- test/rubygems/test_gem_config_file.rb (revision 39490) +++ test/rubygems/test_gem_config_file.rb (revision 39491) @@ -164,6 +164,21 @@ class TestGemConfigFile < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_config_file.rb#L164 assert_equal 2048, @cfg.bulk_threshold 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 skip 'chmod not supported' if win_platform? -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/