bullring 0.7.3 → 0.7.4

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.
@@ -1,3 +1,3 @@
1
1
  module Bullring
2
- VERSION = "0.7.3"
2
+ VERSION = "0.7.4"
3
3
  end
@@ -0,0 +1,167 @@
1
+ require 'bullring/util/drubied_process'
2
+
3
+ module Bullring
4
+
5
+ class RacerDevWorker < Bullring::Worker
6
+
7
+ attr_reader :libraries
8
+
9
+ def discard
10
+ end
11
+
12
+ def initialize
13
+ @libraries = {}
14
+ end
15
+
16
+ def add_library(name, script)
17
+ rescue_me do
18
+ Bullring.logger.debug { "Bullring: Adding library named '#{name}'" }
19
+ @libraries[name] = script
20
+ end
21
+ end
22
+
23
+ def add_library_file(name, filename)
24
+ raise NotYetImplemented
25
+ end
26
+
27
+ def check(script, options)
28
+ Bullring.logger.debug { "Bullring: Checking script with hash '#{script.hash}'" }
29
+ rescue_me do
30
+ V8::Context.open do |context|
31
+ context_wrapper {context.load(File.expand_path("../../js/jslint.min.js", __FILE__))}
32
+
33
+ jslintCall = <<-RACER_CALL
34
+ JSLINT("#{prepare_source(script)}", {devel: false,
35
+ bitwise: true,
36
+ undef: true,
37
+ continue: true,
38
+ unparam: true,
39
+ debug: true,
40
+ sloppy: true,
41
+ eqeq: true,
42
+ sub: true,
43
+ es5: true,
44
+ vars: true,
45
+ evil: true,
46
+ white: true,
47
+ forin: true,
48
+ passfail: false,
49
+ newcap: true,
50
+ nomen: true,
51
+ plusplus: true,
52
+ regexp: true,
53
+ maxerr: 50,
54
+ indent: 4});
55
+ RACER_CALL
56
+
57
+ duration, result = context_wrapper {context.eval(jslintCall + "JSLINT.errors")}
58
+
59
+ result = result.collect{|obj| obj.respond_to?(:to_h) ? obj.to_h : obj}
60
+ end
61
+ end
62
+ end
63
+
64
+ def run(script, options)
65
+ Bullring.logger.debug { "Bullring: Running script with hash '#{script.hash}'" }
66
+
67
+ V8::Context.open(:sealed => @options[:run_is_sealed], :restrictable => @options[:run_is_restrictable]) do |context|
68
+
69
+ (options['library_names'] || []).each do |library_name|
70
+ library = @libraries[library_name] || fetch_library_script!(library_name)
71
+ context_wrapper {context.eval(library)}
72
+ end
73
+
74
+ duration, result = context_wrapper {context.eval(script)}
75
+ result.respond_to?(:to_h) ? result.to_h : result
76
+ end
77
+ end
78
+
79
+ def alive?
80
+ true
81
+ end
82
+
83
+ protected
84
+
85
+ def context_wrapper
86
+ begin
87
+ start_time = Time.now
88
+ result = yield
89
+ duration = Time.now - start_time
90
+
91
+ logger.debug {"#{logname}: Ran script (#{duration} secs); result: " + result.inspect}
92
+
93
+ return duration, result
94
+ rescue Rhino::JSError => e
95
+ logger.debug {"#{logname}: JSError! Cause: " + e.cause + "; Message: " + e.message}
96
+ raise Bullring::JSError, e.message.to_s, caller
97
+ rescue Rhino::RunawayScriptError, Rhino::ScriptTimeoutError => e
98
+ logger.debug {"#{logname}: Runaway Script: " + e.inspect}
99
+ raise Bullring::JSError, "Script took too long to run", caller
100
+ rescue NameError => e
101
+ logger.debug {"#{logname}: Name error: " + e.inspect}
102
+ rescue StandardError => e
103
+ logger.debug {"#{logname}: StandardError: " + e.inspect}
104
+ raise
105
+ end
106
+ end
107
+
108
+ ESCAPE_MAP = {
109
+ '\\' => '\\\\',
110
+ "\r\n" => '\n',
111
+ "\n" => '\n',
112
+ "\r" => '\n',
113
+ '"' => '\"',
114
+ "'" => '\''
115
+ }
116
+
117
+ def prepare_source(source)
118
+ # escape javascript characters (similar to Rails escape_javascript)
119
+ source.gsub!(/(\\|\r\n|[\n\r"'])/u) {|match| ESCAPE_MAP[match] }
120
+ source
121
+ end
122
+
123
+ # Goes back to the setup provider to the get the named script or throws an
124
+ # exception if there is no such script to retrieve.
125
+ def fetch_library_script!(name)
126
+ logger.debug {"#{logname}: The script named #{name} was not available so trying to fetch from clients"}
127
+
128
+ while (provider = @setup_providers.last)
129
+ begin
130
+ library_script = provider.libraries[name]
131
+ break if !library_script.nil?
132
+ rescue DRb::DRbConnError => e
133
+ logger.debug {"#{logname}: Could not connect to setup provider (its process probably died): " + e.inspect}
134
+ rescue StandardError => e
135
+ logger.error {"#{logname}: Encountered an unknown error searching setup providers for a script named #{name}: " + e.inspect}
136
+ ensure
137
+ # Toss the last element so we can continue searching prior elements
138
+ setup_providers.pop
139
+ end
140
+ end
141
+
142
+ # If after looking through the providers we are still empty handed, raise an error
143
+ raise NameError, "Client doesn't have script named #{name}", caller if library_script.nil?
144
+
145
+ add_library(name, library_script)
146
+ end
147
+
148
+ def logname; "Bullring Server"; end
149
+
150
+ end
151
+
152
+ class JSError < StandardError; end
153
+
154
+ def rescue_me
155
+ @times_rescued = 0
156
+ begin
157
+ yield
158
+ rescue Bullring::JSError => e
159
+ Bullring.logger.debug {"Bullring: Encountered a JSError: " + e.inspect}
160
+ raise e
161
+ end
162
+ end
163
+
164
+ end
165
+
166
+ end
167
+
@@ -1,4 +1,4 @@
1
- #!/bin/sh
1
+ #!/bin/bash
2
2
 
3
3
  # Usage: bullring_server.sh GEM_ROOT_DIR ARGS_FOR_RUBY_CALL
4
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-01 00:00:00.000000000Z
12
+ date: 2012-05-04 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: uglifier
16
- requirement: &2164859160 !ruby/object:Gem::Requirement
16
+ requirement: &2153389400 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2164859160
24
+ version_requirements: *2153389400
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: execjs
27
- requirement: &2164858440 !ruby/object:Gem::Requirement
27
+ requirement: &2153388520 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2164858440
35
+ version_requirements: *2153388520
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: therubyracer
38
- requirement: &2164857620 !ruby/object:Gem::Requirement
38
+ requirement: &2153387820 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2164857620
46
+ version_requirements: *2153387820
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: therubyrhino
49
- requirement: &2164856500 !ruby/object:Gem::Requirement
49
+ requirement: &2153387180 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2164856500
57
+ version_requirements: *2153387180
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: sqlite3
60
- requirement: &2164855740 !ruby/object:Gem::Requirement
60
+ requirement: &2153386180 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2164855740
68
+ version_requirements: *2153386180
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rails
71
- requirement: &2164854700 !ruby/object:Gem::Requirement
71
+ requirement: &2153385360 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 3.2.2
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2164854700
79
+ version_requirements: *2153385360
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: test-unit
82
- requirement: &2164853780 !ruby/object:Gem::Requirement
82
+ requirement: &2153384700 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2164853780
90
+ version_requirements: *2153384700
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: ruby-debug19
93
- requirement: &2164853000 !ruby/object:Gem::Requirement
93
+ requirement: &2153383880 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2164853000
101
+ version_requirements: *2153383880
102
102
  description: Safely run untrusted Javascript from Ruby
103
103
  email:
104
104
  - jps@kindlinglabs.com
@@ -114,6 +114,7 @@ files:
114
114
  - lib/bullring/util/network.rb
115
115
  - lib/bullring/version.rb
116
116
  - lib/bullring/worker.rb
117
+ - lib/bullring/workers/racer_dev_worker.rb
117
118
  - lib/bullring/workers/rhino_server.rb
118
119
  - lib/bullring/workers/rhino_server.sh
119
120
  - lib/bullring/workers/rhino_server_worker.rb
@@ -177,7 +178,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
178
  version: '0'
178
179
  segments:
179
180
  - 0
180
- hash: -1628339676195446552
181
+ hash: -2698416548869913159
181
182
  required_rubygems_version: !ruby/object:Gem::Requirement
182
183
  none: false
183
184
  requirements:
@@ -186,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
187
  version: '0'
187
188
  segments:
188
189
  - 0
189
- hash: -1628339676195446552
190
+ hash: -2698416548869913159
190
191
  requirements: []
191
192
  rubyforge_project:
192
193
  rubygems_version: 1.8.6