const utils = require('.');
const log = require('./log').create_logger("Clamscan");
const mailgun = require('./mailgun');
let clamscan;
module.exports = {
init: function(no_scan) {
if (no_scan) {
log.v("clamscan not loaded");
return utils.resolve();
}
const NodeClam = require('clamscan');
const ClamScan = new NodeClam().init({
// https://github.com/kylefarris/clamscan#getting-started
remove_infected: true,
quarantine_infected: false,
debug_mode: true,
scan_recursively: true,
clamscan: {
path: '/usr/bin/clamscan',
db: null,
scan_archives: true,
active: true
},
clamdscan: {
active: false
}
});
return ClamScan.then(function(new_clamscan) {
clamscan = new_clamscan;
return clamscan.get_version();
}).then(function(version) {
log.general.info(`ClamAV Version: ${version}`);
}).catch(function(error) {
log.general.error(error);
});
},
assert_safe: function(file_path, infos) {
if (!clamscan) {
log.v("File is safe - clamscan not loaded");
return utils.resolve();
}
return clamscan.is_infected(file_path).then(function(scan_result) {
return new Promise(function(resolve, reject) {
if (scan_result.is_infected) {
log.general.warning(`${scan_result.file} is infected with ${scan_result.viruses.join(', ')}.`);
reject(`Detected malicious file. This incident will be reported`);
mailgun.send_virus_detected_email(process.env.INCIDENT_EMAIL, {
ip: infos.ip,
user_id: infos.user_id,
file: file_path,
viruses: scan_result.viruses.join(', ')
}).catch(log.general.error);
} else {
resolve();
}
});
});
}
};