Class: Brakeman::ErubiTemplateProcessor

Inherits:
TemplateProcessor
  • Object
show all
Defined in:
lib/brakeman/processors/erubi_template_procesor.rb

Overview

Processes ERB templates using Erubi instead of erb.

Instance Method Summary collapse

Instance Method Details

#process_attrasgn(exp) ⇒ Object

Look for assignments to output buffer that look like this: @output_buffer.append = some_output @output_buffer.safe_append = some_output @output_buffer.safe_expr_append = some_output



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/brakeman/processors/erubi_template_procesor.rb', line 63

def process_attrasgn exp
  if exp.target.node_type == :ivar and exp.target.value == :@output_buffer
    if append_method?(exp.method)
      exp.first_arg = process(exp.first_arg)
      arg = normalize_output(exp.first_arg)

      if arg.node_type == :str
        ignore
      elsif safe_append_method?(exp.method)
        add_output arg
      else
        add_escaped_output arg
      end
    else
      super
    end
  else
    super
  end
end

#process_block(exp) ⇒ Object

Process blocks, ignoring :ignore exps



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/brakeman/processors/erubi_template_procesor.rb', line 43

def process_block exp
  exp = exp.dup
  exp.shift
  exp.map! do |e|
    res = process e
    if res.empty? or res == ignore
      nil
    else
      res
    end
  end
  block = Sexp.new(:rlist).concat(exp).compact
  block.line(exp.line)
  block
end

#process_call(exp) ⇒ Object

s(:call, TARGET, :method, ARGS)



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/brakeman/processors/erubi_template_procesor.rb', line 7

def process_call exp
  target = exp.target
  if sexp? target
    target = process target
  end

  exp.target = target
  exp.arglist = process exp.arglist
  method = exp.method

  #_buf is the default output variable for Erubi
  if node_type?(target, :lvar, :ivar) and (target.value == :_buf or target.value == :@output_buffer)
    if method == :<< or method == :safe_concat

      arg = normalize_output(exp.first_arg)

      if arg.node_type == :str #ignore plain strings
        ignore
      elsif node_type? target, :ivar and target.value == :@output_buffer
        add_escaped_output arg
      else
        add_output arg
      end
    elsif method == :to_s
      ignore
    else
      abort "Unrecognized action on buffer: #{method}"
    end
  elsif target == nil and method == :render
    make_render_in_view exp
  else
    exp
  end
end