safemode 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of safemode might be problematic. Click here for more details.
- data/LICENCSE +22 -0
- data/README.markdown +71 -0
- data/Rakefile +15 -0
- data/demo.rb +23 -0
- data/init.rb +1 -0
- data/lib/action_view/template_handlers/safe_erb.rb +43 -0
- data/lib/action_view/template_handlers/safe_haml.rb +27 -0
- data/lib/action_view/template_handlers/safemode_handler.rb +28 -0
- data/lib/haml/safemode.rb +41 -0
- data/lib/rubyparser_bug.rb +8 -0
- data/lib/safemode.rb +58 -0
- data/lib/safemode/blankslate.rb +34 -0
- data/lib/safemode/core_ext.rb +39 -0
- data/lib/safemode/core_jails.rb +104 -0
- data/lib/safemode/exceptions.rb +22 -0
- data/lib/safemode/jail.rb +28 -0
- data/lib/safemode/parser.rb +196 -0
- data/lib/safemode/scope.rb +58 -0
- data/safemode.gemspec +14 -0
- data/safemode.rb +1 -0
- data/test/test_all.rb +14 -0
- data/test/test_erb_eval.rb +76 -0
- data/test/test_helper.rb +130 -0
- data/test/test_jail.rb +53 -0
- data/test/test_safemode_eval.rb +68 -0
- data/test/test_safemode_parser.rb +45 -0
- metadata +98 -0
data/test/test_jail.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class TestJail < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@article = Article.new.to_jail
|
6
|
+
@comment = @article.comments.first
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_explicitly_allowed_methods_should_be_accessible
|
10
|
+
assert_nothing_raised { @article.title }
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_jail_instance_methods_should_be_accessible
|
14
|
+
assert_nothing_raised { @article.author_name }
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_sending_to_jail_to_an_object_should_return_a_jail
|
18
|
+
assert_equal "Article::Jail", @article.class.name
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_jail_instances_should_have_limited_methods
|
22
|
+
expected = ["class", "inspect", "method_missing", "methods", "respond_to?", "to_jail", "to_s", "instance_variable_get"]
|
23
|
+
objects.each do |object|
|
24
|
+
assert_equal expected.sort, reject_pretty_methods(object.to_jail.methods.sort)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_jail_classes_should_have_limited_methods
|
29
|
+
expected = ["new", "methods", "name", "inherited", "method_added", "inspect",
|
30
|
+
"allow", "allowed?", "allowed_methods", "init_allowed_methods",
|
31
|
+
"<", # < needed in Rails Object#subclasses_of
|
32
|
+
"ancestors", "==" # ancestors and == needed in Rails::Generator::Spec#lookup_class
|
33
|
+
]
|
34
|
+
objects.each do |object|
|
35
|
+
assert_equal expected.sort, reject_pretty_methods(object.to_jail.class.methods.sort)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_allowed_methods_should_be_propagated_to_subclasses
|
40
|
+
assert_equal Article::Jail.allowed_methods, Article::ExtendedJail.allowed_methods
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def objects
|
46
|
+
[[], {}, 1..2, "a", :a, Time.now, 1, 1.0, nil, false, true]
|
47
|
+
end
|
48
|
+
|
49
|
+
def reject_pretty_methods(methods)
|
50
|
+
methods.reject{ |method| method =~ /^pretty_/ }
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class TestSafemodeEval < Test::Unit::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@box = Safemode::Box.new
|
8
|
+
@locals = { :article => Article.new }
|
9
|
+
@assigns = { :article => Article.new }
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_some_stuff_that_should_work
|
13
|
+
['"test".upcase', '10.succ', '10.times{}', '[1,2,3].each{|a| a + 1}', 'true ? 1 : 0', 'a = 1'].each do |code|
|
14
|
+
assert_nothing_raised{ @box.eval code }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_should_turn_assigns_to_jails
|
19
|
+
assert_raise_no_method "@article.system", @assigns
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_should_turn_locals_to_jails
|
23
|
+
assert_raise(Safemode::NoMethodError){ @box.eval "article.system", {}, @locals }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_allow_method_access_on_assigns
|
27
|
+
assert_nothing_raised{ @box.eval "@article.title", @assigns }
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_allow_method_access_on_locals
|
31
|
+
assert_nothing_raised{ @box.eval "article.title", {}, @locals }
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_should_not_raise_on_if_using_return_values
|
35
|
+
assert_nothing_raised{ @box.eval "if @article.is_article? then 1 end", @assigns }
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_should_work_with_if_using_return_values
|
39
|
+
assert_equal @box.eval("if @article.is_article? then 1 end", @assigns), 1
|
40
|
+
end
|
41
|
+
|
42
|
+
def test__FILE__should_not_render_filename
|
43
|
+
assert_equal '(string)', @box.eval("__FILE__")
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_interpolated_xstr_should_raise_security
|
47
|
+
assert_raise_security '"#{`ls -a`}"'
|
48
|
+
end
|
49
|
+
|
50
|
+
TestHelper.no_method_error_raising_calls.each do |call|
|
51
|
+
call.gsub!('"', '\\\\"')
|
52
|
+
class_eval %Q(
|
53
|
+
def test_calling_#{call.gsub(/[\W]/, '_')}_should_raise_no_method
|
54
|
+
assert_raise_no_method "#{call}"
|
55
|
+
end
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
TestHelper.security_error_raising_calls.each do |call|
|
60
|
+
call.gsub!('"', '\\\\"')
|
61
|
+
class_eval %Q(
|
62
|
+
def test_calling_#{call.gsub(/[\W]/, '_')}_should_raise_security
|
63
|
+
assert_raise_security "#{call}"
|
64
|
+
end
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
class TestSafemodeParser < Test::Unit::TestCase
|
4
|
+
def test_vcall_should_be_jailed
|
5
|
+
assert_jailed 'to_jail.a.to_jail.class', 'a.class'
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_call_should_be_jailed
|
9
|
+
assert_jailed '(1.to_jail + 1).to_jail.class', '(1 + 1).class'
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_estr_should_be_jailed
|
13
|
+
assert_jailed '"#{1.to_jail.class}"', '"#{1.class}"'
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_if_should_be_usable_for_erb
|
17
|
+
assert_jailed "if true then\n 1\nend", "if true\n 1\n end"
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_if_else_should_be_usable_for_erb
|
21
|
+
assert_jailed "if true then\n 1\n else\n2\nend", "if true\n 1\n else\n2\n end"
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_ternary_should_be_usable_for_erb
|
25
|
+
assert_jailed "if true then\n 1\n else\n2\nend", "true ? 1 : 2"
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_output_buffer_should_be_assignable
|
29
|
+
assert_nothing_raised do
|
30
|
+
jail('@output_buffer = ""')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def assert_jailed(expected, code)
|
37
|
+
assert_equal expected.gsub(' ', ''), jail(code).gsub(' ', '')
|
38
|
+
end
|
39
|
+
|
40
|
+
def jail(code)
|
41
|
+
Safemode::Parser.jail(code)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: safemode
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- sven fuchs, peter cooper, kingsley hendrickse
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-12-17 00:00:00 +00:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: ruby2ruby
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
32
|
+
description: Safemode provides a simple sandbox for executing eval ruby code, as well as erb and haml. Written by Sven Fuchs and Peter Cooper and packaged into a gem by Kingsley Hendrickse
|
33
|
+
email: kingsley@mindflowsolutions.com
|
34
|
+
executables: []
|
35
|
+
|
36
|
+
extensions: []
|
37
|
+
|
38
|
+
extra_rdoc_files: []
|
39
|
+
|
40
|
+
files:
|
41
|
+
- lib/action_view/template_handlers/safe_erb.rb
|
42
|
+
- lib/action_view/template_handlers/safe_haml.rb
|
43
|
+
- lib/action_view/template_handlers/safemode_handler.rb
|
44
|
+
- lib/haml/safemode.rb
|
45
|
+
- lib/rubyparser_bug.rb
|
46
|
+
- lib/safemode/blankslate.rb
|
47
|
+
- lib/safemode/core_ext.rb
|
48
|
+
- lib/safemode/core_jails.rb
|
49
|
+
- lib/safemode/exceptions.rb
|
50
|
+
- lib/safemode/jail.rb
|
51
|
+
- lib/safemode/parser.rb
|
52
|
+
- lib/safemode/scope.rb
|
53
|
+
- lib/safemode.rb
|
54
|
+
- demo.rb
|
55
|
+
- init.rb
|
56
|
+
- LICENCSE
|
57
|
+
- Rakefile
|
58
|
+
- README.markdown
|
59
|
+
- safemode.gemspec
|
60
|
+
- safemode.rb
|
61
|
+
- test/test_all.rb
|
62
|
+
- test/test_erb_eval.rb
|
63
|
+
- test/test_helper.rb
|
64
|
+
- test/test_jail.rb
|
65
|
+
- test/test_safemode_eval.rb
|
66
|
+
- test/test_safemode_parser.rb
|
67
|
+
has_rdoc: true
|
68
|
+
homepage: https://github.com/svenfuchs/safemode
|
69
|
+
licenses: []
|
70
|
+
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
requirements: []
|
91
|
+
|
92
|
+
rubyforge_project: safemode
|
93
|
+
rubygems_version: 1.3.6
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: Safemode provides a simple sandbox for executing eval ruby code, as well as erb and haml
|
97
|
+
test_files: []
|
98
|
+
|