diff --git a/ChangeLog b/ChangeLog index 79797b47a8..08a7b3bf2b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Mon Aug 1 01:17:40 2005 Masatoshi SEKI + + * lib/drb/drb.rb (check_insecure_method): use private_methods and + protected_methods instead of respond_to? to check method visibility. + [ruby-dev:26616] + + * test/drb/drbtest.rb: ditto. + + * test/drb/ut_drb.rb: ditto. + Mon Aug 1 00:07:32 2005 Keiju Ishitsuka * lib/irb/context.rb: fix `irb --readline` option. [ruby-list:40955] diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb index a9b0c99bb3..2177af871b 100644 --- a/lib/drb/drb.rb +++ b/lib/drb/drb.rb @@ -1448,7 +1448,9 @@ module DRb # Coerce an object to a string, providing our own representation if # to_s is not defined for the object. def any_to_s(obj) - obj.to_s rescue sprintf("#<%s:0x%lx>", obj.class, obj.__id__) + obj.to_s + ":#{obj.class}" + rescue + sprintf("#<%s:0x%lx>", obj.class, obj.__id__) end # Check that a method is callable via dRuby. @@ -1463,22 +1465,19 @@ module DRb return true if Proc === obj && msg_id == :__drb_yield raise(ArgumentError, "#{any_to_s(msg_id)} is not a symbol") unless Symbol == msg_id.class raise(SecurityError, "insecure method `#{msg_id}'") if insecure_method?(msg_id) - unless obj.respond_to?(msg_id) + + if obj.private_methods.include?(msg_id.to_s) desc = any_to_s(obj) - if desc.nil? || desc[0] == '#' - desc << ":#{obj.class}" - end - - if obj.private_methods.include?(msg_id.to_s) - raise NameError, "private method `#{msg_id}' called for #{desc}" - else - raise NameError, "undefined method `#{msg_id}' called for #{desc}" - end + raise NoMethodError, "private method `#{msg_id}' called for #{desc}" + elsif obj.protected_methods.include?(msg_id.to_s) + desc = any_to_s(obj) + raise NoMethodError, "protected method `#{msg_id}' called for #{desc}" + else + true end - true end public :check_insecure_method - + class InvokeMethod # :nodoc: def initialize(drb_server, client) @drb_server = drb_server diff --git a/test/drb/drbtest.rb b/test/drb/drbtest.rb index 432c7a78bb..410a33c7e1 100644 --- a/test/drb/drbtest.rb +++ b/test/drb/drbtest.rb @@ -176,24 +176,42 @@ module DRbCore end end - def test_07_public_private + def test_07_public_private_protected_missing assert_nothing_raised() { begin @there.method_missing(:eval) - rescue NameError + rescue NoMethodError assert_match(/^private method \`eval\'/, $!.message) end } + assert_nothing_raised() { + begin + @there.call_private_method + rescue NoMethodError + assert_equal(NoMethodError, $!.class) + assert_match(/^private method \`call_private_method\'/, $!.message) + end + } + assert_nothing_raised() { + begin + @there.call_protected_method + rescue NoMethodError + assert_equal(NoMethodError, $!.class) + assert_match(/^protected method \`call_protected_method\'/, $!.message) + end + } assert_nothing_raised() { begin @there.method_missing(:undefined_method_test) - rescue NameError + rescue NoMethodError + assert_equal(NoMethodError, $!.class) assert_match(/^undefined method \`undefined_method_test\'/, $!.message) end } assert_raises(SecurityError) do @there.method_missing(:__send__, :to_s) end + assert_equal(true, @there.missing) end def test_08_here diff --git a/test/drb/ut_drb.rb b/test/drb/ut_drb.rb index 93ac1d83fe..f5720cfca2 100644 --- a/test/drb/ut_drb.rb +++ b/test/drb/ut_drb.rb @@ -126,10 +126,23 @@ class DRbEx [self] end + def method_missing(msg, *a, &b) + if msg == :missing + return true + else + super(msg, *a, &b) + end + end + private def call_private_method true end + + protected + def call_protected_method + true + end end if __FILE__ == $0