@@ -117,10 +117,9 @@ impl Rule for NoHardcodedSecret {
117117
118118 fn check ( & self , source : & str , tree : & tree_sitter:: Tree ) -> Vec < Finding > {
119119 let mut findings = Vec :: new ( ) ;
120- let secret_pattern = Regex :: new (
121- r"(?i)(password|secret|api_?key|token|auth|credential|private_?key)"
122- )
123- . unwrap ( ) ;
120+ let secret_pattern =
121+ Regex :: new ( r"(?i)(password|secret|api_?key|token|auth|credential|private_?key)" )
122+ . unwrap ( ) ;
124123
125124 walk_tree ( tree. root_node ( ) , source, & mut |node, src| {
126125 // variable_declarator: const password = "hardcoded"
@@ -211,10 +210,8 @@ impl Rule for NoSqlInjection {
211210
212211 fn check ( & self , source : & str , tree : & tree_sitter:: Tree ) -> Vec < Finding > {
213212 let mut findings = Vec :: new ( ) ;
214- let sql_pattern = Regex :: new (
215- r"(?i)(SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|EXEC)\s"
216- )
217- . unwrap ( ) ;
213+ let sql_pattern =
214+ Regex :: new ( r"(?i)(SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|EXEC)\s" ) . unwrap ( ) ;
218215
219216 walk_tree ( tree. root_node ( ) , source, & mut |node, src| {
220217 // Detect: query("SELECT * FROM users WHERE id = " + userId)
@@ -346,7 +343,14 @@ impl Rule for NoCommandInjection {
346343
347344 fn check ( & self , source : & str , tree : & tree_sitter:: Tree ) -> Vec < Finding > {
348345 let mut findings = Vec :: new ( ) ;
349- let dangerous_fns = [ "exec" , "execSync" , "spawn" , "spawnSync" , "execFile" , "execFileSync" ] ;
346+ let dangerous_fns = [
347+ "exec" ,
348+ "execSync" ,
349+ "spawn" ,
350+ "spawnSync" ,
351+ "execFile" ,
352+ "execFileSync" ,
353+ ] ;
350354
351355 walk_tree ( tree. root_node ( ) , source, & mut |node, src| {
352356 if node. kind ( ) == "call_expression" {
@@ -578,9 +582,18 @@ impl Rule for NoPathTraversal {
578582 fn check ( & self , source : & str , tree : & tree_sitter:: Tree ) -> Vec < Finding > {
579583 let mut findings = Vec :: new ( ) ;
580584 let fs_fns = [
581- "readFile" , "readFileSync" , "writeFile" , "writeFileSync" ,
582- "readdir" , "readdirSync" , "unlink" , "unlinkSync" ,
583- "stat" , "statSync" , "access" , "accessSync" ,
585+ "readFile" ,
586+ "readFileSync" ,
587+ "writeFile" ,
588+ "writeFileSync" ,
589+ "readdir" ,
590+ "readdirSync" ,
591+ "unlink" ,
592+ "unlinkSync" ,
593+ "stat" ,
594+ "statSync" ,
595+ "access" ,
596+ "accessSync" ,
584597 ] ;
585598
586599 walk_tree ( tree. root_node ( ) , source, & mut |node, src| {
@@ -694,9 +707,8 @@ impl Rule for NoUnsafeRegex {
694707 fn check ( & self , source : & str , tree : & tree_sitter:: Tree ) -> Vec < Finding > {
695708 let mut findings = Vec :: new ( ) ;
696709 // Patterns known to cause catastrophic backtracking: nested quantifiers
697- let dangerous_pattern = Regex :: new (
698- r"(\([^)]*[+*][^)]*\)[+*]|\([^)]*\|[^)]*\)[+*])"
699- ) . unwrap ( ) ;
710+ let dangerous_pattern =
711+ Regex :: new ( r"(\([^)]*[+*][^)]*\)[+*]|\([^)]*\|[^)]*\)[+*])" ) . unwrap ( ) ;
700712
701713 walk_tree ( tree. root_node ( ) , source, & mut |node, src| {
702714 // Detect regex literals: /pattern/
@@ -835,7 +847,10 @@ impl Rule for ExpressCookieNoSecure {
835847 let key_inner = key_text. trim_matches ( |c| c == '"' || c == '\'' ) ;
836848 if key_inner == "cookie" && value. kind ( ) == "object" {
837849 let obj_text = & src[ value. byte_range ( ) ] ;
838- if !obj_text. contains ( "secure" ) || obj_text. contains ( "secure: false" ) || obj_text. contains ( "secure:false" ) {
850+ if !obj_text. contains ( "secure" )
851+ || obj_text. contains ( "secure: false" )
852+ || obj_text. contains ( "secure:false" )
853+ {
839854 findings. push ( make_finding (
840855 self . id ( ) ,
841856 self . severity ( ) ,
@@ -886,7 +901,10 @@ impl Rule for ExpressCookieNoHttpOnly {
886901 let key_inner = key_text. trim_matches ( |c| c == '"' || c == '\'' ) ;
887902 if key_inner == "cookie" && value. kind ( ) == "object" {
888903 let obj_text = & src[ value. byte_range ( ) ] ;
889- if !obj_text. contains ( "httpOnly" ) || obj_text. contains ( "httpOnly: false" ) || obj_text. contains ( "httpOnly:false" ) {
904+ if !obj_text. contains ( "httpOnly" )
905+ || obj_text. contains ( "httpOnly: false" )
906+ || obj_text. contains ( "httpOnly:false" )
907+ {
890908 findings. push ( make_finding (
891909 self . id ( ) ,
892910 self . severity ( ) ,
@@ -927,9 +945,7 @@ impl Rule for ExpressDirectResponseWrite {
927945
928946 fn check ( & self , source : & str , tree : & tree_sitter:: Tree ) -> Vec < Finding > {
929947 let mut findings = Vec :: new ( ) ;
930- let user_input_pattern = Regex :: new (
931- r"req\.(params|query|body|headers)"
932- ) . unwrap ( ) ;
948+ let user_input_pattern = Regex :: new ( r"req\.(params|query|body|headers)" ) . unwrap ( ) ;
933949
934950 walk_tree ( tree. root_node ( ) , source, & mut |node, src| {
935951 // Detect: res.send(req.query.foo), res.write(req.body.bar)
@@ -1008,9 +1024,9 @@ impl Rule for NoCorsStar {
10081024 header_name. trim_matches ( |c| c == '"' || c == '\'' ) ;
10091025 let val_inner =
10101026 header_val. trim_matches ( |c| c == '"' || c == '\'' ) ;
1011- if name_inner. eq_ignore_ascii_case (
1012- "Access-Control-Allow-Origin" ,
1013- ) && val_inner == "*"
1027+ if name_inner
1028+ . eq_ignore_ascii_case ( "Access-Control-Allow-Origin" )
1029+ && val_inner == "*"
10141030 {
10151031 findings. push ( make_finding (
10161032 self . id ( ) ,
0 commit comments