rufus-treechecker 1.0.3 → 1.0.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.
- data/CHANGELOG.txt +29 -0
- data/CREDITS.txt +6 -0
- data/LICENSE.txt +21 -0
- data/README.txt +25 -25
- data/Rakefile +83 -0
- data/lib/rufus/tree_checker.rb +3 -0
- data/lib/rufus/treechecker.rb +52 -72
- data/lib/rufus-tree_checker.rb +3 -0
- data/rufus-treechecker.gemspec +31 -0
- data/spec/high_spec.rb +303 -0
- data/spec/low_spec.rb +199 -0
- data/spec/misc_spec.rb +44 -0
- data/spec/ruleset_spec.rb +94 -0
- data/spec/spec_base.rb +17 -0
- metadata +70 -25
- data/test/ft_0_basic.rb +0 -253
- data/test/ft_1_old_treechecker.rb +0 -72
- data/test/ft_2_clone.rb +0 -32
- data/test/test.rb +0 -5
- data/test/testmixin.rb +0 -31
data/CHANGELOG.txt
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
= rufus-treechecker CHANGELOG.txt
|
3
|
+
|
4
|
+
|
5
|
+
== rufus-treechecker - 1.0.4 released 2010/12/22
|
6
|
+
|
7
|
+
- require rufus/tree_checker and rufus-tree_checker
|
8
|
+
- Rufus::Treechecker.parse(code) => tree
|
9
|
+
|
10
|
+
|
11
|
+
== rufus-treechecker - 1.0.3 released 2008/10/29
|
12
|
+
|
13
|
+
- todo #22570 : moved to ruby_parser 2.0
|
14
|
+
|
15
|
+
|
16
|
+
== rufus-treechecker - 1.0.2 released 2008/09/02
|
17
|
+
|
18
|
+
- complete refactoring, huge perf gain
|
19
|
+
|
20
|
+
|
21
|
+
== rufus-treechecker - 1.0.1 released 2008/09/01
|
22
|
+
|
23
|
+
- more rules, slightly less code
|
24
|
+
|
25
|
+
|
26
|
+
== rufus-treechecker - 1.0 released 2008/09/01
|
27
|
+
|
28
|
+
- initial release
|
29
|
+
|
data/CREDITS.txt
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
Copyright (c) 2008-2011, John Mettraux, jmettraux@gmail.com
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
6
|
+
in the Software without restriction, including without limitation the rights
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
9
|
+
furnished to do so, subject to the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be included in
|
12
|
+
all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
THE SOFTWARE.
|
21
|
+
|
data/README.txt
CHANGED
@@ -8,7 +8,7 @@ Initialize a Rufus::TreeChecker and pass some ruby code to make sure it's safe b
|
|
8
8
|
|
9
9
|
== getting it
|
10
10
|
|
11
|
-
|
11
|
+
gem install -y rufus-treechecker
|
12
12
|
|
13
13
|
or download[http://rubyforge.org/frs/?group_id=4812] it from RubyForge.
|
14
14
|
|
@@ -16,40 +16,40 @@ or download[http://rubyforge.org/frs/?group_id=4812] it from RubyForge.
|
|
16
16
|
== usage
|
17
17
|
|
18
18
|
The treechecker uses ruby_parser (http://rubyforge.org/projects/parsetree)
|
19
|
-
to turn Ruby code into s-expressions, the treechecker then
|
20
|
-
checks this sexp tree and raises a Rufus::SecurityError if an excluded pattern
|
19
|
+
to turn Ruby code into s-expressions, the treechecker then
|
20
|
+
checks this sexp tree and raises a Rufus::SecurityError if an excluded pattern
|
21
21
|
is spotted.
|
22
22
|
|
23
23
|
The excluded patterns are defined at the initialization of the TreeChecker
|
24
24
|
instance by listing rules.
|
25
25
|
|
26
|
-
|
27
|
-
|
26
|
+
require 'rubygems'
|
27
|
+
require 'rufus-treechecker'
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
tc = Rufus::TreeChecker.new do
|
30
|
+
exclude_fvcall :abort
|
31
|
+
exclude_fvcall :exit, :exit!
|
32
|
+
end
|
33
|
+
|
34
|
+
tc.check("1 + 1; abort") # will raise a SecurityError
|
35
|
+
tc.check("puts (1..10).to_a.inspect") # OK
|
36
36
|
|
37
37
|
|
38
38
|
Nice, but how do I know what to exclude ?
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
require 'rubygems'
|
41
|
+
require 'rufus-treechecker'
|
42
42
|
|
43
|
-
|
43
|
+
Rufus::TreeChecker.new.ptree('a = 5 + 6; puts a')
|
44
44
|
|
45
45
|
will yield
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
"a = 5 + 6; puts a"
|
48
|
+
=>
|
49
|
+
[:block,
|
50
|
+
[:lasgn, :a, [:call, [:lit, 5], :+, [:array, [:lit, 6]]]],
|
51
|
+
[:fcall, :puts, [:array, [:lvar, :a]]]
|
52
|
+
]
|
53
53
|
|
54
54
|
|
55
55
|
For more documentation, see http://github.com/jmettraux/rufus-treechecker/tree/master/lib/rufus/treechecker.rb
|
@@ -57,26 +57,26 @@ For more documentation, see http://github.com/jmettraux/rufus-treechecker/tree/m
|
|
57
57
|
|
58
58
|
== dependencies
|
59
59
|
|
60
|
-
the '
|
60
|
+
the 'ruby_parser' gem by Ryan Davis.
|
61
61
|
|
62
62
|
|
63
63
|
== mailing list
|
64
64
|
|
65
65
|
On the Rufus-Ruby list[http://groups.google.com/group/rufus-ruby] :
|
66
66
|
|
67
|
-
|
67
|
+
http://groups.google.com/group/rufus-ruby
|
68
68
|
|
69
69
|
|
70
70
|
== issue tracker
|
71
71
|
|
72
|
-
|
72
|
+
http://rubyforge.org/tracker/?atid=18584&group_id=4812&func=browse
|
73
73
|
|
74
74
|
|
75
75
|
== source
|
76
76
|
|
77
77
|
http://github.com/jmettraux/rufus-treechecker
|
78
78
|
|
79
|
-
|
79
|
+
git clone git://github.com/jmettraux/rufus-treechecker.git
|
80
80
|
|
81
81
|
|
82
82
|
== author
|
data/Rakefile
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
|
2
|
+
$:.unshift('.') # 1.9.2
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
|
6
|
+
require 'rake'
|
7
|
+
require 'rake/clean'
|
8
|
+
require 'rake/rdoctask'
|
9
|
+
|
10
|
+
|
11
|
+
#
|
12
|
+
# clean
|
13
|
+
|
14
|
+
CLEAN.include('pkg', 'rdoc')
|
15
|
+
|
16
|
+
|
17
|
+
#
|
18
|
+
# test / spec
|
19
|
+
|
20
|
+
task :spec do
|
21
|
+
sh 'rspec spec/'
|
22
|
+
end
|
23
|
+
task :test => :spec
|
24
|
+
task :default => :spec
|
25
|
+
|
26
|
+
|
27
|
+
#
|
28
|
+
# gem
|
29
|
+
|
30
|
+
GEMSPEC_FILE = Dir['*.gemspec'].first
|
31
|
+
GEMSPEC = eval(File.read(GEMSPEC_FILE))
|
32
|
+
GEMSPEC.validate
|
33
|
+
|
34
|
+
|
35
|
+
desc %{
|
36
|
+
builds the gem and places it in pkg/
|
37
|
+
}
|
38
|
+
task :build do
|
39
|
+
|
40
|
+
sh "gem build #{GEMSPEC_FILE}"
|
41
|
+
sh "mkdir pkg" rescue nil
|
42
|
+
sh "mv #{GEMSPEC.name}-#{GEMSPEC.version}.gem pkg/"
|
43
|
+
end
|
44
|
+
|
45
|
+
desc %{
|
46
|
+
builds the gem and pushes it to rubygems.org
|
47
|
+
}
|
48
|
+
task :push => :build do
|
49
|
+
|
50
|
+
sh "gem push pkg/#{GEMSPEC.name}-#{GEMSPEC.version}.gem"
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
#
|
55
|
+
# rdoc
|
56
|
+
#
|
57
|
+
# make sure to have rdoc 2.5.x to run that
|
58
|
+
|
59
|
+
Rake::RDocTask.new do |rd|
|
60
|
+
|
61
|
+
rd.main = 'README.txt'
|
62
|
+
rd.rdoc_dir = "rdoc/#{GEMSPEC.name}"
|
63
|
+
|
64
|
+
rd.rdoc_files.include('README.txt', 'CHANGELOG.txt', 'CREDITS.txt', 'lib/**/*.rb')
|
65
|
+
|
66
|
+
rd.title = "#{GEMSPEC.name} #{GEMSPEC.version}"
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
#
|
71
|
+
# upload_rdoc
|
72
|
+
|
73
|
+
desc %{
|
74
|
+
upload the rdoc to rubyforge
|
75
|
+
}
|
76
|
+
task :upload_rdoc => [ :clean, :rdoc ] do
|
77
|
+
|
78
|
+
account = 'jmettraux@rubyforge.org'
|
79
|
+
webdir = "/var/www/gforge-projects/rufus"
|
80
|
+
|
81
|
+
sh "rsync -azv -e ssh rdoc/#{GEMSPEC.name} #{account}:#{webdir}/"
|
82
|
+
end
|
83
|
+
|
data/lib/rufus/treechecker.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
#
|
2
1
|
#--
|
3
|
-
# Copyright (c) 2008, John Mettraux, jmettraux@gmail.com
|
2
|
+
# Copyright (c) 2008-2011, John Mettraux, jmettraux@gmail.com
|
4
3
|
#
|
5
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
5
|
# of this software and associated documentation files (the "Software"), to deal
|
@@ -19,14 +18,12 @@
|
|
19
18
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
19
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
20
|
# THE SOFTWARE.
|
22
|
-
#++
|
23
|
-
#
|
24
|
-
|
25
21
|
#
|
26
22
|
# "made in Japan" (as opposed to "swiss made")
|
27
|
-
|
23
|
+
#++
|
28
24
|
|
29
|
-
|
25
|
+
|
26
|
+
require 'ruby_parser'
|
30
27
|
|
31
28
|
|
32
29
|
module Rufus
|
@@ -125,27 +122,24 @@ module Rufus
|
|
125
122
|
#
|
126
123
|
class TreeChecker
|
127
124
|
|
128
|
-
VERSION = '1.0.
|
125
|
+
VERSION = '1.0.4'
|
129
126
|
|
130
|
-
#
|
131
127
|
# pretty-prints the sexp tree of the given rubycode
|
132
128
|
#
|
133
|
-
def ptree
|
129
|
+
def ptree(rubycode)
|
134
130
|
puts stree(rubycode)
|
135
131
|
end
|
136
132
|
|
137
|
-
#
|
138
133
|
# returns the pretty-printed string of the given rubycode
|
139
134
|
# (thanks ruby_parser).
|
140
135
|
#
|
141
|
-
def stree
|
136
|
+
def stree(rubycode)
|
142
137
|
"#{rubycode.inspect}\n =>\n#{parse(rubycode).inspect}"
|
143
138
|
end
|
144
139
|
|
145
|
-
#
|
146
140
|
# initializes the TreeChecker, expects a block
|
147
141
|
#
|
148
|
-
def initialize
|
142
|
+
def initialize(&block)
|
149
143
|
|
150
144
|
@root_set = RuleSet.new
|
151
145
|
@set = RuleSet.new
|
@@ -162,12 +156,11 @@ module Rufus
|
|
162
156
|
s << @set.to_s
|
163
157
|
end
|
164
158
|
|
165
|
-
#
|
166
159
|
# Performs the check on the given String of ruby code. Will raise a
|
167
160
|
# Rufus::SecurityError if there is something excluded by the rules
|
168
161
|
# specified at the initialization of the TreeChecker instance.
|
169
162
|
#
|
170
|
-
def check
|
163
|
+
def check(rubycode)
|
171
164
|
|
172
165
|
sexp = parse(rubycode)
|
173
166
|
|
@@ -179,8 +172,7 @@ module Rufus
|
|
179
172
|
do_check(sexp)
|
180
173
|
end
|
181
174
|
|
182
|
-
#
|
183
|
-
# return a copy of this TreeChecker instance
|
175
|
+
# Return a copy of this TreeChecker instance
|
184
176
|
#
|
185
177
|
def clone
|
186
178
|
|
@@ -190,18 +182,16 @@ module Rufus
|
|
190
182
|
tc
|
191
183
|
end
|
192
184
|
|
185
|
+
# Adds a set of checks (rules) to this treechecker. Returns self.
|
193
186
|
#
|
194
|
-
|
195
|
-
#
|
196
|
-
def add_rules (&block)
|
187
|
+
def add_rules(&block)
|
197
188
|
|
198
189
|
instance_eval(&block) if block
|
199
190
|
|
200
191
|
self
|
201
192
|
end
|
202
193
|
|
203
|
-
#
|
204
|
-
# freezes the treechecker instance "in depth"
|
194
|
+
# Freezes the treechecker instance "in depth"
|
205
195
|
#
|
206
196
|
def freeze
|
207
197
|
super
|
@@ -228,23 +218,23 @@ module Rufus
|
|
228
218
|
rs
|
229
219
|
end
|
230
220
|
|
231
|
-
def exclude_symbol
|
221
|
+
def exclude_symbol(s, message)
|
232
222
|
|
233
223
|
@excluded_symbols[s] = (message || ":#{s} is excluded")
|
234
224
|
end
|
235
225
|
|
236
|
-
def accept_pattern
|
226
|
+
def accept_pattern(pat)
|
237
227
|
|
238
228
|
(@accepted_patterns[pat.first] ||= []) << pat
|
239
229
|
end
|
240
230
|
|
241
|
-
def exclude_pattern
|
231
|
+
def exclude_pattern(pat, message)
|
242
232
|
|
243
233
|
(@excluded_patterns[pat.first] ||= []) << [
|
244
234
|
pat, message || "#{pat.inspect} is excluded" ]
|
245
235
|
end
|
246
236
|
|
247
|
-
def check
|
237
|
+
def check(sexp)
|
248
238
|
|
249
239
|
if sexp.is_a?(Symbol)
|
250
240
|
|
@@ -304,7 +294,7 @@ module Rufus
|
|
304
294
|
|
305
295
|
protected
|
306
296
|
|
307
|
-
def check_pattern
|
297
|
+
def check_pattern(sexp, pat)
|
308
298
|
|
309
299
|
return false if sexp.length < pat.length
|
310
300
|
|
@@ -320,18 +310,17 @@ module Rufus
|
|
320
310
|
# the methods used to define the checks
|
321
311
|
#++
|
322
312
|
|
323
|
-
#
|
324
|
-
# within the 'at_root' block, rules are added to the @root_checks, ie
|
313
|
+
# Within the 'at_root' block, rules are added to the @root_checks, ie
|
325
314
|
# they are evaluated only for the toplevel (root) sexp.
|
326
315
|
#
|
327
|
-
def at_root
|
316
|
+
def at_root(&block)
|
328
317
|
|
329
318
|
@current_set = @root_set
|
330
319
|
add_rules(&block)
|
331
320
|
@current_set = @set
|
332
321
|
end
|
333
322
|
|
334
|
-
def extract_message
|
323
|
+
def extract_message(args)
|
335
324
|
|
336
325
|
message = nil
|
337
326
|
args = args.dup
|
@@ -339,7 +328,7 @@ module Rufus
|
|
339
328
|
[ args, message ]
|
340
329
|
end
|
341
330
|
|
342
|
-
def expand_class
|
331
|
+
def expand_class(arg)
|
343
332
|
|
344
333
|
if arg.is_a?(Class) or arg.is_a?(Module)
|
345
334
|
[ parse(arg.to_s), parse("::#{arg.to_s}") ]
|
@@ -348,8 +337,7 @@ module Rufus
|
|
348
337
|
end
|
349
338
|
end
|
350
339
|
|
351
|
-
#
|
352
|
-
# adds a rule that will forbid sexps that begin with the given head
|
340
|
+
# Adds a rule that will forbid sexps that begin with the given head
|
353
341
|
#
|
354
342
|
# tc = TreeChecker.new do
|
355
343
|
# exclude_head [ :block ]
|
@@ -358,44 +346,43 @@ module Rufus
|
|
358
346
|
# tc.check('a = 2') # ok
|
359
347
|
# tc.check('a = 2; b = 5') # will raise an error as it's a block
|
360
348
|
#
|
361
|
-
def exclude_head
|
349
|
+
def exclude_head(head, message=nil)
|
362
350
|
|
363
351
|
@current_set.exclude_pattern(head, message)
|
364
352
|
end
|
365
353
|
|
366
|
-
def exclude_symbol
|
354
|
+
def exclude_symbol(*args)
|
367
355
|
args, message = extract_message(args)
|
368
356
|
args.each { |a| @current_set.exclude_symbol(a, message) }
|
369
357
|
end
|
370
358
|
|
371
|
-
def exclude_fcall
|
359
|
+
def exclude_fcall(*args)
|
372
360
|
do_exclude_pair(:fcall, args)
|
373
361
|
end
|
374
362
|
|
375
|
-
def exclude_vcall
|
363
|
+
def exclude_vcall(*args)
|
376
364
|
do_exclude_pair(:vcall, args)
|
377
365
|
end
|
378
366
|
|
379
|
-
def exclude_fvcall
|
367
|
+
def exclude_fvcall(*args)
|
380
368
|
do_exclude_pair(:fcall, args)
|
381
369
|
do_exclude_pair(:vcall, args)
|
382
370
|
end
|
383
371
|
|
384
|
-
def exclude_call_on
|
372
|
+
def exclude_call_on(*args)
|
385
373
|
do_exclude_pair(:call, args)
|
386
374
|
end
|
387
375
|
|
388
|
-
def exclude_call_to
|
376
|
+
def exclude_call_to(*args)
|
389
377
|
args, message = extract_message(args)
|
390
378
|
args.each { |a| @current_set.exclude_pattern([ :call, :any, a], message) }
|
391
379
|
end
|
392
380
|
|
393
|
-
def exclude_fvccall
|
381
|
+
def exclude_fvccall(*args)
|
394
382
|
exclude_fvcall(*args)
|
395
383
|
exclude_call_to(*args)
|
396
384
|
end
|
397
385
|
|
398
|
-
#
|
399
386
|
# This rule :
|
400
387
|
#
|
401
388
|
# exclude_rebinding Kernel
|
@@ -405,7 +392,7 @@ module Rufus
|
|
405
392
|
# k = Kernel
|
406
393
|
# k = ::Kernel
|
407
394
|
#
|
408
|
-
def exclude_rebinding
|
395
|
+
def exclude_rebinding(*args)
|
409
396
|
args, message = extract_message(args)
|
410
397
|
args.each do |a|
|
411
398
|
expand_class(a).each do |c|
|
@@ -418,21 +405,19 @@ module Rufus
|
|
418
405
|
# prevents access (calling methods and rebinding) to a class (or a list
|
419
406
|
# of classes
|
420
407
|
#
|
421
|
-
def exclude_access_to
|
408
|
+
def exclude_access_to(*args)
|
422
409
|
exclude_call_on *args
|
423
410
|
exclude_rebinding *args
|
424
411
|
end
|
425
412
|
|
426
|
-
#
|
427
|
-
# bans method definitions
|
413
|
+
# Bans method definitions
|
428
414
|
#
|
429
415
|
def exclude_def
|
430
416
|
|
431
417
|
@current_set.exclude_symbol(:defn, 'method definitions are forbidden')
|
432
418
|
end
|
433
419
|
|
434
|
-
#
|
435
|
-
# bans the defintion and the [re]openening of classes
|
420
|
+
# Bans the defintion and the [re]openening of classes
|
436
421
|
#
|
437
422
|
# a list of exceptions (classes) can be passed. Subclassing those
|
438
423
|
# exceptions is permitted.
|
@@ -454,8 +439,7 @@ module Rufus
|
|
454
439
|
[ :class ], 'defining a class is forbidden')
|
455
440
|
end
|
456
441
|
|
457
|
-
#
|
458
|
-
# bans the definition or the opening of modules
|
442
|
+
# Bans the definition or the opening of modules
|
459
443
|
#
|
460
444
|
def exclude_module_tinkering
|
461
445
|
|
@@ -463,8 +447,7 @@ module Rufus
|
|
463
447
|
:module, 'defining or opening a module is forbidden')
|
464
448
|
end
|
465
449
|
|
466
|
-
#
|
467
|
-
# bans referencing or setting the value of global variables
|
450
|
+
# Bans referencing or setting the value of global variables
|
468
451
|
#
|
469
452
|
def exclude_global_vars
|
470
453
|
|
@@ -472,8 +455,7 @@ module Rufus
|
|
472
455
|
@current_set.exclude_symbol(:gasgn, 'global vars are forbidden')
|
473
456
|
end
|
474
457
|
|
475
|
-
#
|
476
|
-
# bans the usage of 'alias'
|
458
|
+
# Bans the usage of 'alias'
|
477
459
|
#
|
478
460
|
def exclude_alias
|
479
461
|
|
@@ -481,8 +463,7 @@ module Rufus
|
|
481
463
|
@current_set.exclude_symbol(:alias_method, "'alias_method' is forbidden")
|
482
464
|
end
|
483
465
|
|
484
|
-
#
|
485
|
-
# bans the use of 'eval', 'module_eval' and 'instance_eval'
|
466
|
+
# Bans the use of 'eval', 'module_eval' and 'instance_eval'
|
486
467
|
#
|
487
468
|
def exclude_eval
|
488
469
|
|
@@ -491,16 +472,14 @@ module Rufus
|
|
491
472
|
exclude_call_to(:instance_eval, 'instance_eval() is forbidden')
|
492
473
|
end
|
493
474
|
|
494
|
-
#
|
495
|
-
# bans the use of backquotes
|
475
|
+
# Bans the use of backquotes
|
496
476
|
#
|
497
477
|
def exclude_backquotes
|
498
478
|
|
499
479
|
@current_set.exclude_symbol(:xstr, 'backquotes are forbidden')
|
500
480
|
end
|
501
481
|
|
502
|
-
#
|
503
|
-
# bans raise and throw
|
482
|
+
# Bans raise and throw
|
504
483
|
#
|
505
484
|
def exclude_raise
|
506
485
|
|
@@ -518,10 +497,9 @@ module Rufus
|
|
518
497
|
end
|
519
498
|
end
|
520
499
|
|
500
|
+
# The actual check method, check() is rather a bootstrap one...
|
521
501
|
#
|
522
|
-
|
523
|
-
#
|
524
|
-
def do_check (sexp)
|
502
|
+
def do_check(sexp)
|
525
503
|
|
526
504
|
@set.check(sexp)
|
527
505
|
|
@@ -532,17 +510,19 @@ module Rufus
|
|
532
510
|
sexp.each { |c| do_check c }
|
533
511
|
end
|
534
512
|
|
513
|
+
# A simple parse (relies on ruby_parser currently)
|
535
514
|
#
|
536
|
-
|
537
|
-
#
|
538
|
-
def parse (rubycode)
|
515
|
+
def parse(rubycode)
|
539
516
|
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
517
|
+
self.class.parse(rubycode)
|
518
|
+
end
|
519
|
+
|
520
|
+
# A simple parse (relies on ruby_parser currently)
|
521
|
+
#
|
522
|
+
def self.parse(rubycode)
|
544
523
|
|
545
524
|
RubyParser.new.parse(rubycode).to_a
|
546
525
|
end
|
547
526
|
end
|
548
527
|
end
|
528
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
|
5
|
+
s.name = 'rufus-treechecker'
|
6
|
+
s.version = File.read('lib/rufus/treechecker.rb').match(/VERSION = '([^']+)'/)[1]
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = [ 'John Mettraux' ]
|
9
|
+
s.email = [ 'jmettraux@gmail.com' ]
|
10
|
+
s.homepage = 'http://rufus.rubyforge.org'
|
11
|
+
s.rubyforge_project = 'rufus'
|
12
|
+
s.summary = "tests strings of Ruby code for unauthorized patterns (exit, eval, ...)"
|
13
|
+
s.description = %{
|
14
|
+
tests strings of Ruby code for unauthorized patterns (exit, eval, ...)
|
15
|
+
}
|
16
|
+
|
17
|
+
#s.files = `git ls-files`.split("\n")
|
18
|
+
s.files = Dir[
|
19
|
+
'Rakefile',
|
20
|
+
'lib/**/*.rb', 'spec/**/*.rb', 'test/**/*.rb',
|
21
|
+
'*.gemspec', '*.txt', '*.rdoc', '*.md'
|
22
|
+
]
|
23
|
+
|
24
|
+
s.add_runtime_dependency 'ruby_parser', '>= 2.0.5'
|
25
|
+
|
26
|
+
s.add_development_dependency 'rake'
|
27
|
+
s.add_development_dependency 'rspec', '>= 2.0'
|
28
|
+
|
29
|
+
s.require_path = 'lib'
|
30
|
+
end
|
31
|
+
|