brakeman 7.1.2 → 8.0.6
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 +4 -4
- data/CHANGES.md +48 -0
- data/README.md +1 -1
- data/bundle/load.rb +7 -7
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/NEWS.md +39 -1
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/README.md +1 -1
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/parser.rb +7 -2
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/row.rb +26 -2
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/version.rb +1 -1
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv.rb +30 -58
- data/bundle/ruby/3.2.0/gems/erubi-1.13.1/CHANGELOG +111 -0
- data/bundle/ruby/3.2.0/gems/{erubis-2.7.0 → erubi-1.13.1}/MIT-LICENSE +1 -0
- data/bundle/ruby/3.2.0/gems/erubi-1.13.1/README.rdoc +151 -0
- data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi/capture_block.rb +91 -0
- data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi/capture_end.rb +58 -0
- data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi.rb +299 -0
- data/bundle/ruby/3.2.0/gems/parallel-1.28.0/lib/parallel/version.rb +4 -0
- data/bundle/ruby/3.2.0/gems/{parallel-1.27.0 → parallel-1.28.0}/lib/parallel.rb +11 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/io/ansi.rb +6 -4
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/io/windows.rb +49 -23
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/io.rb +8 -2
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/line_editor.rb +49 -21
- data/bundle/ruby/3.2.0/gems/reline-0.7.0/lib/reline/version.rb +3 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline.rb +10 -9
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/CHANGES +8 -2
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/Gemfile +5 -2
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/LICENSE +1 -1
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/README.jp.md +10 -12
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/README.md +21 -26
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/embedded.rb +1 -1
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/logic_less/context.rb +4 -3
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/splat/builder.rb +18 -19
- data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/version.rb +1 -1
- data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/CHANGES +8 -0
- data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/README.md +1 -1
- data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/static_analyzer.rb +1 -1
- data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/string_splitter.rb +61 -5
- data/bundle/ruby/3.2.0/gems/temple-0.10.6/lib/temple/parser_engine.rb +34 -0
- data/bundle/ruby/3.2.0/gems/temple-0.10.6/lib/temple/static_analyzer.rb +148 -0
- data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/version.rb +1 -1
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/COPYING +1 -1
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/asciidoc.rb +12 -5
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/babel.rb +5 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/builder.rb +4 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/coffee.rb +14 -4
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/commonmarker.rb +65 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/csv.rb +63 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/erb.rb +130 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/erubi.rb +41 -8
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/etanni.rb +7 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/haml.rb +67 -1
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/kramdown.rb +59 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/liquid.rb +93 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/livescript.rb +11 -4
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/mapping.rb +8 -8
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/markaby.rb +11 -2
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/nokogiri.rb +13 -2
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/pandoc.rb +81 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/pipeline.rb +6 -1
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/plain.rb +5 -1
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/prawn.rb +17 -6
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/radius.rb +96 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rdiscount.rb +82 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rdoc.rb +41 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/redcarpet.rb +73 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/redcloth.rb +40 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rst-pandoc.rb +33 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/sass.rb +16 -3
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/slim.rb +18 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/string.rb +10 -2
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/template.rb +5 -5
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/typescript.rb +5 -0
- data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/yajl.rb +91 -0
- data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt.rb +1 -2
- data/lib/brakeman/app_tree.rb +7 -2
- data/lib/brakeman/checks/check_eol_rails.rb +2 -1
- data/lib/brakeman/checks/check_eol_ruby.rb +1 -0
- data/lib/brakeman/checks/check_execute.rb +23 -19
- data/lib/brakeman/checks/check_model_attributes.rb +1 -1
- data/lib/brakeman/checks/check_render.rb +1 -27
- data/lib/brakeman/checks/check_render_rce.rb +43 -0
- data/lib/brakeman/checks/check_session_settings.rb +1 -1
- data/lib/brakeman/checks/check_sql.rb +4 -3
- data/lib/brakeman/checks.rb +31 -25
- data/lib/brakeman/commandline.rb +17 -5
- data/lib/brakeman/file_parser.rb +3 -2
- data/lib/brakeman/logger.rb +265 -0
- data/lib/brakeman/options.rb +6 -11
- data/lib/brakeman/parsers/rails_erubi.rb +82 -0
- data/lib/brakeman/parsers/template_parser.rb +7 -15
- data/lib/brakeman/processor.rb +2 -2
- data/lib/brakeman/processors/base_processor.rb +13 -6
- data/lib/brakeman/processors/controller_alias_processor.rb +1 -1
- data/lib/brakeman/processors/controller_processor.rb +3 -3
- data/lib/brakeman/processors/{erubis_template_processor.rb → erubi_template_procesor.rb} +3 -3
- data/lib/brakeman/processors/gem_processor.rb +1 -1
- data/lib/brakeman/processors/haml_template_processor.rb +3 -1
- data/lib/brakeman/processors/lib/rails2_config_processor.rb +4 -3
- data/lib/brakeman/processors/lib/rails2_route_processor.rb +1 -1
- data/lib/brakeman/processors/lib/rails3_config_processor.rb +10 -1
- data/lib/brakeman/processors/lib/render_helper.rb +4 -2
- data/lib/brakeman/processors/lib/render_path.rb +1 -1
- data/lib/brakeman/processors/model_processor.rb +1 -1
- data/lib/brakeman/report/ignore/config.rb +1 -1
- data/lib/brakeman/scanner.rb +33 -51
- data/lib/brakeman/tracker/collection.rb +12 -2
- data/lib/brakeman/tracker/config.rb +17 -13
- data/lib/brakeman/tracker/constants.rb +17 -2
- data/lib/brakeman/tracker/controller.rb +1 -1
- data/lib/brakeman/tracker.rb +7 -15
- data/lib/brakeman/version.rb +1 -1
- data/lib/brakeman.rb +109 -55
- metadata +182 -210
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/CHANGES.txt +0 -828
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/README.txt +0 -102
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/contrib/erubis +0 -3468
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/contrib/erubis-run.rb +0 -132
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/contrib/inline-require +0 -179
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/context.rb +0 -83
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/converter.rb +0 -357
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ec.rb +0 -117
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ecpp.rb +0 -113
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ejava.rb +0 -110
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ejavascript.rb +0 -119
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/enhanced.rb +0 -126
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/eperl.rb +0 -95
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ephp.rb +0 -99
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/eruby.rb +0 -125
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/escheme.rb +0 -114
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/optimized.rb +0 -127
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine.rb +0 -120
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/enhancer.rb +0 -723
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/error.rb +0 -23
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb +0 -88
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/generator.rb +0 -85
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/helper.rb +0 -47
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_form_helper.rb +0 -197
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_helper.rb +0 -353
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/local-setting.rb +0 -9
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/main.rb +0 -516
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/preprocessing.rb +0 -58
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/tiny.rb +0 -144
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/util.rb +0 -22
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis.rb +0 -73
- data/bundle/ruby/3.2.0/gems/erubis-2.7.0/setup.rb +0 -1331
- data/bundle/ruby/3.2.0/gems/parallel-1.27.0/lib/parallel/version.rb +0 -4
- data/bundle/ruby/3.2.0/gems/reline-0.6.3/lib/reline/version.rb +0 -3
- data/bundle/ruby/3.2.0/gems/temple-0.10.4/lib/temple/static_analyzer.rb +0 -78
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/creole.rb +0 -16
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/csv.rb +0 -53
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/erb.rb +0 -65
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/kramdown.rb +0 -13
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/liquid.rb +0 -37
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/pandoc.rb +0 -39
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/radius.rb +0 -41
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/rdiscount.rb +0 -23
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/rdoc.rb +0 -11
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/redcarpet.rb +0 -31
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/redcloth.rb +0 -13
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/rst-pandoc.rb +0 -10
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/slim.rb +0 -5
- data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/yajl.rb +0 -81
- data/lib/brakeman/parsers/erubis_patch.rb +0 -11
- data/lib/brakeman/parsers/rails2_erubis.rb +0 -9
- data/lib/brakeman/parsers/rails2_xss_plugin_erubis.rb +0 -52
- data/lib/brakeman/parsers/rails3_erubis.rb +0 -85
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/LICENSE.txt +0 -0
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/core_ext/array.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/core_ext/string.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/fields_converter.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/input_record_separator.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/table.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/writer.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{parallel-1.27.0 → parallel-1.28.0}/MIT-LICENSE.txt +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/BSDL +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/COPYING +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/README.md +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/config.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/face.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/history.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/io/dumb.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/base.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/composite.rb +0 -0
- data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/emacs.rb +2 -2
- /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/vi_command.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/vi_insert.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_stroke.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/kill_ring.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/unicode/east_asian_width.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/unicode.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/license_of_rb-readline +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/code_attributes.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/command.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/controls.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/do_inserter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/end_inserter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/engine.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/erb_converter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/filter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/grammar.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/include.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/interpolation.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/logic_less/filter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/logic_less.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/parser.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/railtie.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/smart/escaper.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/smart/filter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/smart/parser.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/smart.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/splat/filter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/template.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/translator.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/slim.gemspec +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/EXPRESSIONS.md +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/Gemfile +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/LICENSE +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/engine.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/erb/engine.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/erb/parser.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/erb/template.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/erb/trimming.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/exceptions.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/ambles.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/code_merger.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/control_flow.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/dynamic_inliner.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/dynamic_merger.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/encoding.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/eraser.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/escapable.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/multi_flattener.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/remove_bom.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/static_merger.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/validator.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generator.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/array.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/array_buffer.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/erb.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/rails_output_buffer.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/string_buffer.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/grammar.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/attribute_merger.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/attribute_remover.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/attribute_sorter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/dispatcher.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/fast.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/filter.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/pretty.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/safe.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/map.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/dispatcher.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/engine_dsl.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/grammar_dsl.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/options.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/template.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/parser.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/templates/rails.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/templates/tilt.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/templates.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/utils.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/temple.gemspec +0 -0
- /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/_emacs_org.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/_handlebars.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/_jbuilder.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/_org.rb +0 -0
- /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/cli.rb +0 -0
|
@@ -5,7 +5,7 @@ module Brakeman
|
|
|
5
5
|
include Util
|
|
6
6
|
|
|
7
7
|
attr_reader :gems, :rails, :ruby_version, :tracker
|
|
8
|
-
attr_writer :
|
|
8
|
+
attr_writer :erubi, :escape_html
|
|
9
9
|
|
|
10
10
|
def initialize tracker
|
|
11
11
|
@tracker = tracker
|
|
@@ -13,7 +13,7 @@ module Brakeman
|
|
|
13
13
|
@gems = {}
|
|
14
14
|
@settings = {}
|
|
15
15
|
@escape_html = nil
|
|
16
|
-
@
|
|
16
|
+
@erubi = nil
|
|
17
17
|
@ruby_version = nil
|
|
18
18
|
@rails_version = nil
|
|
19
19
|
end
|
|
@@ -28,8 +28,8 @@ module Brakeman
|
|
|
28
28
|
false
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def
|
|
32
|
-
@
|
|
31
|
+
def erubi?
|
|
32
|
+
@erubi
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def escape_html?
|
|
@@ -88,29 +88,29 @@ module Brakeman
|
|
|
88
88
|
if tracker.options[:rails3].nil? and tracker.options[:rails4].nil?
|
|
89
89
|
if @rails_version.start_with? "3"
|
|
90
90
|
tracker.options[:rails3] = true
|
|
91
|
-
|
|
91
|
+
notify_version 3
|
|
92
92
|
elsif @rails_version.start_with? "4"
|
|
93
93
|
tracker.options[:rails3] = true
|
|
94
94
|
tracker.options[:rails4] = true
|
|
95
|
-
|
|
95
|
+
notify_version 4
|
|
96
96
|
elsif @rails_version.start_with? "5"
|
|
97
97
|
tracker.options[:rails3] = true
|
|
98
98
|
tracker.options[:rails4] = true
|
|
99
99
|
tracker.options[:rails5] = true
|
|
100
|
-
|
|
100
|
+
notify_version 5
|
|
101
101
|
elsif @rails_version.start_with? "6"
|
|
102
102
|
tracker.options[:rails3] = true
|
|
103
103
|
tracker.options[:rails4] = true
|
|
104
104
|
tracker.options[:rails5] = true
|
|
105
105
|
tracker.options[:rails6] = true
|
|
106
|
-
|
|
106
|
+
notify_version 6
|
|
107
107
|
elsif @rails_version.start_with? "7"
|
|
108
108
|
tracker.options[:rails3] = true
|
|
109
109
|
tracker.options[:rails4] = true
|
|
110
110
|
tracker.options[:rails5] = true
|
|
111
111
|
tracker.options[:rails6] = true
|
|
112
112
|
tracker.options[:rails7] = true
|
|
113
|
-
|
|
113
|
+
notify_version 7
|
|
114
114
|
elsif @rails_version.start_with? "8"
|
|
115
115
|
tracker.options[:rails3] = true
|
|
116
116
|
tracker.options[:rails4] = true
|
|
@@ -118,14 +118,14 @@ module Brakeman
|
|
|
118
118
|
tracker.options[:rails6] = true
|
|
119
119
|
tracker.options[:rails7] = true
|
|
120
120
|
tracker.options[:rails8] = true
|
|
121
|
-
|
|
121
|
+
notify_version 8
|
|
122
122
|
end
|
|
123
123
|
end
|
|
124
124
|
end
|
|
125
125
|
|
|
126
126
|
if get_gem :rails_xss
|
|
127
127
|
@escape_html = true
|
|
128
|
-
Brakeman.
|
|
128
|
+
Brakeman.debug "Escaping HTML by default"
|
|
129
129
|
end
|
|
130
130
|
end
|
|
131
131
|
|
|
@@ -182,7 +182,7 @@ module Brakeman
|
|
|
182
182
|
option = config[o]
|
|
183
183
|
|
|
184
184
|
if not option.is_a? Hash
|
|
185
|
-
Brakeman.debug "
|
|
185
|
+
Brakeman.debug "Skipping config setting: #{path.map(&:to_s).join(".")}"
|
|
186
186
|
return
|
|
187
187
|
end
|
|
188
188
|
|
|
@@ -202,7 +202,7 @@ module Brakeman
|
|
|
202
202
|
version = tracker.config.rails[:load_defaults].value.to_s
|
|
203
203
|
|
|
204
204
|
unless version.match?(/^\d+\.\d+$/)
|
|
205
|
-
Brakeman.
|
|
205
|
+
Brakeman.alert "Unknown version: #{tracker.config.rails[:load_defaults]}"
|
|
206
206
|
return
|
|
207
207
|
end
|
|
208
208
|
|
|
@@ -284,5 +284,9 @@ module Brakeman
|
|
|
284
284
|
set_rails_config(value: true_value, path: [:active_support, :use_rfc4122_namespaced_uuids])
|
|
285
285
|
end
|
|
286
286
|
end
|
|
287
|
+
|
|
288
|
+
private def notify_version version
|
|
289
|
+
Brakeman.debug "Detected Rails #{version} application"
|
|
290
|
+
end
|
|
287
291
|
end
|
|
288
292
|
end
|
|
@@ -29,7 +29,7 @@ module Brakeman
|
|
|
29
29
|
|
|
30
30
|
def set_name name, context
|
|
31
31
|
@name = name
|
|
32
|
-
@name_array = Constants.constant_as_array(name)
|
|
32
|
+
@name_array = Constants.constant_as_array(name, context)
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def match? name
|
|
@@ -129,7 +129,22 @@ module Brakeman
|
|
|
129
129
|
end
|
|
130
130
|
end
|
|
131
131
|
|
|
132
|
-
def self.constant_as_array exp
|
|
132
|
+
def self.constant_as_array exp, context = nil
|
|
133
|
+
# Only prepend context for simple (unqualified) constants
|
|
134
|
+
if context && (exp.is_a?(Symbol) || (exp.is_a?(Sexp) && exp.node_type == :const))
|
|
135
|
+
context_name = context[:module] || context[:class]
|
|
136
|
+
context_name = context_name.name if context_name.respond_to?(:name)
|
|
137
|
+
if context_name
|
|
138
|
+
# Build colon2 chain: A::B becomes s(:colon2, s(:const, :A), :B)
|
|
139
|
+
parts = context_name.to_s.split("::")
|
|
140
|
+
base = Sexp.new(:const, parts.first.to_sym)
|
|
141
|
+
parts[1..].each do |part|
|
|
142
|
+
base = Sexp.new(:colon2, base, part.to_sym)
|
|
143
|
+
end
|
|
144
|
+
exp = Sexp.new(:colon2, base, exp)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
133
148
|
res = []
|
|
134
149
|
while exp
|
|
135
150
|
if exp.is_a? Sexp
|
|
@@ -132,7 +132,7 @@ module Brakeman
|
|
|
132
132
|
when :lit, :str
|
|
133
133
|
filter[option.value] = value[1]
|
|
134
134
|
else
|
|
135
|
-
Brakeman.debug "
|
|
135
|
+
Brakeman.debug "Unknown before_filter value: #{option} => #{value}"
|
|
136
136
|
end
|
|
137
137
|
end
|
|
138
138
|
else
|
data/lib/brakeman/tracker.rb
CHANGED
|
@@ -101,15 +101,9 @@ class Brakeman::Tracker
|
|
|
101
101
|
@app_path ||= File.expand_path @options[:app_path]
|
|
102
102
|
end
|
|
103
103
|
|
|
104
|
-
#Iterate over all methods
|
|
104
|
+
#Iterate over all methods
|
|
105
105
|
def each_method
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if @options[:index_libs]
|
|
109
|
-
classes << self.libs
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
classes.each do |set|
|
|
106
|
+
[self.controllers, self.models, self.libs].each do |set|
|
|
113
107
|
set.each do |set_name, collection|
|
|
114
108
|
collection.each_method do |method_name, definition|
|
|
115
109
|
src = definition.src
|
|
@@ -137,13 +131,7 @@ class Brakeman::Tracker
|
|
|
137
131
|
|
|
138
132
|
|
|
139
133
|
def each_class
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if @options[:index_libs]
|
|
143
|
-
classes << self.libs
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
classes.each do |set|
|
|
134
|
+
[self.controllers, self.models, self.libs].each do |set|
|
|
147
135
|
set.each do |set_name, collection|
|
|
148
136
|
collection.src.each do |file, src|
|
|
149
137
|
yield src, set_name, file
|
|
@@ -329,6 +317,8 @@ class Brakeman::Tracker
|
|
|
329
317
|
finder = Brakeman::FindAllCalls.new self
|
|
330
318
|
|
|
331
319
|
method_sets.each do |set|
|
|
320
|
+
Brakeman.logger.spin
|
|
321
|
+
|
|
332
322
|
set.each do |set_name, info|
|
|
333
323
|
info.each_method do |method_name, definition|
|
|
334
324
|
src = definition.src
|
|
@@ -339,12 +329,14 @@ class Brakeman::Tracker
|
|
|
339
329
|
|
|
340
330
|
if locations.include? :templates
|
|
341
331
|
self.each_template do |_name, template|
|
|
332
|
+
Brakeman.logger.spin
|
|
342
333
|
finder.process_source template.src, :template => template, :file => template.file
|
|
343
334
|
end
|
|
344
335
|
end
|
|
345
336
|
|
|
346
337
|
if locations.include? :initializers
|
|
347
338
|
self.initializers.each do |file_name, src|
|
|
339
|
+
Brakeman.logger.spin
|
|
348
340
|
finder.process_all_source src, :file => file_name
|
|
349
341
|
end
|
|
350
342
|
end
|
data/lib/brakeman/version.rb
CHANGED
data/lib/brakeman.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'set'
|
|
2
|
+
require 'brakeman/logger'
|
|
2
3
|
require 'brakeman/version'
|
|
3
4
|
|
|
4
5
|
module Brakeman
|
|
@@ -32,6 +33,7 @@ module Brakeman
|
|
|
32
33
|
@quiet = false
|
|
33
34
|
@loaded_dependencies = []
|
|
34
35
|
@vendored_paths = false
|
|
36
|
+
@logger = nil
|
|
35
37
|
|
|
36
38
|
#Run Brakeman scan. Returns Tracker object.
|
|
37
39
|
#
|
|
@@ -52,7 +54,6 @@ module Brakeman
|
|
|
52
54
|
# * :highlight_user_input - highlight user input in reported warnings (default: true)
|
|
53
55
|
# * :html_style - path to CSS file
|
|
54
56
|
# * :ignore_model_output - consider models safe (default: false)
|
|
55
|
-
# * :index_libs - add libraries to call index (default: true)
|
|
56
57
|
# * :interprocedural - limited interprocedural processing of method calls (default: false)
|
|
57
58
|
# * :message_limit - limit length of messages
|
|
58
59
|
# * :min_confidence - minimum confidence (0-2, 0 is highest)
|
|
@@ -71,7 +72,6 @@ module Brakeman
|
|
|
71
72
|
# * :safe_methods - array of methods to consider safe
|
|
72
73
|
# * :show_ignored - Display warnings that are usually ignored
|
|
73
74
|
# * :sql_safe_methods - array of sql sanitization methods to consider safe
|
|
74
|
-
# * :skip_libs - do not process lib/ directory (default: false)
|
|
75
75
|
# * :skip_vendor - do not process vendor/ directory (default: true)
|
|
76
76
|
# * :skip_checks - checks not to run (run all if not specified)
|
|
77
77
|
# * :absolute_paths - show absolute path of each file (default: false)
|
|
@@ -79,6 +79,10 @@ module Brakeman
|
|
|
79
79
|
#
|
|
80
80
|
#Alternatively, just supply a path as a string.
|
|
81
81
|
def self.run options
|
|
82
|
+
if not $stderr.tty? and options[:report_progress].nil?
|
|
83
|
+
options[:report_progress] = false
|
|
84
|
+
end
|
|
85
|
+
|
|
82
86
|
options = set_options options
|
|
83
87
|
|
|
84
88
|
@quiet = !!options[:quiet]
|
|
@@ -88,18 +92,37 @@ module Brakeman
|
|
|
88
92
|
options[:report_progress] = false
|
|
89
93
|
end
|
|
90
94
|
|
|
95
|
+
@logger = options[:logger] || set_default_logger(options)
|
|
96
|
+
|
|
91
97
|
if options[:use_prism]
|
|
92
98
|
begin
|
|
93
99
|
require 'prism'
|
|
94
|
-
notify '[Notice] Using Prism parser'
|
|
95
100
|
rescue LoadError => e
|
|
96
|
-
Brakeman.
|
|
101
|
+
Brakeman.alert "Asked to use Prism, but failed to load: #{e}"
|
|
97
102
|
end
|
|
98
103
|
end
|
|
99
104
|
|
|
105
|
+
Brakeman.announce "Brakeman v#{Brakeman::Version}"
|
|
106
|
+
|
|
100
107
|
scan options
|
|
101
108
|
end
|
|
102
109
|
|
|
110
|
+
def self.logger
|
|
111
|
+
@logger
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def self.logger= log
|
|
115
|
+
@logger = log
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def self.set_default_logger(options = {})
|
|
119
|
+
@logger = Brakeman::Logger.get_logger(options)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def self.cleanup(newline = true)
|
|
123
|
+
@logger.cleanup(newline) if @logger
|
|
124
|
+
end
|
|
125
|
+
|
|
103
126
|
#Sets up options for run, checks given application path
|
|
104
127
|
def self.set_options options
|
|
105
128
|
if options.is_a? String
|
|
@@ -144,7 +167,6 @@ module Brakeman
|
|
|
144
167
|
#Load options from YAML file
|
|
145
168
|
def self.load_options line_options
|
|
146
169
|
custom_location = line_options[:config_file]
|
|
147
|
-
quiet = line_options[:quiet]
|
|
148
170
|
app_path = line_options[:app_path]
|
|
149
171
|
|
|
150
172
|
#Load configuration file
|
|
@@ -158,19 +180,22 @@ module Brakeman
|
|
|
158
180
|
# After parsing the yaml config file for options, convert any string keys into symbols.
|
|
159
181
|
options.keys.select {|k| k.is_a? String}.map {|k| k.to_sym }.each {|k| options[k] = options[k.to_s]; options.delete(k.to_s) }
|
|
160
182
|
|
|
183
|
+
# Brakeman.logger is probably not set yet
|
|
184
|
+
logger = Brakeman::Logger.get_logger(options.merge(line_options))
|
|
185
|
+
|
|
161
186
|
unless line_options[:allow_check_paths_in_config]
|
|
162
187
|
if options.include? :additional_checks_path
|
|
163
188
|
options.delete :additional_checks_path
|
|
164
189
|
|
|
165
|
-
|
|
190
|
+
logger.alert 'Ignoring additional check paths in config file. Use --allow-check-paths-in-config to allow'
|
|
166
191
|
end
|
|
167
192
|
end
|
|
168
193
|
|
|
169
|
-
|
|
170
|
-
notify "[Notice] Using configuration in #{config}" unless (options[:quiet] || quiet)
|
|
194
|
+
logger.alert "Using configuration in #{config}"
|
|
171
195
|
options
|
|
172
196
|
else
|
|
173
|
-
|
|
197
|
+
logger = Brakeman::Logger.get_logger(line_options)
|
|
198
|
+
logger.alert "Empty configuration file: #{config}"
|
|
174
199
|
{}
|
|
175
200
|
end
|
|
176
201
|
else
|
|
@@ -209,7 +234,6 @@ module Brakeman
|
|
|
209
234
|
:html_style => "#{File.expand_path(File.dirname(__FILE__))}/brakeman/format/style.css",
|
|
210
235
|
:ignore_model_output => false,
|
|
211
236
|
:ignore_redirect_to_model => true,
|
|
212
|
-
:index_libs => true,
|
|
213
237
|
:message_limit => 100,
|
|
214
238
|
:min_confidence => 2,
|
|
215
239
|
:output_color => true,
|
|
@@ -367,6 +391,12 @@ module Brakeman
|
|
|
367
391
|
|
|
368
392
|
options.delete :create_config
|
|
369
393
|
|
|
394
|
+
if options[:logger]
|
|
395
|
+
@logger = options.delete(:logger)
|
|
396
|
+
else
|
|
397
|
+
set_default_logger(options)
|
|
398
|
+
end
|
|
399
|
+
|
|
370
400
|
options.each do |k,v|
|
|
371
401
|
if v.is_a? Set
|
|
372
402
|
options[k] = v.to_a
|
|
@@ -377,60 +407,73 @@ module Brakeman
|
|
|
377
407
|
File.open file, "w" do |f|
|
|
378
408
|
YAML.dump options, f
|
|
379
409
|
end
|
|
380
|
-
|
|
410
|
+
|
|
411
|
+
announce "Output configuration to #{file}"
|
|
381
412
|
else
|
|
382
|
-
|
|
413
|
+
$stdout.puts YAML.dump(options)
|
|
383
414
|
end
|
|
384
415
|
end
|
|
385
416
|
|
|
386
|
-
|
|
417
|
+
# Returns quit message unless the latest version
|
|
418
|
+
# of Brakeman matches the current version.
|
|
419
|
+
#
|
|
420
|
+
# Optionally checks that the latest version is at least
|
|
421
|
+
# the specified number of days old.
|
|
422
|
+
def self.ensure_latest(days_old: 0)
|
|
423
|
+
require 'date'
|
|
424
|
+
|
|
387
425
|
current = Brakeman::Version
|
|
388
|
-
latest = Gem.
|
|
389
|
-
|
|
390
|
-
|
|
426
|
+
latest = Gem.latest_spec_for('brakeman')
|
|
427
|
+
release_date = latest.date.to_date
|
|
428
|
+
latest_version = latest.version.to_s
|
|
429
|
+
|
|
430
|
+
if (Date.today - release_date) >= days_old
|
|
431
|
+
if current != latest_version
|
|
432
|
+
return "Brakeman #{current} is not the latest version #{latest_version}"
|
|
433
|
+
else
|
|
434
|
+
false
|
|
435
|
+
end
|
|
436
|
+
else
|
|
437
|
+
false
|
|
391
438
|
end
|
|
392
439
|
end
|
|
393
440
|
|
|
394
441
|
#Run a scan. Generally called from Brakeman.run instead of directly.
|
|
395
442
|
def self.scan options
|
|
396
443
|
#Load scanner
|
|
397
|
-
|
|
444
|
+
scanner, tracker = nil
|
|
398
445
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
446
|
+
process_step 'Loading scanner' do
|
|
447
|
+
begin
|
|
448
|
+
require 'brakeman/scanner'
|
|
449
|
+
rescue LoadError
|
|
450
|
+
raise NoBrakemanError, 'Cannot find lib/ directory.'
|
|
451
|
+
end
|
|
404
452
|
|
|
405
|
-
|
|
453
|
+
add_external_checks options
|
|
406
454
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
455
|
+
#Start scanning
|
|
456
|
+
scanner = Scanner.new options
|
|
457
|
+
tracker = scanner.tracker
|
|
410
458
|
|
|
411
|
-
|
|
459
|
+
check_for_missing_checks options[:run_checks], options[:skip_checks], options[:enable_checks]
|
|
460
|
+
end
|
|
412
461
|
|
|
413
|
-
|
|
462
|
+
logger.announce "Scanning #{tracker.app_path}"
|
|
414
463
|
scanner.process
|
|
415
464
|
|
|
416
|
-
if options[:parallel_checks]
|
|
417
|
-
notify "Running checks in parallel..."
|
|
418
|
-
else
|
|
419
|
-
notify "Running checks..."
|
|
420
|
-
end
|
|
421
|
-
|
|
422
465
|
tracker.run_checks
|
|
423
466
|
|
|
424
467
|
self.filter_warnings tracker, options
|
|
425
468
|
|
|
426
469
|
if options[:output_files]
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
470
|
+
process_step 'Generating report' do
|
|
471
|
+
write_report_to_files tracker, options[:output_files]
|
|
472
|
+
end
|
|
430
473
|
elsif options[:print_report]
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
474
|
+
process_step 'Generating report' do
|
|
475
|
+
write_report_to_formats tracker, options[:output_formats]
|
|
476
|
+
end
|
|
434
477
|
end
|
|
435
478
|
|
|
436
479
|
tracker
|
|
@@ -449,7 +492,8 @@ module Brakeman
|
|
|
449
492
|
File.open output_file, "w" do |f|
|
|
450
493
|
f.write tracker.report.format(tracker.options[:output_formats][idx])
|
|
451
494
|
end
|
|
452
|
-
|
|
495
|
+
|
|
496
|
+
logger.announce "Report saved in '#{output_file}'"
|
|
453
497
|
end
|
|
454
498
|
end
|
|
455
499
|
private_class_method :write_report_to_files
|
|
@@ -493,12 +537,16 @@ module Brakeman
|
|
|
493
537
|
Rescanner.new(options, tracker.processor, files).recheck
|
|
494
538
|
end
|
|
495
539
|
|
|
496
|
-
def self.
|
|
497
|
-
|
|
540
|
+
def self.announce message
|
|
541
|
+
logger.announce message
|
|
542
|
+
end
|
|
543
|
+
|
|
544
|
+
def self.alert message
|
|
545
|
+
logger.alert message
|
|
498
546
|
end
|
|
499
547
|
|
|
500
548
|
def self.debug message
|
|
501
|
-
|
|
549
|
+
logger.debug message
|
|
502
550
|
end
|
|
503
551
|
|
|
504
552
|
# Compare JSON output from a previous scan and return the diff of the two scans
|
|
@@ -510,7 +558,7 @@ module Brakeman
|
|
|
510
558
|
begin
|
|
511
559
|
previous_results = JSON.parse(File.read(options[:previous_results_json]), :symbolize_names => true)[:warnings]
|
|
512
560
|
rescue JSON::ParserError
|
|
513
|
-
self.
|
|
561
|
+
self.alert "Error parsing comparison file: #{options[:previous_results_json]}"
|
|
514
562
|
exit!
|
|
515
563
|
end
|
|
516
564
|
|
|
@@ -565,6 +613,7 @@ module Brakeman
|
|
|
565
613
|
|
|
566
614
|
def self.filter_warnings tracker, options
|
|
567
615
|
require 'brakeman/report/ignore/config'
|
|
616
|
+
config = nil
|
|
568
617
|
|
|
569
618
|
app_tree = Brakeman::AppTree.from_options(options)
|
|
570
619
|
|
|
@@ -576,16 +625,17 @@ module Brakeman
|
|
|
576
625
|
return
|
|
577
626
|
end
|
|
578
627
|
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
628
|
+
process_step "Filtering warnings..." do
|
|
629
|
+
if options[:interactive_ignore]
|
|
630
|
+
require 'brakeman/report/ignore/interactive'
|
|
631
|
+
logger.cleanup
|
|
632
|
+
config = InteractiveIgnorer.new(file, tracker.warnings).start
|
|
633
|
+
else
|
|
634
|
+
logger.announce "Using '#{file}' to filter warnings"
|
|
635
|
+
config = IgnoreConfig.new(file, tracker.warnings)
|
|
636
|
+
config.read_from_file
|
|
637
|
+
config.filter_ignored
|
|
638
|
+
end
|
|
589
639
|
end
|
|
590
640
|
|
|
591
641
|
tracker.ignored_filter = config
|
|
@@ -615,6 +665,10 @@ module Brakeman
|
|
|
615
665
|
@quiet = val
|
|
616
666
|
end
|
|
617
667
|
|
|
668
|
+
def self.process_step(description, &)
|
|
669
|
+
logger.context(description, &)
|
|
670
|
+
end
|
|
671
|
+
|
|
618
672
|
class DependencyError < RuntimeError; end
|
|
619
673
|
class NoBrakemanError < RuntimeError; end
|
|
620
674
|
class NoApplication < RuntimeError; end
|