49 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | # typed: strict | ||
|  | # frozen_string_literal: true | ||
|  | 
 | ||
|  | require "rubocops/extend/formula_cop" | ||
|  | 
 | ||
|  | module RuboCop | ||
|  |   module Cop | ||
|  |     module FormulaAudit | ||
|  |       # This cop audits the use of 0.0.0.0 in formulae. | ||
|  |       # 0.0.0.0 should not be used outside of test do blocks as it can be a security risk. | ||
|  |       class ZeroZeroZeroZero < FormulaCop | ||
|  |         sig { override.params(formula_nodes: FormulaNodes).void } | ||
|  |         def audit_formula(formula_nodes) | ||
|  |           return if formula_tap != "homebrew-core" | ||
|  | 
 | ||
|  |           body_node = formula_nodes.body_node | ||
|  |           return if body_node.nil? | ||
|  | 
 | ||
|  |           test_block = find_block(body_node, :test) | ||
|  | 
 | ||
|  |           # Find all string literals in the formula | ||
|  |           body_node.each_descendant(:str) do |str_node| | ||
|  |             content = string_content(str_node) | ||
|  |             next unless content.include?("0.0.0.0") | ||
|  |             next if test_block && str_node.ancestors.any?(test_block) | ||
|  | 
 | ||
|  |             next if valid_ip_range?(content) | ||
|  | 
 | ||
|  |             offending_node(str_node) | ||
|  |             problem "Do not use 0.0.0.0 as it can be a security risk." | ||
|  |           end | ||
|  |         end | ||
|  | 
 | ||
|  |         private | ||
|  | 
 | ||
|  |         sig { params(content: String).returns(T::Boolean) } | ||
|  |         def valid_ip_range?(content) | ||
|  |           # Allow private IP ranges like 10.0.0.0, 172.16.0.0-172.31.255.255, 192.168.0.0-192.168.255.255 | ||
|  |           return true if content.match?(/\b(?:10|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168)\.\d+\.\d+\b/) | ||
|  |           # Allow IP range notation like 0.0.0.0-255.255.255.255 | ||
|  |           return true if content.match?(/\b0\.0\.0\.0\s*-\s*255\.255\.255\.255\b/) | ||
|  | 
 | ||
|  |           false | ||
|  |         end | ||
|  |       end | ||
|  |     end | ||
|  |   end | ||
|  | end |