mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
use private_methods and protected_methods instead of respond_to? to check
method visibility. [ruby-dev:26616] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8872 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
846a9c902f
commit
711b655f38
4 changed files with 56 additions and 16 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
Mon Aug 1 01:17:40 2005 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
|
||||||
|
|
||||||
|
* 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 <keiju@ruby-lang.org>
|
Mon Aug 1 00:07:32 2005 Keiju Ishitsuka <keiju@ruby-lang.org>
|
||||||
* lib/irb/context.rb: fix `irb --readline` option. [ruby-list:40955]
|
* lib/irb/context.rb: fix `irb --readline` option. [ruby-list:40955]
|
||||||
|
|
||||||
|
|
|
@ -1448,7 +1448,9 @@ module DRb
|
||||||
# Coerce an object to a string, providing our own representation if
|
# Coerce an object to a string, providing our own representation if
|
||||||
# to_s is not defined for the object.
|
# to_s is not defined for the object.
|
||||||
def any_to_s(obj)
|
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
|
end
|
||||||
|
|
||||||
# Check that a method is callable via dRuby.
|
# Check that a method is callable via dRuby.
|
||||||
|
@ -1463,20 +1465,17 @@ module DRb
|
||||||
return true if Proc === obj && msg_id == :__drb_yield
|
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(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)
|
raise(SecurityError, "insecure method `#{msg_id}'") if insecure_method?(msg_id)
|
||||||
unless obj.respond_to?(msg_id)
|
|
||||||
desc = any_to_s(obj)
|
|
||||||
if desc.nil? || desc[0] == '#'
|
|
||||||
desc << ":#{obj.class}"
|
|
||||||
end
|
|
||||||
|
|
||||||
if obj.private_methods.include?(msg_id.to_s)
|
if obj.private_methods.include?(msg_id.to_s)
|
||||||
raise NameError, "private method `#{msg_id}' called for #{desc}"
|
desc = any_to_s(obj)
|
||||||
|
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
|
else
|
||||||
raise NameError, "undefined method `#{msg_id}' called for #{desc}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
end
|
||||||
public :check_insecure_method
|
public :check_insecure_method
|
||||||
|
|
||||||
class InvokeMethod # :nodoc:
|
class InvokeMethod # :nodoc:
|
||||||
|
|
|
@ -176,24 +176,42 @@ module DRbCore
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_07_public_private
|
def test_07_public_private_protected_missing
|
||||||
assert_nothing_raised() {
|
assert_nothing_raised() {
|
||||||
begin
|
begin
|
||||||
@there.method_missing(:eval)
|
@there.method_missing(:eval)
|
||||||
rescue NameError
|
rescue NoMethodError
|
||||||
assert_match(/^private method \`eval\'/, $!.message)
|
assert_match(/^private method \`eval\'/, $!.message)
|
||||||
end
|
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() {
|
assert_nothing_raised() {
|
||||||
begin
|
begin
|
||||||
@there.method_missing(:undefined_method_test)
|
@there.method_missing(:undefined_method_test)
|
||||||
rescue NameError
|
rescue NoMethodError
|
||||||
|
assert_equal(NoMethodError, $!.class)
|
||||||
assert_match(/^undefined method \`undefined_method_test\'/, $!.message)
|
assert_match(/^undefined method \`undefined_method_test\'/, $!.message)
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
assert_raises(SecurityError) do
|
assert_raises(SecurityError) do
|
||||||
@there.method_missing(:__send__, :to_s)
|
@there.method_missing(:__send__, :to_s)
|
||||||
end
|
end
|
||||||
|
assert_equal(true, @there.missing)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_08_here
|
def test_08_here
|
||||||
|
|
|
@ -126,10 +126,23 @@ class DRbEx
|
||||||
[self]
|
[self]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def method_missing(msg, *a, &b)
|
||||||
|
if msg == :missing
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
super(msg, *a, &b)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def call_private_method
|
def call_private_method
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
def call_protected_method
|
||||||
|
true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if __FILE__ == $0
|
if __FILE__ == $0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue