127.0.0.1:8000 watch-together / master server / utils / clamscan.js
master

Tree @master (Download .tar.gz)

clamscan.js @masterraw · history · blame

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();
                }
            });
        });
    }
};