jruby_sandbox 0.1.2-java → 0.1.3-java

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: .
9
9
  specs:
10
- jruby_sandbox (0.1.1-java)
10
+ jruby_sandbox (0.1.2-java)
11
11
  fakefs
12
12
 
13
13
  GEM
@@ -17,11 +17,13 @@ import org.jruby.runtime.Block;
17
17
  import org.jruby.runtime.builtin.IRubyObject;
18
18
  import org.jruby.common.IRubyWarnings;
19
19
  import org.jruby.exceptions.RaiseException;
20
+ import org.jruby.runtime.DynamicScope;
20
21
 
21
22
 
22
23
  @JRubyClass(name="Sandbox::Full")
23
24
  public class SandboxFull extends RubyObject {
24
25
  private Ruby wrapped;
26
+ private DynamicScope currentScope;
25
27
 
26
28
  public SandboxFull(Ruby runtime, RubyClass type) {
27
29
  super(runtime, type);
@@ -45,6 +47,8 @@ public class SandboxFull extends RubyObject {
45
47
 
46
48
  RubyClass cBoxedClass = wrapped.defineClass("BoxedClass", wrapped.getObject(), wrapped.getObject().getAllocator());
47
49
  cBoxedClass.defineAnnotatedMethods(BoxedClass.class);
50
+
51
+ currentScope = wrapped.getCurrentContext().getCurrentScope();
48
52
 
49
53
  return this;
50
54
  }
@@ -52,7 +56,7 @@ public class SandboxFull extends RubyObject {
52
56
  @JRubyMethod(required=1)
53
57
  public IRubyObject eval(IRubyObject str) {
54
58
  try {
55
- IRubyObject result = wrapped.evalScriptlet(str.asJavaString(), wrapped.getCurrentContext().getCurrentScope());
59
+ IRubyObject result = wrapped.evalScriptlet(str.asJavaString(), currentScope);
56
60
  return unbox(result);
57
61
  } catch (RaiseException e) {
58
62
  String msg = e.getException().callMethod(wrapped.getCurrentContext(), "message").asJavaString();
Binary file
@@ -1,3 +1,3 @@
1
1
  module Sandbox
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
data/lib/sandbox.rb CHANGED
@@ -1,10 +1,11 @@
1
1
  require 'sandbox/sandbox'
2
2
  require 'sandbox/version'
3
3
  require 'fakefs/safe'
4
- require 'timeout'
5
4
 
6
5
  module Sandbox
7
6
  PRELUDE = File.expand_path('../sandbox/prelude.rb', __FILE__).freeze # :nodoc:
7
+
8
+ TimeoutError = Class.new(Exception)
8
9
 
9
10
  class << self
10
11
  def new
@@ -49,6 +50,8 @@ module Sandbox
49
50
  ref FakeFS::FileTest
50
51
  import FakeFS::FileUtils #import FileUtils because it is a module
51
52
 
53
+ # this is basically what FakeFS.activate! does, but we want to do it in the sandbox
54
+ # so we have to live with this:
52
55
  eval <<-RUBY
53
56
  Object.class_eval do
54
57
  remove_const(:Dir)
@@ -66,16 +69,49 @@ module Sandbox
66
69
  FakeFS::FileSystem.clear
67
70
  end
68
71
 
69
- def eval_with_timeout(code, timeout=10)
70
- require 'timeout'
72
+ def eval(code, options={})
71
73
 
72
- timeout_code = <<-RUBY
73
- Timeout.timeout(#{timeout}) do
74
- #{code}
74
+ if seconds = options[:timeout]
75
+ sandbox_timeout(code, seconds) do
76
+ super code
75
77
  end
76
- RUBY
78
+ else
79
+ super code
80
+ end
81
+
82
+ end
83
+
84
+ private
85
+
86
+ def sandbox_timeout(name, seconds)
87
+ val, exc = nil
77
88
 
78
- eval timeout_code
89
+ thread = Thread.start(name) do
90
+ begin
91
+ val = yield
92
+ rescue Exception => exc
93
+ end
94
+ end
95
+
96
+ thread.join(seconds)
97
+
98
+ if thread.alive?
99
+ if thread.respond_to? :kill!
100
+ thread.kill!
101
+ else
102
+ thread.kill
103
+ end
104
+
105
+ timed_out = true
106
+ end
107
+
108
+ if timed_out
109
+ raise TimeoutError, "#{self.class} timed out"
110
+ elsif exc
111
+ raise exc
112
+ else
113
+ val
114
+ end
79
115
  end
80
116
 
81
117
  IO_S_METHODS = %w[
data/spec/sandbox_spec.rb CHANGED
@@ -73,7 +73,7 @@ describe Sandbox do
73
73
  end
74
74
  end
75
75
 
76
- describe "#eval_with_timeout" do
76
+ describe "#eval with timeout" do
77
77
  subject { Sandbox.safe }
78
78
 
79
79
  context "before it's been activated" do
@@ -83,8 +83,18 @@ describe Sandbox do
83
83
  RUBY
84
84
 
85
85
  expect {
86
- subject.eval_with_timeout(long_code, 1)
87
- }.to raise_error(Sandbox::SandboxException, /Timeout/)
86
+ subject.eval(long_code, timeout: 1)
87
+ }.to raise_error(Sandbox::TimeoutError)
88
+ end
89
+
90
+ it "should not raise a timeout error if the code runs in under the passed in time" do
91
+ short_code = <<-RUBY
92
+ 1+1
93
+ RUBY
94
+
95
+ expect {
96
+ subject.eval(short_code, timeout: 1)
97
+ }.to_not raise_error(Sandbox::TimeoutError)
88
98
  end
89
99
  end
90
100
 
@@ -97,10 +107,16 @@ describe Sandbox do
97
107
  RUBY
98
108
 
99
109
  expect {
100
- Timeout.timeout(3) do
101
- subject.eval_with_timeout(long_code, 1)
102
- end
103
- }.to raise_error(Sandbox::SandboxException, /Timeout/)
110
+ subject.eval(long_code, timeout: 1)
111
+ }.to raise_error(Sandbox::TimeoutError)
112
+ end
113
+
114
+ it "should persist state between evaluations" do
115
+ subject.eval('o = Object.new', timeout: 1)
116
+
117
+ expect {
118
+ subject.eval('o', timeout: 1)
119
+ }.to_not raise_error(Sandbox::SandboxException)
104
120
  end
105
121
  end
106
122
  end
@@ -116,6 +132,12 @@ describe Sandbox do
116
132
  OPS
117
133
  subject.eval(operations).should == 'foo'
118
134
  end
135
+
136
+ it "should have an empty ENV" do
137
+ pending do
138
+ subject.eval(%{ENV.to_a}).should be_empty
139
+ end
140
+ end
119
141
 
120
142
  it "should persist state between evaluations" do
121
143
  subject.eval('o = Object.new')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jruby_sandbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: java
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-09-22 00:00:00.000000000Z
13
+ date: 2011-09-29 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: fakefs
17
- requirement: &70213141993840 !ruby/object:Gem::Requirement
17
+ requirement: &70149996586680 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70213141993840
25
+ version_requirements: *70149996586680
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rake
28
- requirement: &70213141992860 !ruby/object:Gem::Requirement
28
+ requirement: &70149996586260 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70213141992860
36
+ version_requirements: *70149996586260
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rake-compiler
39
- requirement: &70213141991920 !ruby/object:Gem::Requirement
39
+ requirement: &70149996585840 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70213141991920
47
+ version_requirements: *70149996585840
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec
50
- requirement: &70213141991120 !ruby/object:Gem::Requirement
50
+ requirement: &70149996585420 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *70213141991120
58
+ version_requirements: *70149996585420
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: yard
61
- requirement: &70213141989820 !ruby/object:Gem::Requirement
61
+ requirement: &70149996585000 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *70213141989820
69
+ version_requirements: *70149996585000
70
70
  description: A version of _why's Freaky Freaky Sandbox for JRuby.
71
71
  email:
72
72
  - dray@envylabs.com