build_box 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff554d9ee6d2c5de96dc3b451f5f96e291664eed
4
- data.tar.gz: 6781f63e6a9dfe6ef610c496312cb69d225512c8
3
+ metadata.gz: 45a91ebc98d3adf60d87d913bfb0235613997757
4
+ data.tar.gz: 99ee3754633256d08a367daf36d4bf9a6f5d499c
5
5
  SHA512:
6
- metadata.gz: e58905f0871ae87e515db45868ced96e89acf27723321c88aeb8238ab27e1ac899b4b2522f9070aa3297c8e22d4aca6c622ce95b8e3ac2f04d66c3dd479ec715
7
- data.tar.gz: fdf3a5ef898b33da3ddffbc7ab4eff3658c143a26df2a815259131812666f873d9d4d57157570e9224850c35f7cf26affdad655bfd3fffc592cf2572ad125681
6
+ metadata.gz: 9433398af99c75bf1bff45cfdd89cd2c984506182e8ba59c3aaf5442f4e42d4d40f2b5b1a6bf620d56f231f7587ed22fc73d5ad7cbe223b7edde6bc54a425156
7
+ data.tar.gz: 5f56d2e2c8dec64c41f2eec4b5305b122f3d6d308a73aacd3a9ca73a7ebfd625689003a51ddea3317a8f5efd0389b3ffdb1951a0a1d18bad3e05756de4ceef9c
data/README.md CHANGED
@@ -21,10 +21,11 @@ Or install it yourself as:
21
21
  Remove all the bad methods and classes I can think of. But maybe you need more:
22
22
 
23
23
  ```ruby
24
- Sandrbox.configure do |config|
24
+ BuildBox.configure do |config|
25
25
  config.bad_constants << :Rails
26
26
  config.bad_constants << :ActiveRecord
27
- config.timeout = 3 # default seconds by execution
27
+ config.timeout = 3 # secconds, default: 3
28
+ config.security_level = 0 # (0..3), default: 0
28
29
  end
29
30
  ```
30
31
 
@@ -37,6 +38,7 @@ require 'build_box'
37
38
  result = nil
38
39
  result = BuildBox.perform(' 1 + 2 ');
39
40
  result.output # => 3
41
+ result.result # => 3
40
42
  result.error? # => false
41
43
  result.error # => nil
42
44
 
@@ -51,9 +53,22 @@ BuildBox.perform('`rm -rf /`').output # => "NameError: undefined local variable
51
53
  BuildBox.perform('exec("rm -rf /")').output # => "NameError: undefined local variable or method `exec' for main:Object"
52
54
  BuildBox.perform('Kernel.exec("rm -rf /")').output # => "NameError: undefined local variable or method `exec' for Kernel:Module"BuildBox.perform(['require "open3"']).output # => ["NameError: undefined local variable or method `require' for main:Object"]
53
55
 
56
+ # Execution params
57
+ # BuildBox.perform(code, # => code to be performed
58
+ binding_context=TOPLEVEL_BINDING, # => binding variable context (like ERB)
59
+ security_level=BuildBox.config.security_level, # => $SAFE directive. permited (0..3)
60
+ timeout: 3 # => in seconds
61
+ )
62
+
63
+ BuildBox('1+2', self.__binding__, 3).result # => 3
64
+
65
+ # Hash Parameters
66
+ BuildBox(code:'1+2', binding_context: self.__binding__, security_level: 3).result # => 3
67
+
54
68
 
55
69
  ```
56
70
 
71
+
57
72
  ## Contributing
58
73
 
59
74
  1. Fork it ( http://github.com/<my-github-username>/build_box/fork )
@@ -11,13 +11,8 @@ module BuildBox
11
11
  end
12
12
  alias :config :configure
13
13
 
14
- def perform(code, binding_context=TOPLEVEL_BINDING, security_level=BuildBox.config.security_level)
15
- if code.is_a?(Hash)
16
- binding_context = code.fetch(:binding_context, binding_context)
17
- security_level = code.fetch(:security_level, security_level)
18
- code = code[:code] || (raise 'Code parameter must be informed.')
19
- end
20
- BuildBox::Response.new(code, binding_context, security_level)
14
+ def perform(code, binding_context: TOPLEVEL_BINDING, security_level: BuildBox.config.security_level, timeout: BuildBox.config.timeout)
15
+ BuildBox::Response.new(code, binding_context, security_level, timeout)
21
16
  end
22
17
 
23
18
  end
@@ -9,24 +9,24 @@ module BuildBox
9
9
  option :bad_methods, :default => [
10
10
  [:Object, :abort],
11
11
  [:Kernel, :abort],
12
- # [:Object, :autoload],
13
- # [:Kernel, :autoload],
14
- # [:Object, :autoload?],
15
- # [:Kernel, :autoload?],
12
+ [:Object, :autoload],
13
+ [:Kernel, :autoload],
14
+ [:Object, :autoload?],
15
+ [:Kernel, :autoload?],
16
16
  [:Object, :callcc],
17
17
  [:Kernel, :callcc],
18
- # [:Object, :exit],
19
- # [:Kernel, :exit],
20
- # [:Object, :exit!],
21
- # [:Kernel, :exit!],
22
- # [:Object, :at_exit],
23
- # [:Kernel, :at_exit],
18
+ [:Object, :exit],
19
+ [:Kernel, :exit],
20
+ [:Object, :exit!],
21
+ [:Kernel, :exit!],
22
+ [:Object, :at_exit],
23
+ [:Kernel, :at_exit],
24
24
  [:Object, :exec],
25
25
  [:Kernel, :exec],
26
26
  [:Object, :fork],
27
27
  [:Kernel, :fork],
28
- # [:Object, :load],
29
- # [:Kernel, :load],
28
+ [:Object, :load],
29
+ [:Kernel, :load],
30
30
  [:Object, :open],
31
31
  [:Kernel, :open],
32
32
  [:Object, :set_trace_func],
@@ -37,22 +37,21 @@ module BuildBox
37
37
  [:Kernel, :syscall],
38
38
  [:Object, :system],
39
39
  [:Kernel, :system],
40
- # [:Object, :test],
41
- # [:Kernel, :test],
40
+ [:Object, :test],
41
+ [:Kernel, :test],
42
42
  [:Object, :remove_method],
43
43
  [:Kernel, :remove_method],
44
- # [:Object, :require],
45
- # [:Kernel, :require],
46
- # [:Object, :require_relative],
47
- # [:Kernel, :require_relative],
44
+ [:Object, :require],
45
+ [:Kernel, :require],
46
+ [:Object, :require_relative],
47
+ [:Kernel, :require_relative],
48
48
  [:Object, :undef_method],
49
49
  [:Kernel, :undef_method],
50
50
  [:Object, "`".to_sym],
51
51
  [:Kernel, "`".to_sym],
52
52
  [:Class, "`".to_sym]
53
53
  ]
54
-
55
- option :bad_constants, :default => [:Continuation, :Open3, :File, :Dir, :IO, :BuildBox, :Process, :Thread, :Fiber, :Gem, :Net, :ThreadGroup]
54
+ option :bad_constants, :default => [:Continuation, :Open3, :File, :Dir, :IO, :BuildBox, :Process, :Thread, :Fiber, :Gem, :Net, :ThreadGroup, :SystemExit, :SignalException, :Interrupt, :FileTest, :Signal]
56
55
 
57
56
  option :timeout, :default => 3
58
57
  option :security_level, :default => 3 # (0..3)
@@ -2,12 +2,13 @@ class BuildBox::Perform
2
2
 
3
3
  attr_accessor :output, :error, :code, :unbound_methods, :unbound_constants
4
4
 
5
- def initialize(code, binding_context=TOPLEVEL_BINDING, security_level)
5
+ def initialize(code, binding_context=TOPLEVEL_BINDING, security_level, timeout)
6
6
  self.unbound_methods = []
7
7
  self.unbound_constants = []
8
8
  self.code = code
9
9
  @binding_context = binding_context
10
10
  @security_level = security_level
11
+ @timeout = timeout
11
12
  evaluate
12
13
  end
13
14
 
@@ -22,17 +23,18 @@ class BuildBox::Perform
22
23
  @output = eval(@code, @binding_context, "build_box")
23
24
  @error = nil
24
25
  rescue Exception => e
25
- @error = "#{e.class}: #{e.to_s}"
26
+ @output = nil
27
+ @error = "#{e.class}: #{e.to_s}"
26
28
  ensure
27
29
  restore_constants
28
30
  restore_methods
29
31
  end
30
32
  end
31
33
 
32
- timeout = t.join(BuildBox.config.timeout)
34
+ timeout = t.join(@timeout)
33
35
  if timeout.nil?
34
- @output = "BuildBoxError: execution expired"
35
- @error = true
36
+ @error = "BuildBoxError: execution expired"
37
+ @output = nil
36
38
  end
37
39
  end
38
40
 
@@ -4,8 +4,8 @@ class BuildBox::Response
4
4
 
5
5
  alias :result :output
6
6
 
7
- def initialize(code, binding_context, security_level)
8
- evaluate(code, binding_context, security_level)
7
+ def initialize(code, binding_context, security_level, timeout)
8
+ evaluate(code, binding_context, security_level, timeout)
9
9
  end
10
10
 
11
11
  def error?
@@ -14,9 +14,9 @@ class BuildBox::Response
14
14
 
15
15
  private
16
16
 
17
- def evaluate(code, binding_context, security_level)
17
+ def evaluate(code, binding_context, security_level, timeout)
18
18
  preserve_namespace
19
- result = BuildBox::Perform.new(code, binding_context, security_level)
19
+ result = BuildBox::Perform.new(code, binding_context, security_level, timeout)
20
20
  @output = result.output
21
21
  @error = result.error
22
22
  @code = result.code
@@ -1,3 +1,3 @@
1
1
  module BuildBox
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -2,6 +2,49 @@ require 'spec_helper'
2
2
 
3
3
  describe "BuildBox" do
4
4
 
5
+ before(:each) do
6
+
7
+ # BuildBox.configure do |config|
8
+ # # config.security_level = 0
9
+ # # config.timeout = 3
10
+
11
+ # # # Add new bad constants
12
+ # # config.bad_constants << :Rails
13
+ # # config.bad_constants << :ActiveRecord
14
+ # # config.bad_constants << :Activity
15
+
16
+ # # Constants used in test and migrations
17
+ # config.bad_constants.delete(:Thread)
18
+ # config.bad_constants.delete(:SystemExit)
19
+ # config.bad_constants.delete(:SignalException)
20
+ # config.bad_constants.delete(:Interrupt)
21
+ # config.bad_constants.delete(:FileTest)
22
+ # config.bad_constants.delete(:Signal)
23
+
24
+ # # # Methods used int test and migrations
25
+ # config.bad_methods.delete([:Object, :autoload])
26
+ # config.bad_methods.delete([:Kernel, :autoload])
27
+ # config.bad_methods.delete([:Object, :autoload?])
28
+ # config.bad_methods.delete([:Kernel, :autoload?])
29
+ # config.bad_methods.delete([:Object, :exit])
30
+ # config.bad_methods.delete([:Kernel, :exit])
31
+ # config.bad_methods.delete([:Object, :exit!])
32
+ # config.bad_methods.delete([:Kernel, :exit!])
33
+ # config.bad_methods.delete([:Object, :at_exit])
34
+ # config.bad_methods.delete([:Kernel, :at_exit])
35
+ # config.bad_methods.delete([:Object, :load])
36
+ # config.bad_methods.delete([:Kernel, :load])
37
+ # config.bad_methods.delete([:Object, :test])
38
+ # config.bad_methods.delete([:Kernel, :test])
39
+ # config.bad_methods.delete([:Object, :require])
40
+ # config.bad_methods.delete([:Kernel, :require])
41
+ # config.bad_methods.delete([:Object, :require_relative])
42
+ # config.bad_methods.delete([:Kernel, :require_relative])
43
+ # end
44
+
45
+
46
+ end
47
+
5
48
  describe ".perform" do
6
49
  let(:correct_code){ '3+2+1'}
7
50
  let(:wrong_code){ '3+2+nil'}
@@ -63,31 +106,27 @@ describe "BuildBox" do
63
106
 
64
107
  it "permit add context varables" do
65
108
  ctx = OpenStruct.new(:params => {a: 1, b: 2})
66
- expect(BuildBox.perform('params[:a] + params[:b]', ctx.__binding__).output).to eql(3)
109
+ expect(BuildBox.perform('params[:a] + params[:b]', binding_context: ctx.__binding__).output).to eql(3)
67
110
  end
68
111
 
69
112
  it "permit add define security level in specific perform" do
70
113
  code = %{ eval('{a: 1, b:2, c:3}')}
71
- expect(BuildBox.perform(code, TOPLEVEL_BINDING, 0).result).to eql({a: 1, b:2, c:3})
72
- expect(BuildBox.perform(code, TOPLEVEL_BINDING, 3).error?).to be_false
114
+ expect(BuildBox.perform(code, security_level: 0).result).to eql({a: 1, b:2, c:3})
115
+ expect(BuildBox.perform(code, security_level: 3).error?).to be_false
73
116
  end
74
117
 
75
118
  it "must permit pass hash parameters" do
76
119
  code = %{ eval('{a: 1, b:2, c:3}')}
77
- expect(BuildBox.perform(code: code, security_level: 0).result).to eql({a: 1, b:2, c:3})
120
+ expect(BuildBox.perform(code, {security_level: 0}).result).to eql({a: 1, b:2, c:3})
78
121
  end
79
122
 
80
- it "must raise error when code key is not passed" do
81
- code = %{ eval('{a: 1, b:2, c:3}')}
82
- begin
83
- expect(BuildBox.perform(cod: code, security_level: 0).result).to raise_error(RuntimeError)
84
- rescue => e
85
- raise e unless e.message == 'Code parameter must be informed.'
86
- end
123
+ it "must permit inform timeout params" do
124
+ BuildBox.config.bad_constants.clear
125
+ BuildBox.config.bad_methods.clear
126
+ code = %{ sleep 0.3 }
127
+ expect(BuildBox.perform(code, security_level:0, timeout: 0.1).error).to eql("BuildBoxError: execution expired")
87
128
  end
88
129
 
89
-
90
-
91
130
  context 'unsafe commands' do
92
131
  it 'does not exit' do
93
132
  expect(BuildBox.config).to receive(:bad_methods).at_least(:once).and_return([])
@@ -98,7 +137,7 @@ describe "BuildBox" do
98
137
  it 'does not exit for kernel' do
99
138
  expect(BuildBox.config).to receive(:bad_methods).at_least(:once).and_return([])
100
139
  expect(BuildBox.config).to receive(:bad_constants).at_least(:once).and_return([])
101
- expect(BuildBox.perform('Kernel.exit').error).to eql("NameError: undefined local variable or method `exit' for Kernel:Module")
140
+ expect(BuildBox.perform('Kernel.exit').error).to eql("SystemExit: exit")
102
141
  end
103
142
 
104
143
  it 'does not exec' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: build_box
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafael Vettori
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-29 00:00:00.000000000 Z
11
+ date: 2014-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler