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/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
+