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
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# Copied almost verbatim from Rails
|
|
3
|
+
# https://github.com/rails/rails/blob/5359cf8a5b093b04170e884ee8da5a1e076b8a0d/actionview/lib/action_view/template/handlers/erb/erubi.rb#L9
|
|
4
|
+
|
|
5
|
+
Brakeman.load_brakeman_dependency "erubi"
|
|
6
|
+
|
|
7
|
+
module Brakeman
|
|
8
|
+
class Erubi < ::Erubi::Engine
|
|
9
|
+
# :nodoc: all
|
|
10
|
+
def initialize(input, properties = {})
|
|
11
|
+
@newline_pending = 0
|
|
12
|
+
|
|
13
|
+
# Dup properties so that we don't modify argument
|
|
14
|
+
properties = Hash[properties]
|
|
15
|
+
|
|
16
|
+
properties[:bufvar] ||= "@output_buffer"
|
|
17
|
+
properties[:preamble] ||= ""
|
|
18
|
+
properties[:postamble] ||= "#{properties[:bufvar]}"
|
|
19
|
+
|
|
20
|
+
# Tell Erubi whether the template will be compiled with `frozen_string_literal: true`
|
|
21
|
+
# properties[:freeze_template_literals] = !Template.frozen_string_literal
|
|
22
|
+
properties[:freeze_template_literals] = false
|
|
23
|
+
|
|
24
|
+
properties[:escapefunc] = ""
|
|
25
|
+
|
|
26
|
+
super
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
def add_text(text)
|
|
31
|
+
return if text.empty?
|
|
32
|
+
|
|
33
|
+
if text == "\n"
|
|
34
|
+
@newline_pending += 1
|
|
35
|
+
else
|
|
36
|
+
with_buffer do
|
|
37
|
+
src << ".safe_append='"
|
|
38
|
+
src << "\n" * @newline_pending if @newline_pending > 0
|
|
39
|
+
src << text.gsub(/['\\]/, '\\\\\&') << @text_end
|
|
40
|
+
end
|
|
41
|
+
@newline_pending = 0
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
BLOCK_EXPR = /((\s|\))do|\{)(\s*\|[^|]*\|)?\s*\Z/
|
|
46
|
+
|
|
47
|
+
def add_expression(indicator, code)
|
|
48
|
+
flush_newline_if_pending(src)
|
|
49
|
+
|
|
50
|
+
with_buffer do
|
|
51
|
+
if (indicator == "==") || @escape
|
|
52
|
+
src << ".safe_expr_append="
|
|
53
|
+
else
|
|
54
|
+
src << ".append="
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
if BLOCK_EXPR.match?(code)
|
|
58
|
+
src << " " << code
|
|
59
|
+
else
|
|
60
|
+
src << "(" << code << ")"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def add_code(code)
|
|
66
|
+
flush_newline_if_pending(src)
|
|
67
|
+
super
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def add_postamble(_)
|
|
71
|
+
flush_newline_if_pending(src)
|
|
72
|
+
super
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def flush_newline_if_pending(src)
|
|
76
|
+
if @newline_pending > 0
|
|
77
|
+
with_buffer { src << ".safe_append='#{"\n" * @newline_pending}" << @text_end }
|
|
78
|
+
@newline_pending = 0
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -21,7 +21,7 @@ module Brakeman
|
|
|
21
21
|
begin
|
|
22
22
|
src = case type
|
|
23
23
|
when :erb
|
|
24
|
-
type = :
|
|
24
|
+
type = :erubi if erubi?
|
|
25
25
|
parse_erb path, text
|
|
26
26
|
when :haml
|
|
27
27
|
type = :haml6 if haml6?
|
|
@@ -46,17 +46,9 @@ module Brakeman
|
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
def parse_erb path, text
|
|
49
|
-
if
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
Brakeman::Rails3Erubis.new(text, :filename => path).src
|
|
53
|
-
else
|
|
54
|
-
require 'brakeman/parsers/rails2_xss_plugin_erubis'
|
|
55
|
-
Brakeman::Rails2XSSPluginErubis.new(text, :filename => path).src
|
|
56
|
-
end
|
|
57
|
-
elsif tracker.config.erubis?
|
|
58
|
-
require 'brakeman/parsers/rails2_erubis'
|
|
59
|
-
Brakeman::ScannerErubis.new(text, :filename => path).src
|
|
49
|
+
if erubi?
|
|
50
|
+
require 'brakeman/parsers/rails_erubi'
|
|
51
|
+
Brakeman::Erubi.new(text, :filename => path).src
|
|
60
52
|
else
|
|
61
53
|
require 'erb'
|
|
62
54
|
src = if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
|
|
@@ -69,9 +61,9 @@ module Brakeman
|
|
|
69
61
|
end
|
|
70
62
|
end
|
|
71
63
|
|
|
72
|
-
def
|
|
64
|
+
def erubi?
|
|
73
65
|
tracker.config.escape_html? or
|
|
74
|
-
tracker.config.
|
|
66
|
+
tracker.config.erubi?
|
|
75
67
|
end
|
|
76
68
|
|
|
77
69
|
def parse_haml path, text
|
|
@@ -148,7 +140,7 @@ module Brakeman
|
|
|
148
140
|
fp = Brakeman::FileParser.new(tracker.app_tree, tracker.options[:parser_timeout])
|
|
149
141
|
tp = self.new(tracker, fp)
|
|
150
142
|
src = tp.parse_erb '_inline_', text
|
|
151
|
-
type = tp.
|
|
143
|
+
type = tp.erubi? ? :erubi : :erb
|
|
152
144
|
|
|
153
145
|
return type, fp.parse_ruby(src, "_inline_")
|
|
154
146
|
end
|
data/lib/brakeman/processor.rb
CHANGED
|
@@ -65,8 +65,8 @@ module Brakeman
|
|
|
65
65
|
result = HamlTemplateProcessor.new(@tracker, name, called_from, file_name).process src
|
|
66
66
|
when :haml6
|
|
67
67
|
result = Haml6TemplateProcessor.new(@tracker, name, called_from, file_name).process src
|
|
68
|
-
when :
|
|
69
|
-
result =
|
|
68
|
+
when :erubi
|
|
69
|
+
result = ErubiTemplateProcessor.new(@tracker, name, called_from, file_name).process src
|
|
70
70
|
when :slim
|
|
71
71
|
result = SlimTemplateProcessor.new(@tracker, name, called_from, file_name).process src
|
|
72
72
|
else
|
|
@@ -258,12 +258,19 @@ class Brakeman::BaseProcessor < Brakeman::SexpProcessor
|
|
|
258
258
|
#Look for "type" of render in options hash
|
|
259
259
|
#For example, render :file => "blah"
|
|
260
260
|
if hash? last_arg
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
261
|
+
if type
|
|
262
|
+
#The render type was already determined by a positional argument, so a
|
|
263
|
+
#key in the options hash that happens to match a render type name (e.g.
|
|
264
|
+
#`text:`) is a local passed to the partial/action, not a type directive.
|
|
265
|
+
rest = last_arg
|
|
266
|
+
else
|
|
267
|
+
hash_iterate(last_arg) do |key, val|
|
|
268
|
+
if symbol? key and types_in_hash.include? key.value
|
|
269
|
+
type = key.value
|
|
270
|
+
value = val
|
|
271
|
+
else
|
|
272
|
+
rest << key << val
|
|
273
|
+
end
|
|
267
274
|
end
|
|
268
275
|
end
|
|
269
276
|
end
|
|
@@ -146,7 +146,7 @@ class Brakeman::ControllerAliasProcessor < Brakeman::AliasProcessor
|
|
|
146
146
|
filter = tracker.find_method name, @current_class
|
|
147
147
|
|
|
148
148
|
if filter.nil?
|
|
149
|
-
Brakeman.debug "
|
|
149
|
+
Brakeman.debug "Could not find filter #{name}"
|
|
150
150
|
return
|
|
151
151
|
end
|
|
152
152
|
|
|
@@ -30,13 +30,13 @@ class Brakeman::ControllerProcessor < Brakeman::BaseProcessor
|
|
|
30
30
|
#But if not inside a controller already, then the class may include
|
|
31
31
|
#a real controller, so we can't take this shortcut.
|
|
32
32
|
if @current_class and @current_class.name.to_s.end_with? "Controller"
|
|
33
|
-
Brakeman.debug "
|
|
33
|
+
Brakeman.debug "Treating inner class as library: #{name}"
|
|
34
34
|
Brakeman::LibraryProcessor.new(@tracker).process_library exp, @current_file
|
|
35
35
|
return exp
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
if not name.to_s.end_with? "Controller"
|
|
39
|
-
Brakeman.debug "
|
|
39
|
+
Brakeman.debug "Adding noncontroller as library: #{name}"
|
|
40
40
|
#Set the class to be a module in order to get the right namespacing.
|
|
41
41
|
#Add class to libraries, in case it is needed later (e.g. it's used
|
|
42
42
|
#as a parent class for a controller.)
|
|
@@ -124,7 +124,7 @@ class Brakeman::ControllerProcessor < Brakeman::BaseProcessor
|
|
|
124
124
|
if @app_tree.layout_exists?(name)
|
|
125
125
|
@current_class.layout = "layouts/#{name}"
|
|
126
126
|
else
|
|
127
|
-
Brakeman.debug "
|
|
127
|
+
Brakeman.debug "Layout not found: #{name}"
|
|
128
128
|
end
|
|
129
129
|
elsif node_type? last_arg, :nil, :false
|
|
130
130
|
#layout :false or layout nil
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'brakeman/processors/template_processor'
|
|
2
2
|
|
|
3
|
-
#Processes ERB templates using
|
|
4
|
-
class Brakeman::
|
|
3
|
+
#Processes ERB templates using Erubi instead of erb.
|
|
4
|
+
class Brakeman::ErubiTemplateProcessor < Brakeman::TemplateProcessor
|
|
5
5
|
|
|
6
6
|
#s(:call, TARGET, :method, ARGS)
|
|
7
7
|
def process_call exp
|
|
@@ -14,7 +14,7 @@ class Brakeman::ErubisTemplateProcessor < Brakeman::TemplateProcessor
|
|
|
14
14
|
exp.arglist = process exp.arglist
|
|
15
15
|
method = exp.method
|
|
16
16
|
|
|
17
|
-
#_buf is the default output variable for
|
|
17
|
+
#_buf is the default output variable for Erubi
|
|
18
18
|
if node_type?(target, :lvar, :ivar) and (target.value == :_buf or target.value == :@output_buffer)
|
|
19
19
|
if method == :<< or method == :safe_concat
|
|
20
20
|
|
|
@@ -6,7 +6,7 @@ class Brakeman::GemProcessor < Brakeman::BasicProcessor
|
|
|
6
6
|
def initialize *args
|
|
7
7
|
super
|
|
8
8
|
@gem_name_version = /^\s*([-_+.A-Za-z0-9]+) \((\w(\.\w+)*)\)/
|
|
9
|
-
@ruby_version = /^\s+ruby (\d
|
|
9
|
+
@ruby_version = /^\s+ruby (\d+\.\d+\.\d+)/
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def process_gems gem_files
|
|
@@ -33,14 +33,15 @@ class Brakeman::Rails2ConfigProcessor < Brakeman::BasicProcessor
|
|
|
33
33
|
process res
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
#Check if config is set to use Erubis
|
|
36
|
+
# Check if config is set to use Erubis
|
|
37
|
+
# but because it's 2026 we're going to use Erubi
|
|
37
38
|
def process_call exp
|
|
38
39
|
target = exp.target
|
|
39
40
|
target = process target if sexp? target
|
|
40
41
|
|
|
41
42
|
if exp.method == :gem and exp.first_arg.value == "erubis"
|
|
42
|
-
Brakeman.
|
|
43
|
-
@tracker.config.
|
|
43
|
+
Brakeman.debug "[Notice] Using Erubi for ERB templates"
|
|
44
|
+
@tracker.config.erubi = true
|
|
44
45
|
end
|
|
45
46
|
|
|
46
47
|
exp
|
|
@@ -131,7 +131,7 @@ class Brakeman::Rails2RoutesProcessor < Brakeman::BasicProcessor
|
|
|
131
131
|
when :except
|
|
132
132
|
process_option_except value
|
|
133
133
|
else
|
|
134
|
-
Brakeman.
|
|
134
|
+
Brakeman.alert "Unhandled resource option, please report: #{option}"
|
|
135
135
|
end
|
|
136
136
|
end
|
|
137
137
|
end
|
|
@@ -17,6 +17,7 @@ require 'brakeman/processors/lib/basic_processor'
|
|
|
17
17
|
#Values for tracker.config.rails will still be Sexps.
|
|
18
18
|
class Brakeman::Rails3ConfigProcessor < Brakeman::BasicProcessor
|
|
19
19
|
RAILS_CONFIG = Sexp.new(:call, nil, :config)
|
|
20
|
+
RAILS_APPLICATION = Sexp.new(:colon2, s(:const, :Rails), :Application)
|
|
20
21
|
|
|
21
22
|
def initialize *args
|
|
22
23
|
super
|
|
@@ -48,7 +49,7 @@ class Brakeman::Rails3ConfigProcessor < Brakeman::BasicProcessor
|
|
|
48
49
|
|
|
49
50
|
#Look for class Application < Rails::Application
|
|
50
51
|
def process_class exp
|
|
51
|
-
if exp
|
|
52
|
+
if application_class? exp
|
|
52
53
|
@inside_config = true
|
|
53
54
|
process_all exp.body if sexp? exp.body
|
|
54
55
|
@inside_config = false
|
|
@@ -57,6 +58,14 @@ class Brakeman::Rails3ConfigProcessor < Brakeman::BasicProcessor
|
|
|
57
58
|
exp
|
|
58
59
|
end
|
|
59
60
|
|
|
61
|
+
def application_class? exp
|
|
62
|
+
return unless node_type? exp, :class
|
|
63
|
+
|
|
64
|
+
exp.class_name == :Application or
|
|
65
|
+
(node_type? exp.class_name, :colon2 and exp.class_name.rhs == :Application) or
|
|
66
|
+
(exp.parent_name == RAILS_APPLICATION)
|
|
67
|
+
end
|
|
68
|
+
|
|
60
69
|
#Look for configuration settings that
|
|
61
70
|
#are just a call like
|
|
62
71
|
#
|
|
@@ -19,7 +19,9 @@ module Brakeman::RenderHelper
|
|
|
19
19
|
end
|
|
20
20
|
when :default
|
|
21
21
|
begin
|
|
22
|
-
|
|
22
|
+
# exp[2] is either the action name (from controller) or :default when no explicit arg
|
|
23
|
+
name_arg = (exp[2].nil? || exp[2] == :default) ? nil : exp[2]
|
|
24
|
+
process_template template_name(name_arg), exp[3], nil, exp.line
|
|
23
25
|
rescue ArgumentError
|
|
24
26
|
Brakeman.debug "Problem processing render: #{exp}"
|
|
25
27
|
end
|
|
@@ -98,7 +100,7 @@ module Brakeman::RenderHelper
|
|
|
98
100
|
name = name.to_s.gsub(/^\//, "")
|
|
99
101
|
template = @tracker.templates[name.to_sym]
|
|
100
102
|
unless template
|
|
101
|
-
Brakeman.debug "
|
|
103
|
+
Brakeman.debug "No such template: #{name}"
|
|
102
104
|
return
|
|
103
105
|
end
|
|
104
106
|
|
|
@@ -27,7 +27,7 @@ class Brakeman::ModelProcessor < Brakeman::BaseProcessor
|
|
|
27
27
|
|
|
28
28
|
#If inside an inner class we treat it as a library.
|
|
29
29
|
if @current_class
|
|
30
|
-
Brakeman.debug "
|
|
30
|
+
Brakeman.debug "Treating inner class as library: #{name}"
|
|
31
31
|
Brakeman::LibraryProcessor.new(@tracker).process_library exp, @current_file
|
|
32
32
|
return exp
|
|
33
33
|
end
|
|
@@ -107,7 +107,7 @@ module Brakeman
|
|
|
107
107
|
raise e, "\nError[#{e.class}] while reading brakeman ignore file: #{file}\n"
|
|
108
108
|
end
|
|
109
109
|
else
|
|
110
|
-
Brakeman.
|
|
110
|
+
Brakeman.alert "Could not find ignore configuration in #{file} (no file)"
|
|
111
111
|
@already_ignored = []
|
|
112
112
|
end
|
|
113
113
|
|
data/lib/brakeman/scanner.rb
CHANGED
|
@@ -31,8 +31,6 @@ class Brakeman::Scanner
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
@processor = processor || Brakeman::Processor.new(@app_tree, options)
|
|
34
|
-
@show_timing = tracker.options[:debug] || tracker.options[:show_timing]
|
|
35
|
-
@per_file_timing = tracker.options[:debug] && tracker.options[:show_timing]
|
|
36
34
|
end
|
|
37
35
|
|
|
38
36
|
#Returns the Tracker generated from the scan
|
|
@@ -44,32 +42,12 @@ class Brakeman::Scanner
|
|
|
44
42
|
tracker.file_cache
|
|
45
43
|
end
|
|
46
44
|
|
|
47
|
-
def process_step
|
|
48
|
-
Brakeman.
|
|
49
|
-
|
|
50
|
-
if @show_timing
|
|
51
|
-
start_t = Time.now
|
|
52
|
-
yield
|
|
53
|
-
duration = Time.now - start_t
|
|
54
|
-
|
|
55
|
-
Brakeman.notify "(#{description}) Duration: #{duration} seconds"
|
|
56
|
-
else
|
|
57
|
-
yield
|
|
58
|
-
end
|
|
45
|
+
def process_step(description, &)
|
|
46
|
+
Brakeman.process_step(description, &)
|
|
59
47
|
end
|
|
60
48
|
|
|
61
|
-
def process_step_file
|
|
62
|
-
|
|
63
|
-
Brakeman.notify "Processing #{description}"
|
|
64
|
-
|
|
65
|
-
start_t = Time.now
|
|
66
|
-
yield
|
|
67
|
-
duration = Time.now - start_t
|
|
68
|
-
|
|
69
|
-
Brakeman.notify "(#{description}) Duration: #{duration} seconds"
|
|
70
|
-
else
|
|
71
|
-
yield
|
|
72
|
-
end
|
|
49
|
+
def process_step_file(description, &)
|
|
50
|
+
Brakeman.logger.single_context(description, &)
|
|
73
51
|
end
|
|
74
52
|
|
|
75
53
|
#Process everything in the Rails application
|
|
@@ -111,7 +89,7 @@ class Brakeman::Scanner
|
|
|
111
89
|
process_initializers
|
|
112
90
|
end
|
|
113
91
|
|
|
114
|
-
process_step 'Processing
|
|
92
|
+
process_step 'Processing libraries' do
|
|
115
93
|
process_libs
|
|
116
94
|
end
|
|
117
95
|
|
|
@@ -123,7 +101,7 @@ class Brakeman::Scanner
|
|
|
123
101
|
process_templates
|
|
124
102
|
end
|
|
125
103
|
|
|
126
|
-
process_step 'Processing data flow
|
|
104
|
+
process_step 'Processing data flow' do
|
|
127
105
|
process_template_data_flows
|
|
128
106
|
end
|
|
129
107
|
|
|
@@ -135,11 +113,11 @@ class Brakeman::Scanner
|
|
|
135
113
|
process_controllers
|
|
136
114
|
end
|
|
137
115
|
|
|
138
|
-
process_step 'Processing data flow
|
|
116
|
+
process_step 'Processing data flow' do
|
|
139
117
|
process_controller_data_flows
|
|
140
118
|
end
|
|
141
119
|
|
|
142
|
-
process_step 'Indexing
|
|
120
|
+
process_step 'Indexing method calls' do
|
|
143
121
|
index_call_sites
|
|
144
122
|
end
|
|
145
123
|
|
|
@@ -154,6 +132,7 @@ class Brakeman::Scanner
|
|
|
154
132
|
template_parser = Brakeman::TemplateParser.new(tracker, fp)
|
|
155
133
|
|
|
156
134
|
fp.read_files(template_paths) do |path, contents|
|
|
135
|
+
Brakeman.logger.spin
|
|
157
136
|
template_parser.parse_template(path, contents)
|
|
158
137
|
end
|
|
159
138
|
|
|
@@ -167,6 +146,8 @@ class Brakeman::Scanner
|
|
|
167
146
|
detector = Brakeman::FileTypeDetector.new
|
|
168
147
|
|
|
169
148
|
astfiles.each do |file|
|
|
149
|
+
Brakeman.logger.spin
|
|
150
|
+
|
|
170
151
|
if file.is_a? Brakeman::TemplateParser::TemplateFile
|
|
171
152
|
file_cache.add_file file, :template
|
|
172
153
|
else
|
|
@@ -202,12 +183,18 @@ class Brakeman::Scanner
|
|
|
202
183
|
options[:rails3] or options[:escape_html]
|
|
203
184
|
|
|
204
185
|
tracker.config.escape_html = true
|
|
205
|
-
Brakeman.
|
|
186
|
+
Brakeman.debug 'Escaping HTML by default'
|
|
206
187
|
end
|
|
207
188
|
|
|
208
189
|
if @app_tree.exists? ".ruby-version"
|
|
209
|
-
|
|
210
|
-
|
|
190
|
+
contents = @app_tree.file_path(".ruby-version").read
|
|
191
|
+
# Skip alternative Ruby implementations — the EOL dates Brakeman knows
|
|
192
|
+
# about are MRI's, so a `.ruby-version` of "jruby-10.0.2.0" should not
|
|
193
|
+
# be parsed as MRI 0.0.2 / 10.0.2.
|
|
194
|
+
unless contents =~ /\A\s*(jruby|truffleruby|rbx|rubinius|mruby)\b/i
|
|
195
|
+
if version = contents[/(\d+\.\d+\.\d+)/]
|
|
196
|
+
tracker.config.set_ruby_version version, @app_tree.file_path(".ruby-version"), 1
|
|
197
|
+
end
|
|
211
198
|
end
|
|
212
199
|
end
|
|
213
200
|
|
|
@@ -222,7 +209,7 @@ class Brakeman::Scanner
|
|
|
222
209
|
end
|
|
223
210
|
|
|
224
211
|
rescue => e
|
|
225
|
-
Brakeman.
|
|
212
|
+
Brakeman.alert "Error while processing #{path}"
|
|
226
213
|
tracker.error e.exception(e.message + "\nwhile processing #{path}"), e.backtrace
|
|
227
214
|
end
|
|
228
215
|
|
|
@@ -264,7 +251,7 @@ class Brakeman::Scanner
|
|
|
264
251
|
@processor.process_gems gem_files
|
|
265
252
|
end
|
|
266
253
|
rescue => e
|
|
267
|
-
Brakeman.
|
|
254
|
+
Brakeman.alert 'Error while processing Gemfile'
|
|
268
255
|
tracker.error e.exception(e.message + "\nWhile processing Gemfile"), e.backtrace
|
|
269
256
|
end
|
|
270
257
|
|
|
@@ -273,16 +260,16 @@ class Brakeman::Scanner
|
|
|
273
260
|
unless tracker.options[:rails3] or tracker.options[:rails4]
|
|
274
261
|
if @app_tree.exists?("script/rails")
|
|
275
262
|
tracker.options[:rails3] = true
|
|
276
|
-
Brakeman.
|
|
263
|
+
Brakeman.debug 'Detected Rails 3 application'
|
|
277
264
|
elsif @app_tree.exists?("app/channels")
|
|
278
265
|
tracker.options[:rails3] = true
|
|
279
266
|
tracker.options[:rails4] = true
|
|
280
267
|
tracker.options[:rails5] = true
|
|
281
|
-
Brakeman.
|
|
268
|
+
Brakeman.debug 'Detected Rails 5 application'
|
|
282
269
|
elsif not @app_tree.exists?("script")
|
|
283
270
|
tracker.options[:rails3] = true
|
|
284
271
|
tracker.options[:rails4] = true
|
|
285
|
-
Brakeman.
|
|
272
|
+
Brakeman.debug 'Detected Rails 4 application'
|
|
286
273
|
end
|
|
287
274
|
end
|
|
288
275
|
end
|
|
@@ -303,15 +290,10 @@ class Brakeman::Scanner
|
|
|
303
290
|
@processor.process_initializer(init.path, init.ast)
|
|
304
291
|
end
|
|
305
292
|
|
|
306
|
-
#
|
|
307
|
-
#
|
|
308
|
-
#
|
|
293
|
+
# Adds parsed information to tracker.libs.
|
|
294
|
+
# This is a catch-all for any Ruby files that weren't determined
|
|
295
|
+
# to be a specific type of file (like a controller).
|
|
309
296
|
def process_libs
|
|
310
|
-
if options[:skip_libs]
|
|
311
|
-
Brakeman.notify '[Skipping]'
|
|
312
|
-
return
|
|
313
|
-
end
|
|
314
|
-
|
|
315
297
|
libs = file_cache.libs.sort_by { |path, _| path }
|
|
316
298
|
|
|
317
299
|
track_progress libs do |path, lib|
|
|
@@ -335,11 +317,11 @@ class Brakeman::Scanner
|
|
|
335
317
|
if routes_sexp = parse_ruby_file(file)
|
|
336
318
|
@processor.process_routes routes_sexp
|
|
337
319
|
else
|
|
338
|
-
Brakeman.
|
|
320
|
+
Brakeman.alert 'Error while processing routes - assuming all public controller methods are actions.'
|
|
339
321
|
options[:assume_all_routes] = true
|
|
340
322
|
end
|
|
341
323
|
else
|
|
342
|
-
Brakeman.
|
|
324
|
+
Brakeman.alert 'No route information found'
|
|
343
325
|
end
|
|
344
326
|
end
|
|
345
327
|
|
|
@@ -427,15 +409,15 @@ class Brakeman::Scanner
|
|
|
427
409
|
total = list.length
|
|
428
410
|
current = 0
|
|
429
411
|
list.each do |item|
|
|
430
|
-
report_progress current, total
|
|
412
|
+
report_progress current, total
|
|
431
413
|
current += 1
|
|
432
414
|
yield item
|
|
433
415
|
end
|
|
434
416
|
end
|
|
435
417
|
|
|
436
|
-
def report_progress(current, total
|
|
418
|
+
def report_progress(current, total)
|
|
437
419
|
return unless @options[:report_progress]
|
|
438
|
-
|
|
420
|
+
Brakeman.logger.update_progress(current, total)
|
|
439
421
|
end
|
|
440
422
|
|
|
441
423
|
def index_call_sites
|
|
@@ -55,13 +55,23 @@ module Brakeman
|
|
|
55
55
|
if src.node_type == :defs
|
|
56
56
|
@class_methods[name] = meth_info
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
name = :"#{src[1]}.#{name}"
|
|
58
|
+
name = :"#{method_definition_receiver(src[1])}.#{name}"
|
|
60
59
|
end
|
|
61
60
|
|
|
62
61
|
@methods[visibility][name] = meth_info
|
|
63
62
|
end
|
|
64
63
|
|
|
64
|
+
def method_definition_receiver(receiver)
|
|
65
|
+
return receiver if receiver.is_a?(Symbol)
|
|
66
|
+
|
|
67
|
+
case receiver.sexp_type
|
|
68
|
+
when :self
|
|
69
|
+
"self"
|
|
70
|
+
else
|
|
71
|
+
receiver[1].to_s
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
65
75
|
def each_method
|
|
66
76
|
@methods.each do |_vis, meths|
|
|
67
77
|
meths.each do |name, info|
|