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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/vigilion-rails.rb', line 10
def scan_file column, options={}
default = { scan_column: "#{column}_scan_results", integration: Vigilion::Configuration.integration }
options = default.merge(options)
integration_class = "VigilionRails::#{options[:integration].to_s.camelize}Integration"
class_eval <<-RUBY, __FILE__, __LINE__+1
def scan_#{column}!
key = { model: self.class.name, column: '#{column}', id: id }.to_json
if Vigilion::Configuration.loopback
logger.info 'vigilion scan request was simulated'
self.class.find(id).on_scan_#{column} status: Vigilion::Configuration.loopback_response
else
if Vigilion::Configuration.active_job
::VigilionRails::VigilionScanJob.set(wait: 60).perform_later(#{integration_class}.to_s, self.class.name, id, key, '#{column}')
else
#{integration_class}.new.scan key, self, :#{column}
end
self.class.find(id).send('on_scan_#{column}', status: PENDING_STATUS)
end
@#{column}_old_url = #{column}.url
return true
end
# Vigilion service callback
def on_scan_#{column} params
update_attribute('#{options[:scan_column]}', params[:status])
end
after_initialize :remember_#{column}_url
after_commit :check_scan_#{column}, on: [:create, :update]
def remember_#{column}_url
@#{column}_old_url = #{column}.try(:url) unless new_record?
end
def check_scan_#{column}
if @#{column}_old_url != #{column}.url
scan_#{column}!
end
end
def clean?
#{options[:scan_column]} == "clean"
end
RUBY
end
|