nasl 0.3.0 → 0.4.0
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 +5 -13
- data/.travis.yml +6 -1
- data/Gemfile +1 -4
- data/README.md +26 -0
- data/lib/nasl/grammar.racc +149 -10
- data/lib/nasl/parser/block.rb +7 -1
- data/lib/nasl/parser/case.rb +55 -0
- data/lib/nasl/parser/function.rb +28 -3
- data/lib/nasl/parser/namespace.rb +50 -0
- data/lib/nasl/parser/node.rb +11 -2
- data/lib/nasl/parser/obj_var.rb +41 -0
- data/lib/nasl/parser/object.rb +50 -0
- data/lib/nasl/parser/switch.rb +51 -0
- data/lib/nasl/token.rb +1 -1
- data/lib/nasl/tokenizer.rb +51 -14
- data/lib/nasl/version.rb +1 -1
- data/nasl.gemspec +4 -3
- data/test/unit/parser/test_namespace.rb +45 -0
- data/test/unit/parser/test_object.rb +75 -0
- data/test/unit/parser/test_switch.rb +96 -0
- data/test/unit/tokenizer/test_comment.rb +76 -1
- data/test/unit/tokenizer/test_operator_lookahead.rb +75 -0
- metadata +46 -20
- data/Gemfile.ci +0 -6
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MGZmMWYyMmVkOTA3ZjhlZTUwNGY4YWI3OGJmYzA0YzlmNThlMjg0NQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 199cd9a0ada92765a2e1812786f7b41eb22c3724
|
4
|
+
data.tar.gz: 0b8ff7ebf8d1b4b166dd7ffb4f71fa52d884e1aa
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ODBhNTc1NjIxYzhkNmJjZTVmMDJkMGMzMDg5YzViYzBiMjZkZTA1ZmFjM2Q1
|
11
|
-
ZjRhMDFkZDg0ZDFkY2MwYTYwOGM3YWU3MzFiZjMxMmU1NWVhMWM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MWRhZDY3MjQ4NDg5ZjQ5ZTExOTk3MjIyODJlN2IzNGZhNTliOTAwODA1ZmM4
|
14
|
-
MWM5OWRkNzdmNzgyZDM3Y2JkOTMyNGY0ZTI1YzdlMWUxMTgzMWZmNjAxNzJj
|
15
|
-
NWE2ZDNjZDQzMTI0MWE4M2M5ODY1YzQ2MDhhOTM3M2MyYzIwZjQ=
|
6
|
+
metadata.gz: 1cd9093af658c23660d9d662e3da33ab2ecaf97aececd1402832a92a7d779e245c2a64c7cfe1be8d71793f2f08b2f51388e03de1d2a5be0da7712bc541a6a8ab
|
7
|
+
data.tar.gz: 749a6d9e4fea7edb88eb34113496988d7cba0cfe6baffb00eeabc154a4f81ffddd2d93eccbff44b142f645d2f190f7c88559bf77d892cd9bacd5f2ac42d9801e
|
data/.travis.yml
CHANGED
@@ -1,17 +1,22 @@
|
|
1
1
|
language: ruby
|
2
|
+
sudo: false
|
2
3
|
|
3
4
|
rvm:
|
4
5
|
- 1.9.3
|
5
6
|
- 2.0.0
|
6
7
|
- 2.1.0
|
8
|
+
- 2.2.0
|
9
|
+
- 2.3.0
|
7
10
|
|
8
11
|
gemfile:
|
9
|
-
- Gemfile
|
12
|
+
- Gemfile
|
10
13
|
|
11
14
|
notifications:
|
12
15
|
email:
|
13
16
|
- jhammack@tenable.com
|
14
17
|
- aweber@tenable.com
|
18
|
+
- mcoumbes@tenable.com
|
19
|
+
- aorr@tenable.com
|
15
20
|
|
16
21
|
before_install:
|
17
22
|
- gem --version
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Installation
|
2
2
|
|
3
|
+
[](https://rubygems.org/gems/nasl)
|
4
|
+
[](https://travis-ci.org/tenable/nasl)
|
5
|
+
|
3
6
|
## Git
|
4
7
|
|
5
8
|
Installing the source from Git is done as follows:
|
@@ -98,5 +101,28 @@ obviously, and can be used as follows:
|
|
98
101
|
That's all there is to it. If there are any errors, it'll throw an instance of
|
99
102
|
`ParseException` that will include as much context about the error as possible.
|
100
103
|
|
104
|
+
Development
|
105
|
+
-----------
|
106
|
+
|
107
|
+
This project uses [Bundler](http://bundler.io/).
|
108
|
+
|
109
|
+
If you have a brand-new Debian machine, do this as root:
|
110
|
+
|
111
|
+
apt-get install ruby-dev rubygems git
|
112
|
+
gem install bundler
|
113
|
+
|
114
|
+
As your regular user:
|
115
|
+
|
116
|
+
git clone https://github.com/tenable/nasl
|
117
|
+
cd nasl
|
118
|
+
bundle install --path vendor/bundle
|
119
|
+
bundle exec rake grammars
|
120
|
+
bundle exec rake test
|
121
|
+
|
122
|
+
All the tests should pass!
|
123
|
+
|
124
|
+
To run the nasl-parse command line, do `bundle exec ./bin/nasl-parse`, which should give
|
125
|
+
a help message.
|
126
|
+
|
101
127
|
[nasldoc]: https://github.com/tenable/nasldoc
|
102
128
|
[pedant]: https://github.com/tenable/pedant
|
data/lib/nasl/grammar.racc
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
################################################################################
|
2
|
-
# Copyright (c) 2011-
|
2
|
+
# Copyright (c) 2011-2018, Tenable Network Security
|
3
3
|
# All rights reserved.
|
4
4
|
#
|
5
5
|
# Redistribution and use in source and binary forms, with or without
|
@@ -74,18 +74,40 @@ rule
|
|
74
74
|
{ c(*val) }
|
75
75
|
| export
|
76
76
|
{ val[0] }
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
# | COMMENT function
|
78
|
+
# { c(*val) }
|
79
|
+
# | function
|
80
|
+
# { val[0] }
|
81
81
|
| statement
|
82
82
|
{ val[0] }
|
83
|
+
| obj_decl
|
84
|
+
{ val[0] }
|
85
|
+
| namespace
|
86
|
+
{ val[0] }
|
83
87
|
;
|
84
88
|
|
89
|
+
obj_statement : obj_var SEMICOLON
|
90
|
+
{ val[0] }
|
91
|
+
| COMMENT obj_function
|
92
|
+
{ c(*val) }
|
93
|
+
| obj_function
|
94
|
+
{ val[0] }
|
95
|
+
;
|
96
|
+
# | obj_function
|
97
|
+
# { val[0] }
|
98
|
+
|
85
99
|
statement : simple
|
86
100
|
{ val[0] }
|
87
101
|
| compound
|
88
102
|
{ val[0] }
|
103
|
+
| function
|
104
|
+
{ val[0] }
|
105
|
+
| COMMENT function
|
106
|
+
{ c(*val) }
|
107
|
+
| obj_decl
|
108
|
+
{ val[0] }
|
109
|
+
| namespace
|
110
|
+
{ val[0] }
|
89
111
|
;
|
90
112
|
|
91
113
|
##############################################################################
|
@@ -96,10 +118,16 @@ rule
|
|
96
118
|
{ n(:Export, *val) }
|
97
119
|
;
|
98
120
|
|
121
|
+
obj_function : obj_func_attr FUNCTION ident LPAREN params RPAREN block
|
122
|
+
{ n(:Function, val[0], 'obj', val[1], val[2], val[3], val[4], val[5], val[6]) }
|
123
|
+
| obj_func_attr FUNCTION ident LPAREN RPAREN block
|
124
|
+
{ n(:Function, val[0], 'obj', val[1], val[2], val[3], val[4], val[5]) }
|
125
|
+
;
|
126
|
+
|
99
127
|
function : FUNCTION ident LPAREN params RPAREN block
|
100
|
-
{ n(:Function,
|
128
|
+
{ n(:Function, val[0], 'normal', val[1], val[2], val[3], val[4], val[5]) }
|
101
129
|
| FUNCTION ident LPAREN RPAREN block
|
102
|
-
{ n(:Function,
|
130
|
+
{ n(:Function, val[0], 'normal', val[1], val[2], val[3], val[4]) }
|
103
131
|
;
|
104
132
|
|
105
133
|
simple : assign
|
@@ -118,6 +146,8 @@ rule
|
|
118
146
|
{ c(*val) }
|
119
147
|
| global
|
120
148
|
{ val[0] }
|
149
|
+
| var_def
|
150
|
+
{ val[0] }
|
121
151
|
| import
|
122
152
|
{ val[0] }
|
123
153
|
| include
|
@@ -144,8 +174,23 @@ rule
|
|
144
174
|
{ val[0] }
|
145
175
|
| while
|
146
176
|
{ val[0] }
|
177
|
+
| switch
|
178
|
+
{ val[0] }
|
179
|
+
| case
|
180
|
+
{ val[0] }
|
147
181
|
;
|
148
182
|
|
183
|
+
namespace : NAMESPACE ident LBRACE statements RBRACE
|
184
|
+
{ n(:Namespace, *val) }
|
185
|
+
| NAMESPACE ident LBRACE RBRACE
|
186
|
+
{ n(:Namespace, *val) }
|
187
|
+
;
|
188
|
+
|
189
|
+
obj_decl : OBJECT ident LBRACE obj_statements RBRACE
|
190
|
+
{ n(:Object, *val) }
|
191
|
+
| NAMESPACE ident LBRACE RBRACE
|
192
|
+
{ n(:Namespace, *val) }
|
193
|
+
;
|
149
194
|
##############################################################################
|
150
195
|
# Simple Statements
|
151
196
|
##############################################################################
|
@@ -178,6 +223,10 @@ rule
|
|
178
223
|
{ n(:Global, *val) }
|
179
224
|
;
|
180
225
|
|
226
|
+
var_def : VAR var_decls SEMICOLON
|
227
|
+
{ n(:Local, *val) }
|
228
|
+
;
|
229
|
+
|
181
230
|
incr : incr_exp SEMICOLON
|
182
231
|
{ val[0] }
|
183
232
|
;
|
@@ -194,6 +243,10 @@ rule
|
|
194
243
|
{ n(:Local, *val) }
|
195
244
|
;
|
196
245
|
|
246
|
+
local : LOCAL var_decls SEMICOLON
|
247
|
+
{ n(:Local, *val) }
|
248
|
+
;
|
249
|
+
|
197
250
|
rep : call_exp REP expr SEMICOLON
|
198
251
|
{ n(:Repetition, *val[0..-1]) }
|
199
252
|
;
|
@@ -206,16 +259,53 @@ rule
|
|
206
259
|
{ n(:Return, *val) }
|
207
260
|
;
|
208
261
|
|
262
|
+
obj_func_attr : /* Empty */
|
263
|
+
{ nil }
|
264
|
+
| PUBLIC
|
265
|
+
{ val[0] }
|
266
|
+
| PRIVATE
|
267
|
+
{ val[0] }
|
268
|
+
;
|
269
|
+
|
209
270
|
##############################################################################
|
210
271
|
# Compound Statements
|
211
272
|
##############################################################################
|
212
|
-
|
213
273
|
block : LBRACE statements RBRACE
|
214
274
|
{ n(:Block, *val) }
|
215
275
|
| LBRACE RBRACE
|
216
276
|
{ n(:Block, *val) }
|
217
277
|
;
|
218
278
|
|
279
|
+
switch : SWITCH LPAREN expr RPAREN switch_block
|
280
|
+
{ n(:Switch, *val) }
|
281
|
+
| SWITCH LBRACK switch_op RBRACK LPAREN expr RPAREN switch_block
|
282
|
+
{ n(:Switch, *val) }
|
283
|
+
;
|
284
|
+
|
285
|
+
case : CASE case_expr_list COLON
|
286
|
+
{ n(:Case, *val) }
|
287
|
+
| CASE LBRACK switch_op RBRACK case_expr_list COLON
|
288
|
+
{ n(:Case, *val) }
|
289
|
+
| DEFAULT COLON
|
290
|
+
{ n(:Case, *val) }
|
291
|
+
;
|
292
|
+
|
293
|
+
case_expr : expr
|
294
|
+
{ val[0] }
|
295
|
+
;
|
296
|
+
|
297
|
+
case_expr_list : case_expr
|
298
|
+
{ val[0] }
|
299
|
+
| case_expr COMMA case_expr_list
|
300
|
+
{ [val[0]] + val[2] }
|
301
|
+
;
|
302
|
+
|
303
|
+
switch_block : LBRACE case statements RBRACE
|
304
|
+
{ n(:Block, *val) }
|
305
|
+
| LBRACE RBRACE
|
306
|
+
{ n(:Block, *val) }
|
307
|
+
;
|
308
|
+
|
219
309
|
for : FOR LPAREN field SEMICOLON expr SEMICOLON field RPAREN statement
|
220
310
|
{ n(:For, *val) }
|
221
311
|
;
|
@@ -364,13 +454,47 @@ rule
|
|
364
454
|
{ val[0] }
|
365
455
|
;
|
366
456
|
|
457
|
+
switch_op : SUBSTR_EQ
|
458
|
+
{ val[0] }
|
459
|
+
| SUBSTR_NE
|
460
|
+
{ val[0] }
|
461
|
+
| REGEX_EQ
|
462
|
+
{ val[0] }
|
463
|
+
| REGEX_NE
|
464
|
+
{ val[0] }
|
465
|
+
| CMP_LT
|
466
|
+
{ val[0] }
|
467
|
+
| CMP_GT
|
468
|
+
{ val[0] }
|
469
|
+
| CMP_EQ
|
470
|
+
{ val[0] }
|
471
|
+
| CMP_NE
|
472
|
+
{ val[0] }
|
473
|
+
| CMP_LE
|
474
|
+
{ val[0] }
|
475
|
+
| CMP_GE
|
476
|
+
{ val[0] }
|
477
|
+
| AMPERSAND
|
478
|
+
{ val[0] }
|
479
|
+
| BIT_XOR
|
480
|
+
{ val[0] }
|
481
|
+
| BIT_OR
|
482
|
+
{ val[0] }
|
483
|
+
;
|
484
|
+
|
485
|
+
|
486
|
+
ident_ex : ident
|
487
|
+
{ val[0] }
|
488
|
+
| VAR
|
489
|
+
{ val[0] }
|
490
|
+
|
367
491
|
##############################################################################
|
368
492
|
# Named Components
|
369
493
|
##############################################################################
|
370
494
|
|
371
|
-
arg :
|
495
|
+
arg : ident_ex COLON expr
|
372
496
|
{ n(:Argument, *val) }
|
373
|
-
|
|
497
|
+
| ident_ex COLON ref
|
374
498
|
{ n(:Argument, *val) }
|
375
499
|
| expr
|
376
500
|
{ n(:Argument, *val) }
|
@@ -480,12 +604,22 @@ rule
|
|
480
604
|
{ [val[0]] }
|
481
605
|
;
|
482
606
|
|
607
|
+
obj_statements : obj_statement obj_statements
|
608
|
+
{ [val[0]] + val[1] }
|
609
|
+
| obj_statement
|
610
|
+
{ [val[0]] }
|
611
|
+
;
|
612
|
+
|
483
613
|
statements : statement statements
|
484
614
|
{ [val[0]] + val[1] }
|
485
615
|
| statement
|
486
616
|
{ [val[0]] }
|
487
617
|
;
|
488
618
|
|
619
|
+
obj_var : VAR var_decls
|
620
|
+
{ n(:ObjVar, *val) }
|
621
|
+
;
|
622
|
+
|
489
623
|
var_decl : ident ASS_EQ expr
|
490
624
|
{ n(:Assignment, *val) }
|
491
625
|
| ident ASS_EQ ref
|
@@ -546,6 +680,7 @@ require 'nasl/parser/argument'
|
|
546
680
|
require 'nasl/parser/array'
|
547
681
|
require 'nasl/parser/assigment'
|
548
682
|
require 'nasl/parser/block'
|
683
|
+
require 'nasl/parser/namespace'
|
549
684
|
require 'nasl/parser/break'
|
550
685
|
require 'nasl/parser/call'
|
551
686
|
require 'nasl/parser/comment'
|
@@ -577,6 +712,10 @@ require 'nasl/parser/return'
|
|
577
712
|
require 'nasl/parser/string'
|
578
713
|
require 'nasl/parser/undefined'
|
579
714
|
require 'nasl/parser/while'
|
715
|
+
require 'nasl/parser/object'
|
716
|
+
require 'nasl/parser/switch'
|
717
|
+
require 'nasl/parser/case'
|
718
|
+
require 'nasl/parser/obj_var'
|
580
719
|
|
581
720
|
---- inner ----
|
582
721
|
|
data/lib/nasl/parser/block.rb
CHANGED
@@ -35,7 +35,13 @@ module Nasl
|
|
35
35
|
def initialize(tree, *tokens)
|
36
36
|
super
|
37
37
|
|
38
|
-
|
38
|
+
if (@tokens.length == 4)
|
39
|
+
@body = [@tokens[1]] + @tokens[2]
|
40
|
+
elsif (@tokens.length == 3)
|
41
|
+
@body = @tokens[1]
|
42
|
+
else
|
43
|
+
@body = []
|
44
|
+
end
|
39
45
|
|
40
46
|
@children << :body
|
41
47
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
################################################################################
|
2
|
+
# Copyright (c) 2011-2018, Tenable Network Security
|
3
|
+
# All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
# list of conditions and the following disclaimer.
|
10
|
+
#
|
11
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
# this list of conditions and the following disclaimer in the documentation
|
13
|
+
# and/or other materials provided with the distribution.
|
14
|
+
#
|
15
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
16
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
17
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
19
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
20
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
21
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
22
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
23
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
24
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
################################################################################
|
26
|
+
|
27
|
+
require 'nasl/parser/node'
|
28
|
+
|
29
|
+
module Nasl
|
30
|
+
class Case < Node
|
31
|
+
attr_reader :case_val, :case_op, :case_type
|
32
|
+
|
33
|
+
def initialize(tree, *tokens)
|
34
|
+
super
|
35
|
+
|
36
|
+
if @tokens.length == 3
|
37
|
+
@case_op = nil
|
38
|
+
@case_val = @tokens[1]
|
39
|
+
@case_type = 'normal'
|
40
|
+
elsif @tokens.length == 6
|
41
|
+
@case_op = @tokens[2]
|
42
|
+
@case_val = @tokens[4]
|
43
|
+
@case_type = 'normal_with_op'
|
44
|
+
else
|
45
|
+
@case_op = nil
|
46
|
+
@case_val = nil
|
47
|
+
@case_type = 'default'
|
48
|
+
end
|
49
|
+
|
50
|
+
@children << :case_val
|
51
|
+
@children << :case_op
|
52
|
+
@children << :case_type
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/nasl/parser/function.rb
CHANGED
@@ -28,18 +28,43 @@ require 'nasl/parser/node'
|
|
28
28
|
|
29
29
|
module Nasl
|
30
30
|
class Function < Node
|
31
|
-
attr_reader :body, :name, :params
|
31
|
+
attr_reader :body, :name, :params, :attribute, :fn_type
|
32
32
|
|
33
33
|
def initialize(tree, *tokens)
|
34
34
|
super
|
35
35
|
|
36
|
-
@name = @tokens[1]
|
37
|
-
@params = if @tokens.length == 6 then @tokens[3] else [] end
|
38
36
|
@body = @tokens.last
|
39
37
|
|
38
|
+
@fn_type = @tokens[1]
|
39
|
+
|
40
|
+
if @fn_type == "obj"
|
41
|
+
@name = @tokens[3]
|
42
|
+
@attribute = @tokens[0]
|
43
|
+
if @tokens.length == 8
|
44
|
+
@params = @tokens[5]
|
45
|
+
else
|
46
|
+
@params = []
|
47
|
+
end
|
48
|
+
else
|
49
|
+
@name = @tokens[2]
|
50
|
+
@attribute = []
|
51
|
+
if @tokens.length == 7
|
52
|
+
@params = @tokens[4]
|
53
|
+
else
|
54
|
+
@params = []
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
40
58
|
@children << :name
|
59
|
+
@children << :attribute
|
41
60
|
@children << :params
|
42
61
|
@children << :body
|
62
|
+
@children << :fn_type
|
43
63
|
end
|
64
|
+
|
65
|
+
def each
|
66
|
+
@body.each{ |stmt| yield stmt }
|
67
|
+
end
|
68
|
+
|
44
69
|
end
|
45
70
|
end
|