build_box 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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