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.
Files changed (271) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +48 -0
  3. data/README.md +1 -1
  4. data/bundle/load.rb +7 -7
  5. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/NEWS.md +39 -1
  6. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/README.md +1 -1
  7. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/parser.rb +7 -2
  8. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/row.rb +26 -2
  9. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/version.rb +1 -1
  10. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv.rb +30 -58
  11. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/CHANGELOG +111 -0
  12. data/bundle/ruby/3.2.0/gems/{erubis-2.7.0 → erubi-1.13.1}/MIT-LICENSE +1 -0
  13. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/README.rdoc +151 -0
  14. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi/capture_block.rb +91 -0
  15. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi/capture_end.rb +58 -0
  16. data/bundle/ruby/3.2.0/gems/erubi-1.13.1/lib/erubi.rb +299 -0
  17. data/bundle/ruby/3.2.0/gems/parallel-1.28.0/lib/parallel/version.rb +4 -0
  18. data/bundle/ruby/3.2.0/gems/{parallel-1.27.0 → parallel-1.28.0}/lib/parallel.rb +11 -0
  19. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/io/ansi.rb +6 -4
  20. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/io/windows.rb +49 -23
  21. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/io.rb +8 -2
  22. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/line_editor.rb +49 -21
  23. data/bundle/ruby/3.2.0/gems/reline-0.7.0/lib/reline/version.rb +3 -0
  24. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline.rb +10 -9
  25. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/CHANGES +8 -2
  26. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/Gemfile +5 -2
  27. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/LICENSE +1 -1
  28. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/README.jp.md +10 -12
  29. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/README.md +21 -26
  30. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/embedded.rb +1 -1
  31. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/logic_less/context.rb +4 -3
  32. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/splat/builder.rb +18 -19
  33. data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/version.rb +1 -1
  34. data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/CHANGES +8 -0
  35. data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/README.md +1 -1
  36. data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/static_analyzer.rb +1 -1
  37. data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/string_splitter.rb +61 -5
  38. data/bundle/ruby/3.2.0/gems/temple-0.10.6/lib/temple/parser_engine.rb +34 -0
  39. data/bundle/ruby/3.2.0/gems/temple-0.10.6/lib/temple/static_analyzer.rb +148 -0
  40. data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/version.rb +1 -1
  41. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/COPYING +1 -1
  42. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/asciidoc.rb +12 -5
  43. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/babel.rb +5 -0
  44. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/builder.rb +4 -0
  45. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/coffee.rb +14 -4
  46. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/commonmarker.rb +65 -0
  47. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/csv.rb +63 -0
  48. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/erb.rb +130 -0
  49. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/erubi.rb +41 -8
  50. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/etanni.rb +7 -0
  51. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/haml.rb +67 -1
  52. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/kramdown.rb +59 -0
  53. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/liquid.rb +93 -0
  54. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/livescript.rb +11 -4
  55. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/mapping.rb +8 -8
  56. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/markaby.rb +11 -2
  57. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/nokogiri.rb +13 -2
  58. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/pandoc.rb +81 -0
  59. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/pipeline.rb +6 -1
  60. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/plain.rb +5 -1
  61. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/prawn.rb +17 -6
  62. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/radius.rb +96 -0
  63. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rdiscount.rb +82 -0
  64. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rdoc.rb +41 -0
  65. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/redcarpet.rb +73 -0
  66. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/redcloth.rb +40 -0
  67. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/rst-pandoc.rb +33 -0
  68. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/sass.rb +16 -3
  69. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/slim.rb +18 -0
  70. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/string.rb +10 -2
  71. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/template.rb +5 -5
  72. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/typescript.rb +5 -0
  73. data/bundle/ruby/3.2.0/gems/tilt-2.8.0/lib/tilt/yajl.rb +91 -0
  74. data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt.rb +1 -2
  75. data/lib/brakeman/app_tree.rb +7 -2
  76. data/lib/brakeman/checks/check_eol_rails.rb +2 -1
  77. data/lib/brakeman/checks/check_eol_ruby.rb +1 -0
  78. data/lib/brakeman/checks/check_execute.rb +23 -19
  79. data/lib/brakeman/checks/check_model_attributes.rb +1 -1
  80. data/lib/brakeman/checks/check_render.rb +1 -27
  81. data/lib/brakeman/checks/check_render_rce.rb +43 -0
  82. data/lib/brakeman/checks/check_session_settings.rb +1 -1
  83. data/lib/brakeman/checks/check_sql.rb +4 -3
  84. data/lib/brakeman/checks.rb +31 -25
  85. data/lib/brakeman/commandline.rb +17 -5
  86. data/lib/brakeman/file_parser.rb +3 -2
  87. data/lib/brakeman/logger.rb +265 -0
  88. data/lib/brakeman/options.rb +6 -11
  89. data/lib/brakeman/parsers/rails_erubi.rb +82 -0
  90. data/lib/brakeman/parsers/template_parser.rb +7 -15
  91. data/lib/brakeman/processor.rb +2 -2
  92. data/lib/brakeman/processors/base_processor.rb +13 -6
  93. data/lib/brakeman/processors/controller_alias_processor.rb +1 -1
  94. data/lib/brakeman/processors/controller_processor.rb +3 -3
  95. data/lib/brakeman/processors/{erubis_template_processor.rb → erubi_template_procesor.rb} +3 -3
  96. data/lib/brakeman/processors/gem_processor.rb +1 -1
  97. data/lib/brakeman/processors/haml_template_processor.rb +3 -1
  98. data/lib/brakeman/processors/lib/rails2_config_processor.rb +4 -3
  99. data/lib/brakeman/processors/lib/rails2_route_processor.rb +1 -1
  100. data/lib/brakeman/processors/lib/rails3_config_processor.rb +10 -1
  101. data/lib/brakeman/processors/lib/render_helper.rb +4 -2
  102. data/lib/brakeman/processors/lib/render_path.rb +1 -1
  103. data/lib/brakeman/processors/model_processor.rb +1 -1
  104. data/lib/brakeman/report/ignore/config.rb +1 -1
  105. data/lib/brakeman/scanner.rb +33 -51
  106. data/lib/brakeman/tracker/collection.rb +12 -2
  107. data/lib/brakeman/tracker/config.rb +17 -13
  108. data/lib/brakeman/tracker/constants.rb +17 -2
  109. data/lib/brakeman/tracker/controller.rb +1 -1
  110. data/lib/brakeman/tracker.rb +7 -15
  111. data/lib/brakeman/version.rb +1 -1
  112. data/lib/brakeman.rb +109 -55
  113. metadata +182 -210
  114. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/CHANGES.txt +0 -828
  115. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/README.txt +0 -102
  116. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/contrib/erubis +0 -3468
  117. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/contrib/erubis-run.rb +0 -132
  118. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/contrib/inline-require +0 -179
  119. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/context.rb +0 -83
  120. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/converter.rb +0 -357
  121. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ec.rb +0 -117
  122. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ecpp.rb +0 -113
  123. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ejava.rb +0 -110
  124. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ejavascript.rb +0 -119
  125. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/enhanced.rb +0 -126
  126. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/eperl.rb +0 -95
  127. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/ephp.rb +0 -99
  128. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/eruby.rb +0 -125
  129. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/escheme.rb +0 -114
  130. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine/optimized.rb +0 -127
  131. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/engine.rb +0 -120
  132. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/enhancer.rb +0 -723
  133. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/error.rb +0 -23
  134. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb +0 -88
  135. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/generator.rb +0 -85
  136. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/helper.rb +0 -47
  137. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_form_helper.rb +0 -197
  138. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/helpers/rails_helper.rb +0 -353
  139. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/local-setting.rb +0 -9
  140. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/main.rb +0 -516
  141. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/preprocessing.rb +0 -58
  142. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/tiny.rb +0 -144
  143. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis/util.rb +0 -22
  144. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/lib/erubis.rb +0 -73
  145. data/bundle/ruby/3.2.0/gems/erubis-2.7.0/setup.rb +0 -1331
  146. data/bundle/ruby/3.2.0/gems/parallel-1.27.0/lib/parallel/version.rb +0 -4
  147. data/bundle/ruby/3.2.0/gems/reline-0.6.3/lib/reline/version.rb +0 -3
  148. data/bundle/ruby/3.2.0/gems/temple-0.10.4/lib/temple/static_analyzer.rb +0 -78
  149. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/creole.rb +0 -16
  150. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/csv.rb +0 -53
  151. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/erb.rb +0 -65
  152. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/kramdown.rb +0 -13
  153. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/liquid.rb +0 -37
  154. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/pandoc.rb +0 -39
  155. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/radius.rb +0 -41
  156. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/rdiscount.rb +0 -23
  157. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/rdoc.rb +0 -11
  158. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/redcarpet.rb +0 -31
  159. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/redcloth.rb +0 -13
  160. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/rst-pandoc.rb +0 -10
  161. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/slim.rb +0 -5
  162. data/bundle/ruby/3.2.0/gems/tilt-2.6.1/lib/tilt/yajl.rb +0 -81
  163. data/lib/brakeman/parsers/erubis_patch.rb +0 -11
  164. data/lib/brakeman/parsers/rails2_erubis.rb +0 -9
  165. data/lib/brakeman/parsers/rails2_xss_plugin_erubis.rb +0 -52
  166. data/lib/brakeman/parsers/rails3_erubis.rb +0 -85
  167. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/LICENSE.txt +0 -0
  168. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/core_ext/array.rb +0 -0
  169. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/core_ext/string.rb +0 -0
  170. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/fields_converter.rb +0 -0
  171. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/input_record_separator.rb +0 -0
  172. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/table.rb +0 -0
  173. data/bundle/ruby/3.2.0/gems/{csv-3.3.5 → csv-3.3.6}/lib/csv/writer.rb +0 -0
  174. data/bundle/ruby/3.2.0/gems/{parallel-1.27.0 → parallel-1.28.0}/MIT-LICENSE.txt +0 -0
  175. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/BSDL +0 -0
  176. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/COPYING +0 -0
  177. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/README.md +0 -0
  178. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/config.rb +0 -0
  179. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/face.rb +0 -0
  180. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/history.rb +0 -0
  181. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/io/dumb.rb +0 -0
  182. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/base.rb +0 -0
  183. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/composite.rb +0 -0
  184. data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/emacs.rb +2 -2
  185. /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/vi_command.rb +0 -0
  186. /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor/vi_insert.rb +0 -0
  187. /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_actor.rb +0 -0
  188. /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/key_stroke.rb +0 -0
  189. /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/kill_ring.rb +0 -0
  190. /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/unicode/east_asian_width.rb +0 -0
  191. /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/lib/reline/unicode.rb +0 -0
  192. /data/bundle/ruby/3.2.0/gems/{reline-0.6.3 → reline-0.7.0}/license_of_rb-readline +0 -0
  193. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/code_attributes.rb +0 -0
  194. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/command.rb +0 -0
  195. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/controls.rb +0 -0
  196. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/do_inserter.rb +0 -0
  197. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/end_inserter.rb +0 -0
  198. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/engine.rb +0 -0
  199. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/erb_converter.rb +0 -0
  200. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/filter.rb +0 -0
  201. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/grammar.rb +0 -0
  202. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/include.rb +0 -0
  203. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/interpolation.rb +0 -0
  204. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/logic_less/filter.rb +0 -0
  205. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/logic_less.rb +0 -0
  206. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/parser.rb +0 -0
  207. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/railtie.rb +0 -0
  208. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/smart/escaper.rb +0 -0
  209. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/smart/filter.rb +0 -0
  210. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/smart/parser.rb +0 -0
  211. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/smart.rb +0 -0
  212. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/splat/filter.rb +0 -0
  213. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/template.rb +0 -0
  214. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim/translator.rb +0 -0
  215. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/lib/slim.rb +0 -0
  216. /data/bundle/ruby/3.2.0/gems/{slim-5.2.1 → slim-5.2.2}/slim.gemspec +0 -0
  217. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/EXPRESSIONS.md +0 -0
  218. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/Gemfile +0 -0
  219. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/LICENSE +0 -0
  220. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/engine.rb +0 -0
  221. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/erb/engine.rb +0 -0
  222. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/erb/parser.rb +0 -0
  223. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/erb/template.rb +0 -0
  224. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/erb/trimming.rb +0 -0
  225. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/exceptions.rb +0 -0
  226. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filter.rb +0 -0
  227. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/ambles.rb +0 -0
  228. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/code_merger.rb +0 -0
  229. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/control_flow.rb +0 -0
  230. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/dynamic_inliner.rb +0 -0
  231. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/dynamic_merger.rb +0 -0
  232. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/encoding.rb +0 -0
  233. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/eraser.rb +0 -0
  234. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/escapable.rb +0 -0
  235. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/multi_flattener.rb +0 -0
  236. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/remove_bom.rb +0 -0
  237. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/static_merger.rb +0 -0
  238. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/filters/validator.rb +0 -0
  239. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generator.rb +0 -0
  240. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/array.rb +0 -0
  241. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/array_buffer.rb +0 -0
  242. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/erb.rb +0 -0
  243. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/rails_output_buffer.rb +0 -0
  244. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/generators/string_buffer.rb +0 -0
  245. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/grammar.rb +0 -0
  246. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/attribute_merger.rb +0 -0
  247. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/attribute_remover.rb +0 -0
  248. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/attribute_sorter.rb +0 -0
  249. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/dispatcher.rb +0 -0
  250. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/fast.rb +0 -0
  251. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/filter.rb +0 -0
  252. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/pretty.rb +0 -0
  253. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/html/safe.rb +0 -0
  254. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/map.rb +0 -0
  255. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/dispatcher.rb +0 -0
  256. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/engine_dsl.rb +0 -0
  257. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/grammar_dsl.rb +0 -0
  258. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/options.rb +0 -0
  259. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/mixins/template.rb +0 -0
  260. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/parser.rb +0 -0
  261. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/templates/rails.rb +0 -0
  262. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/templates/tilt.rb +0 -0
  263. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/templates.rb +0 -0
  264. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple/utils.rb +0 -0
  265. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/lib/temple.rb +0 -0
  266. /data/bundle/ruby/3.2.0/gems/{temple-0.10.4 → temple-0.10.6}/temple.gemspec +0 -0
  267. /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/_emacs_org.rb +0 -0
  268. /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/_handlebars.rb +0 -0
  269. /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/_jbuilder.rb +0 -0
  270. /data/bundle/ruby/3.2.0/gems/{tilt-2.6.1 → tilt-2.8.0}/lib/tilt/_org.rb +0 -0
  271. /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 :erubis, :escape_html
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
- @erubis = nil
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 erubis?
32
- @erubis
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
- Brakeman.notify "[Notice] Detected Rails 3 application"
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
- Brakeman.notify "[Notice] Detected Rails 4 application"
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
- Brakeman.notify "[Notice] Detected Rails 5 application"
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
- Brakeman.notify "[Notice] Detected Rails 6 application"
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
- Brakeman.notify "[Notice] Detected Rails 7 application"
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
- Brakeman.notify "[Notice] Detected Rails 8 application"
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.notify "[Notice] Escaping HTML by default"
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 "[Notice] Skipping config setting: #{path.map(&:to_s).join(".")}"
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.debug "[Notice] Unknown version: #{tracker.config.rails[:load_defaults]}"
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 "[Notice] Unknown before_filter value: #{option} => #{value}"
135
+ Brakeman.debug "Unknown before_filter value: #{option} => #{value}"
136
136
  end
137
137
  end
138
138
  else
@@ -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 in controllers and models.
104
+ #Iterate over all methods
105
105
  def each_method
106
- classes = [self.controllers, self.models]
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
- classes = [self.controllers, self.models]
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
@@ -1,3 +1,3 @@
1
1
  module Brakeman
2
- Version = "7.1.2"
2
+ Version = "8.0.6"
3
3
  end
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.debug "[Notice] Asked to use Prism, but failed to load: #{e}"
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
- notify "[Notice] Ignoring additional check paths in config file. Use --allow-check-paths-in-config to allow" unless (options[:quiet] || quiet)
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
- # notify if options[:quiet] and quiet is nil||false
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
- notify "[Notice] Empty configuration file: #{config}" unless quiet
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
- notify "Output configuration to #{file}"
410
+
411
+ announce "Output configuration to #{file}"
381
412
  else
382
- notify YAML.dump(options)
413
+ $stdout.puts YAML.dump(options)
383
414
  end
384
415
  end
385
416
 
386
- def self.ensure_latest
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.latest_version_for('brakeman').to_s
389
- if current != latest
390
- "Brakeman #{current} is not the latest version #{latest}"
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
- notify "Loading scanner..."
444
+ scanner, tracker = nil
398
445
 
399
- begin
400
- require 'brakeman/scanner'
401
- rescue LoadError
402
- raise NoBrakemanError, "Cannot find lib/ directory."
403
- end
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
- add_external_checks options
453
+ add_external_checks options
406
454
 
407
- #Start scanning
408
- scanner = Scanner.new options
409
- tracker = scanner.tracker
455
+ #Start scanning
456
+ scanner = Scanner.new options
457
+ tracker = scanner.tracker
410
458
 
411
- check_for_missing_checks options[:run_checks], options[:skip_checks], options[:enable_checks]
459
+ check_for_missing_checks options[:run_checks], options[:skip_checks], options[:enable_checks]
460
+ end
412
461
 
413
- notify "Processing application in #{tracker.app_path}"
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
- notify "Generating report..."
428
-
429
- write_report_to_files tracker, options[:output_files]
470
+ process_step 'Generating report' do
471
+ write_report_to_files tracker, options[:output_files]
472
+ end
430
473
  elsif options[:print_report]
431
- notify "Generating report..."
432
-
433
- write_report_to_formats tracker, options[:output_formats]
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
- notify "Report saved in '#{output_file}'"
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.notify message
497
- $stderr.puts message unless @quiet
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
- $stderr.puts message if @debug
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.notify "Error parsing comparison file: #{options[:previous_results_json]}"
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
- notify "Filtering warnings..."
580
-
581
- if options[:interactive_ignore]
582
- require 'brakeman/report/ignore/interactive'
583
- config = InteractiveIgnorer.new(file, tracker.warnings).start
584
- else
585
- notify "[Notice] Using '#{file}' to filter warnings"
586
- config = IgnoreConfig.new(file, tracker.warnings)
587
- config.read_from_file
588
- config.filter_ignored
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