50 lines
1.5 KiB
Ruby
50 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'httparty'
|
|
require 'yaml'
|
|
|
|
# Main class for communication with the OpSwat MetaDefender API v4
|
|
class OpswatClient
|
|
# Load the OPSWAT API key from the config file
|
|
API_KEYS = YAML.load_file(File.join(__dir__, '../../config/api_keys.yml'))
|
|
OPSWAT_API_KEY = API_KEYS['opswat']
|
|
BASE_URL = 'https://api.metadefender.com/v4'
|
|
|
|
def self.scan_file(file_path)
|
|
# TODO: Implement file upload and scanning
|
|
# OPSWAT MetaDefender API requires the file to be uploaded for scanning
|
|
# The response will include a data_id which we can use to retrieve the scan results
|
|
response = upload_file(file_path)
|
|
data_id = response['data_id'] # TODO: This is hypothetical; adjust based on actual response structure
|
|
|
|
# Retrieve the scan result using the data_id
|
|
get_scan_result(data_id)
|
|
end
|
|
|
|
# Uploads a file to OPSWAT and returns the response
|
|
# TODO: Make this not just a skeleton
|
|
def self.upload_file(file_path)
|
|
endpoint = "#{BASE_URL}/file"
|
|
headers = {
|
|
'apikey' => OPSWAT_API_KEY
|
|
# Add other necessary CSR headers here
|
|
}
|
|
options = {
|
|
headers:,
|
|
body: { file: File.new(file_path, 'rb') }
|
|
}
|
|
HTTParty.post(endpoint, options)
|
|
end
|
|
|
|
# Retrieves the scan result for a given data_id
|
|
def self.get_scan_result(data_id)
|
|
# TODO: make this more robust
|
|
endpoint = "#{BASE_URL}/file/#{data_id}"
|
|
headers = {
|
|
'apikey' => OPSWAT_API_KEY
|
|
# Add other necessary CSR headers here
|
|
}
|
|
HTTParty.get(endpoint, headers:)
|
|
end
|
|
end
|