From eb518993f36da989e97071eee8ae336e1af700c4 Mon Sep 17 00:00:00 2001 From: aurieh <auriteh@gmail.com> Date: Wed, 14 Dec 2016 15:04:55 +0200 Subject: [PATCH] First version --- .eslintrc.json | 11 +++++++++++ .vscode/settings.json | 3 +++ index.js | 5 +++++ lib/getfile.js | 11 +++++++++++ lib/refreshclam.js | 15 +++++++++++++++ lib/scanner.js | 22 ++++++++++++++++++++++ package.json | 31 +++++++++++++++++++++++++++++++ 7 files changed, 98 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .vscode/settings.json create mode 100644 index.js create mode 100644 lib/getfile.js create mode 100644 lib/refreshclam.js create mode 100644 lib/scanner.js create mode 100644 package.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..67130f7 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "extends": "standard", + "installedESLint": true, + "plugins": [ + "standard", + "promise" + ], + "rules": { + "semi": "always" + } +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a6fb976 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "eslint.enable": true +} \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..d598a77 --- /dev/null +++ b/index.js @@ -0,0 +1,5 @@ +module.exports = { + getFile: require('./lib/getfile'), + scanner: require('./lib/scanner'), + refreshclam: require('./lib/refreshclam') +} \ No newline at end of file diff --git a/lib/getfile.js b/lib/getfile.js new file mode 100644 index 0000000..a10472a --- /dev/null +++ b/lib/getfile.js @@ -0,0 +1,11 @@ +module.exports = function getFile(S3, key) { + return new Promise((resolve, reject) => { + S3.getObject({ + Bucket: `${process.env.SERVICE}-filestore-${process.env.STAGE}-1`, + Key: key + }, (err, file) => { + if (err) return void reject(err); + resolve(file); + }); + }); +} \ No newline at end of file diff --git a/lib/refreshclam.js b/lib/refreshclam.js new file mode 100644 index 0000000..d87d511 --- /dev/null +++ b/lib/refreshclam.js @@ -0,0 +1,15 @@ +const exec = require('child_process').exec; +const debug = require("debug")("scanner"); + +module.exports = function refresh() { + return new Promise((resolve, reject) => { + debug('Updating virus database') + const proc = exec('freshclam', [], {stdio: 'inherit'}); + proc.on('error', reject); + proc.on('exit', code => { + if (code !== 0) return void reject(new Error(`Clamscan exited with code ${code}`)); + debug('Finished updating'); + resolve(); + }) + }); +} \ No newline at end of file diff --git a/lib/scanner.js b/lib/scanner.js new file mode 100644 index 0000000..3128696 --- /dev/null +++ b/lib/scanner.js @@ -0,0 +1,22 @@ +const clam = require('clamscan')(); +const fs = require('fs'); +const path = require('path'); +const getFile = require('./getfile'); + +module.exports = function scanFile(notif, S3) { + return new Promise((resolve, reject) => { + const key = notif.Records[0].s3.object.key; + getFile(S3, key).then(file => { + const filepath = path.resolve(path.join(__dirname, '/files/', key)); + fs.writeFile(filepath, file.body, (err) => { + if (err) return void reject(err); + clam.is_infected(filepath, (err, _, is_infected) => { + fs.unlink(filepath, (unlinkErr) => { + if (err || unlinkErr) return void reject(err || unlinkErr); + resolve({infected: is_infected}); + }); + }); + }); + }, reject); + }); +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..030bd75 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "whats-a-virus", + "version": "0.0.1", + "description": "Whats this, a virus? Scanner built for whats-th.is file uploader.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/whats-this/scanner.git" + }, + "keywords": [ + "av", + "antivirus", + "clamscan", + "clamav" + ], + "author": "aurieh", + "license": "MIT", + "bugs": { + "url": "https://github.com/whats-this/scanner/issues" + }, + "homepage": "https://github.com/whats-this/scanner#readme", + "devDependencies": { + "eslint": "^3.12.1", + "eslint-config-standard": "^6.2.1", + "eslint-plugin-promise": "^3.4.0", + "eslint-plugin-standard": "^2.0.1" + } +} -- GitLab