50 lines
1,019 B
Ruby
50 lines
1,019 B
Ruby
class ActiveStorage::VirusScanner
|
|
include ActiveStorage::Downloading
|
|
|
|
def initialize(blob)
|
|
@blob = blob
|
|
end
|
|
|
|
attr_reader :blob
|
|
|
|
PENDING = 'pending'
|
|
INFECTED = 'infected'
|
|
SAFE = 'safe'
|
|
|
|
def pending?
|
|
blob.metadata[:virus_scan_result] == PENDING
|
|
end
|
|
|
|
def infected?
|
|
blob.metadata[:virus_scan_result] == INFECTED
|
|
end
|
|
|
|
def safe?
|
|
blob.metadata[:virus_scan_result] == SAFE
|
|
end
|
|
|
|
def analyzed?
|
|
blob.metadata[:virus_scan_result].present?
|
|
end
|
|
|
|
def analyze_later
|
|
if !analyzed?
|
|
blob.update!(metadata: blob.metadata.merge(virus_scan_result: PENDING))
|
|
VirusScannerJob.perform_later(blob)
|
|
end
|
|
end
|
|
|
|
def metadata
|
|
begin
|
|
download_blob_to_tempfile do |file|
|
|
if ClamavService.safe_file?(file.path)
|
|
{ virus_scan_result: SAFE, scanned_at: Time.zone.now }
|
|
else
|
|
{ virus_scan_result: INFECTED, scanned_at: Time.zone.now }
|
|
end
|
|
end
|
|
rescue StandardError => e
|
|
Raven.capture_exception(e)
|
|
end
|
|
end
|
|
end
|