@@ -328,7 +328,8 @@ DICT_ELEMENT ([^\"|,\n \t]|([^\\]\\\"))+
328
328
DICT_ELEMENT_WITH_PIPE [^ \t " ]+
329
329
330
330
331
- DICT_ELEMENT_TWO [^\" \=]+
331
+ DICT_ELEMENT_TWO [^\" \=, \t\r\n\\ ]*
332
+ DICT_ELEMENT_TWO_QUOTED [^\"\' \=\r\n\\ ]*
332
333
DICT_ELEMENT_TWO2 [A-Za-z_ -\%\{\.\}\-\/]+
333
334
DIRECTIVE (?i:SecRule)
334
335
DIRECTIVE_SECRULESCRIPT (?i:SecRuleScript)
@@ -370,9 +371,14 @@ EQUALS_MINUS (?i:=\-)
370
371
%x FINISH_ACTIONS
371
372
%x LEXING_ERROR
372
373
%x LEXING_ERROR_ACTION
373
- %x SETVAR_ACTION_WAITING_VARIABLE
374
- %x SETVAR_ACTION_WAITING_OPERATION
375
- %x SETVAR_ACTION_WAITING_CONTENT
374
+ %x SETVAR_ACTION_NONQUOTED
375
+ %x SETVAR_ACTION_NONQUOTED_WAITING_COLLECTION_ELEM
376
+ %x SETVAR_ACTION_NONQUOTED_WAITING_OPERATION
377
+ %x SETVAR_ACTION_NONQUOTED_WAITING_CONTENT
378
+ %x SETVAR_ACTION_QUOTED
379
+ %x SETVAR_ACTION_QUOTED_WAITING_COLLECTION_ELEM
380
+ %x SETVAR_ACTION_QUOTED_WAITING_OPERATION
381
+ %x SETVAR_ACTION_QUOTED_WAITING_CONTENT
376
382
377
383
%{
378
384
// Code run each time a pattern is matched.
@@ -452,7 +458,8 @@ EQUALS_MINUS (?i:=\-)
452
458
{ACTION_SETUID}:'{VAR_FREE_TEXT_QUOTE}' { return p::make_ACTION_SETUID(yytext, *driver.loc.back()); }
453
459
{ACTION_SETUID}:{VAR_FREE_TEXT_SPACE_COMMA} { return p::make_ACTION_SETUID(yytext, *driver.loc.back()); }
454
460
455
- {ACTION_SETVAR}: { BEGIN(SETVAR_ACTION_WAITING_VARIABLE); return p::make_ACTION_SETVAR(*driver.loc.back()); }
461
+ {ACTION_SETVAR}:' { BEGIN(SETVAR_ACTION_QUOTED); return p::make_ACTION_SETVAR(*driver.loc.back()); }
462
+ {ACTION_SETVAR}: { BEGIN(SETVAR_ACTION_NONQUOTED); return p::make_ACTION_SETVAR(*driver.loc.back()); }
456
463
457
464
458
465
{ACTION_SEVERITY}:'{ACTION_SEVERITY_VALUE}' { return p::make_ACTION_SEVERITY(yytext, *driver.loc.back()); }
@@ -513,61 +520,61 @@ EQUALS_MINUS (?i:=\-)
513
520
. { BEGIN(LEXING_ERROR_ACTION); yyless(0); }
514
521
}
515
522
516
- <SETVAR_ACTION_WAITING_VARIABLE>{
517
- \' * { }
518
- \" * { }
519
- {NOT} { return p::make_NOT(*driver.loc.back()); }
520
- {VARIABLE_TX}(\:[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
521
- {VARIABLE_TX}(\:{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
522
- {VARIABLE_TX}(\.[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
523
- {VARIABLE_TX}(\.{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
524
- {VARIABLE_SESSION}(\:[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
525
- {VARIABLE_SESSION}(\:{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
526
- {VARIABLE_SESSION}(\.[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
527
- {VARIABLE_SESSION}(\.{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
528
- {VARIABLE_RESOURCE}(\:[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
529
- {VARIABLE_RESOURCE}(\:{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
530
- {VARIABLE_RESOURCE}(\.[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
531
- {VARIABLE_RESOURCE}(\.{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
532
- {VARIABLE_IP}(\:[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
533
- {VARIABLE_IP}(\:{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
534
- {VARIABLE_IP}(\.[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
535
- {VARIABLE_IP}(\.{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
536
- {VARIABLE_USER}(\:[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
537
- {VARIABLE_USER}(\:{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
538
- {VARIABLE_USER}(\.[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
539
- {VARIABLE_USER}(\.{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
540
- {VARIABLE_GLOBAL}(\:[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
541
- {VARIABLE_GLOBAL}(\:{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
542
- {VARIABLE_GLOBAL}(\.[\' ]{DICT_ELEMENT_TWO}[\' ])? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
543
- {VARIABLE_GLOBAL}(\.{DICT_ELEMENT_TWO})? { BEGIN(SETVAR_ACTION_WAITING_OPERATION); return p::make_VARIABLE(yytext, *driver.loc.back()); }
544
- . { BEGIN(LEXING_ERROR_ACTION); yyless(0); }
545
- [ \t ]*\\\n [ \t ]* { driver.loc.back()->lines(1); driver.loc.back()->step(); }
546
- [ \t ]*\\\r\n [ \t ]* { driver.loc.back()->lines(1); driver.loc.back()->step(); }
523
+ <SETVAR_ACTION_NONQUOTED>{
524
+ {NOT} { return p::make_NOT(*driver.loc.back()); }
525
+ {VARIABLE_TX}|{VARIABLE_SESSION}|{VARIABLE_RESOURCE}|{VARIABLE_IP}|{VARIABLE_USER}|{VARIABLE_GLOBAL}[:\.] { BEGIN(SETVAR_ACTION_NONQUOTED_WAITING_COLLECTION_ELEM); return p::make_SETVAR_VARIABLE_PART(yytext, *driver.loc.back());}
526
+ {VARIABLE_TX}|{VARIABLE_SESSION}|{VARIABLE_RESOURCE}|{VARIABLE_IP}|{VARIABLE_USER}|{VARIABLE_GLOBAL} { BEGIN(SETVAR_ACTION_NONQUOTED_WAITING_OPERATION); return p::make_SETVAR_VARIABLE_PART(yytext, *driver.loc.back());}
527
+ .|\n { BEGIN(LEXING_ERROR_ACTION); yyless(0); }
547
528
}
548
529
530
+ <SETVAR_ACTION_NONQUOTED_WAITING_COLLECTION_ELEM>{
531
+ {DICT_ELEMENT_TWO} { return p::make_SETVAR_VARIABLE_PART(yytext, *driver.loc.back()); }
532
+ \\ (.|\n ) { return p::make_SETVAR_VARIABLE_PART(yytext + 1, *driver.loc.back()); }
533
+ .|\n { BEGIN(SETVAR_ACTION_NONQUOTED_WAITING_OPERATION); yyless(0); }
534
+ }
535
+
536
+ <SETVAR_ACTION_NONQUOTED_WAITING_OPERATION>{
537
+ {EQUALS_PLUS} { BEGIN(SETVAR_ACTION_NONQUOTED_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS_PLUS(*driver.loc.back()); }
538
+ {EQUALS_MINUS} { BEGIN(SETVAR_ACTION_NONQUOTED_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS_MINUS(*driver.loc.back()); }
539
+ {EQUALS} { BEGIN(SETVAR_ACTION_NONQUOTED_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS(*driver.loc.back()); }
540
+ .|\n { BEGIN(EXPECTING_ACTIONS); yyless(0);}
541
+ }
542
+
543
+ <SETVAR_ACTION_NONQUOTED_WAITING_CONTENT>{
544
+ \\ (.|\n ) { return p::make_SETVAR_CONTENT_PART(yytext + 1, *driver.loc.back()); }
545
+ [^," \n\r\t \\]+ { return p::make_SETVAR_CONTENT_PART (yytext, *driver.loc .back ()); }
546
+ .|\n { BEGIN (EXPECTING_ACTIONS); yyless (0 ); }
547
+ }
549
548
549
+ <SETVAR_ACTION_QUOTED>{
550
+ {NOT} { return p::make_NOT (*driver.loc .back ()); }
551
+ {VARIABLE_TX}|{VARIABLE_SESSION}|{VARIABLE_RESOURCE}|{VARIABLE_IP}|{VARIABLE_USER}|{VARIABLE_GLOBAL}[:\.] { BEGIN (SETVAR_ACTION_QUOTED_WAITING_COLLECTION_ELEM); return p::make_SETVAR_VARIABLE_PART (yytext, *driver.loc .back ());}
552
+ {VARIABLE_TX}|{VARIABLE_SESSION}|{VARIABLE_RESOURCE}|{VARIABLE_IP}|{VARIABLE_USER}|{VARIABLE_GLOBAL} { BEGIN (SETVAR_ACTION_QUOTED_WAITING_OPERATION); return p::make_SETVAR_VARIABLE_PART (yytext, *driver.loc .back ());}
553
+ .|\n { BEGIN (LEXING_ERROR_ACTION); yyless (0 ); }
554
+ }
550
555
556
+ <SETVAR_ACTION_QUOTED_WAITING_COLLECTION_ELEM>{
557
+ {DICT_ELEMENT_TWO_QUOTED} { return p::make_SETVAR_VARIABLE_PART (yytext, *driver.loc .back ()); }
558
+ \\(.|\n) { return p::make_SETVAR_VARIABLE_PART (yytext + 1 , *driver.loc .back ()); }
559
+ .|\n { BEGIN (SETVAR_ACTION_QUOTED_WAITING_OPERATION); yyless (0 ); }
560
+ }
551
561
552
- <SETVAR_ACTION_WAITING_OPERATION>{
553
- [ \t ]*\n { BEGIN(INITIAL); yyless(1); }
554
- [ \t ]*\r\n { BEGIN(INITIAL); driver.loc.back()->lines(1); driver.loc.back()->step(); }
555
- [ \t ]*\n { BEGIN(EXPECTING_ACTIONS); yyless(yyleng); driver.loc.back()->lines(1); driver.loc.back()->step(); }
556
- [ \t ]*\r\n { BEGIN(EXPECTING_ACTIONS); yyless(yyleng); driver.loc.back()->lines(1); driver.loc.back()->step(); }
557
- [ \t ]*\" [ \t ]* { }
558
- [ \t ]*\' [ \t ]* { }
559
- \" [ \t ]*\n { BEGIN(EXPECTING_ACTIONS); yyless(1); }
560
- \" [ \t ]*\r\n { BEGIN(EXPECTING_ACTIONS); driver.loc.back()->lines(1); driver.loc.back()->step(); }
561
- {EQUALS_PLUS} { BEGIN(SETVAR_ACTION_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS_PLUS(*driver.loc.back()); }
562
- {EQUALS_MINUS} { BEGIN(SETVAR_ACTION_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS_MINUS(*driver.loc.back()); }
563
- {EQUALS} { BEGIN(SETVAR_ACTION_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS(*driver.loc.back()); }
564
- . { BEGIN(LEXING_ERROR_ACTION); yyless(0); }
562
+ <SETVAR_ACTION_QUOTED_WAITING_OPERATION>{
563
+ {EQUALS_PLUS} { BEGIN (SETVAR_ACTION_QUOTED_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS_PLUS (*driver.loc .back ()); }
564
+ {EQUALS_MINUS} { BEGIN (SETVAR_ACTION_QUOTED_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS_MINUS (*driver.loc .back ()); }
565
+ {EQUALS} { BEGIN (SETVAR_ACTION_QUOTED_WAITING_CONTENT); return p::make_SETVAR_OPERATION_EQUALS (*driver.loc .back ()); }
566
+ \' { BEGIN(EXPECTING_ACTIONS); }
567
+ .|\n { BEGIN(LEXING_ERROR_ACTION); yyless(0); }
565
568
}
566
569
567
- <SETVAR_ACTION_WAITING_CONTENT>{
568
- [^," \n]+ { BEGIN (EXPECTING_ACTIONS); return p::make_FREE_TEXT (yytext, *driver.loc .back ()); }
570
+ <SETVAR_ACTION_QUOTED_WAITING_CONTENT>{
571
+ \\ (.|\n ) { return p::make_SETVAR_CONTENT_PART(yytext + 1, *driver.loc.back()); }
572
+ [^"\'\n\r\\ ]* { return p::make_SETVAR_CONTENT_PART(yytext, *driver.loc.back()); }
573
+ \' { BEGIN(EXPECTING_ACTIONS); }
574
+ .|\n { BEGIN(LEXING_ERROR_ACTION); yyless(0); }
569
575
}
570
576
577
+
571
578
<FINISH_ACTIONS>{
572
579
<<EOF>> { BEGIN(INITIAL); yyless(0); p::make_NEW_LINE(*driver.loc.back()); }
573
580
. { BEGIN(INITIAL); }
0 commit comments