ddr-antivirus 2.0.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +8 -4
- data/lib/ddr/antivirus/adapters/clamd_scanner_adapter.rb +26 -34
- data/lib/ddr/antivirus/version.rb +1 -1
- data/spec/fixtures/clean.txt +1 -0
- data/spec/integration/clamd_spec.rb +20 -0
- data/spec/unit/clamd_scanner_adapter_spec.rb +17 -27
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e2dc2816bc43d784563002fecfa27809184e0e7
|
4
|
+
data.tar.gz: f662098335165f8b839dde9af1540901fbcb412e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 296903f26f411e4638f61a27782b5a6f2fd5c4d654d0c5edec1bfab8de6846c8fdd0156efdd5d302bd85135d31c7f097fd9c679bcc706e394ee740460f3812cd
|
7
|
+
data.tar.gz: d88a0465de7c6d7de55827de7b8264ba808ca3e1d1ec9ad5f28e5b728de9a2771d19b706ce5945d0084f0a989f3c84893d27786c35e422b3996cdefc51815eb2
|
data/.travis.yml
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
-
sudo: false
|
2
1
|
language: ruby
|
3
2
|
rvm:
|
4
|
-
- 2.1
|
5
|
-
- 2.2
|
3
|
+
- 2.1.5
|
6
4
|
cache:
|
7
5
|
- bundler
|
8
|
-
|
6
|
+
- apt
|
7
|
+
before_install:
|
8
|
+
- sudo apt-get update -qq
|
9
|
+
- sudo apt-get install -y clamav-daemon
|
10
|
+
before_script:
|
11
|
+
- sudo freshclam -v
|
12
|
+
- sudo /etc/init.d/clamav-daemon start
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require "open3"
|
2
1
|
require "fileutils"
|
3
2
|
require "shellwords"
|
4
3
|
|
@@ -9,11 +8,14 @@ module Ddr::Antivirus
|
|
9
8
|
class ClamdScannerAdapter < ScannerAdapter
|
10
9
|
|
11
10
|
SCANNER = "clamdscan".freeze
|
11
|
+
CONFIG = "clamconf".freeze
|
12
|
+
|
13
|
+
MAX_FILE_SIZE_RE = Regexp.new('^MaxFileSize = "(\d+)"')
|
12
14
|
|
13
15
|
def scan(path)
|
14
|
-
output,
|
16
|
+
output, exitcode = clamdscan(path)
|
15
17
|
result = ScanResult.new(path, output, version: version, scanned_at: Time.now.utc)
|
16
|
-
case
|
18
|
+
case exitcode
|
17
19
|
when 0
|
18
20
|
result
|
19
21
|
when 1
|
@@ -24,21 +26,31 @@ module Ddr::Antivirus
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def clamdscan(path)
|
27
|
-
make_readable(path) do
|
28
|
-
command(path)
|
29
|
+
output = make_readable(path) do
|
30
|
+
command "--fdpass", safe_path(path)
|
29
31
|
end
|
32
|
+
[ output, $?.exitstatus ]
|
30
33
|
end
|
31
34
|
|
32
35
|
def version
|
33
|
-
|
34
|
-
|
36
|
+
@version ||= command("-V").strip
|
37
|
+
end
|
38
|
+
|
39
|
+
def config
|
40
|
+
@config ||= `#{CONFIG}`
|
41
|
+
end
|
42
|
+
|
43
|
+
def max_file_size
|
44
|
+
if m = MAX_FILE_SIZE_RE.match(config)
|
45
|
+
m[1]
|
46
|
+
end
|
35
47
|
end
|
36
48
|
|
37
49
|
private
|
38
50
|
|
39
|
-
def command(
|
40
|
-
|
41
|
-
|
51
|
+
def command(*args)
|
52
|
+
cmd = args.dup.unshift(SCANNER).join(" ")
|
53
|
+
`#{cmd}`
|
42
54
|
end
|
43
55
|
|
44
56
|
def make_readable(path)
|
@@ -46,38 +58,18 @@ module Ddr::Antivirus
|
|
46
58
|
original = File.stat(path).mode # raises Errno::ENOENT
|
47
59
|
if !File.world_readable?(path)
|
48
60
|
changed = FileUtils.chmod("a+r", path)
|
49
|
-
logger.
|
61
|
+
logger.debug "#{self.class} - File \"#{path}\" made world-readable."
|
50
62
|
end
|
51
63
|
result = yield
|
52
64
|
if changed
|
53
65
|
FileUtils.chmod(original, path)
|
54
|
-
logger.
|
66
|
+
logger.debug "#{self.class} - Mode on file \"#{path}\" reset to original: #{original}."
|
55
67
|
end
|
56
68
|
result
|
57
69
|
end
|
58
70
|
|
59
|
-
|
60
|
-
|
61
|
-
# Result of a scan with the ClamdScannerAdapter
|
62
|
-
# @api private
|
63
|
-
class ClamdScanResult < ScanResult
|
64
|
-
|
65
|
-
def virus_found
|
66
|
-
if m = /: ([^\s]+) FOUND$/.match(output)
|
67
|
-
m[1]
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def ok?
|
72
|
-
status.exitstatus == 0
|
73
|
-
end
|
74
|
-
|
75
|
-
def has_virus?
|
76
|
-
status.exitstatus == 1
|
77
|
-
end
|
78
|
-
|
79
|
-
def error?
|
80
|
-
status.exitstatus == 2
|
71
|
+
def safe_path(path)
|
72
|
+
Shellwords.shellescape(path)
|
81
73
|
end
|
82
74
|
|
83
75
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
I'm clean!
|
@@ -0,0 +1,20 @@
|
|
1
|
+
RSpec.describe "ClamAV support using clamd" do
|
2
|
+
|
3
|
+
let(:clean_file) { File.expand_path(File.join("..", "..", "fixtures", "clean.txt"), __FILE__) }
|
4
|
+
|
5
|
+
before do
|
6
|
+
@adapter = Ddr::Antivirus.scanner_adapter
|
7
|
+
Ddr::Antivirus.scanner_adapter = :clamd
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
Ddr::Antivirus.scanner_adapter = @adapter
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "on the clean file" do
|
15
|
+
it "doesn't raise an error" do
|
16
|
+
expect { Ddr::Antivirus.scan(clean_file) }.not_to raise_error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
require "tempfile"
|
2
|
+
require "fileutils"
|
2
3
|
require "ddr/antivirus/adapters/clamd_scanner_adapter"
|
3
4
|
|
4
5
|
module Ddr::Antivirus
|
5
6
|
RSpec.describe ClamdScannerAdapter do
|
6
7
|
|
7
|
-
let(:path) { File.expand_path(File.join("..", "..", "fixtures", "blue-devil.png"), __FILE__) }
|
8
|
-
|
9
8
|
before do
|
10
9
|
allow(subject).to receive(:version) { "version" }
|
11
10
|
end
|
@@ -15,57 +14,48 @@ module Ddr::Antivirus
|
|
15
14
|
@file = Tempfile.new("test")
|
16
15
|
@file.write("Scan me!")
|
17
16
|
@file.close
|
18
|
-
|
17
|
+
FileUtils.chmod(0000, @file.path)
|
19
18
|
end
|
20
19
|
after { @file.unlink }
|
21
|
-
describe "when the file is not
|
22
|
-
it "
|
23
|
-
|
24
|
-
original_mode = File.stat(@file.path).mode
|
25
|
-
expect(FileUtils).to receive(:chmod).with("a+r", @file.path)
|
26
|
-
subject.scan(@file.path)
|
27
|
-
expect(File.stat(@file.path).mode).to eq(original_mode)
|
20
|
+
describe "when the file is not readable" do
|
21
|
+
it "scans the file" do
|
22
|
+
expect { subject.scan(@file.path) }.not_to raise_error
|
28
23
|
end
|
29
|
-
|
30
|
-
|
31
|
-
before { FileUtils.chmod("a+r", @file.path) }
|
32
|
-
it "should not change the permissions" do
|
33
|
-
original_mode = File.stat(@file.path).mode
|
34
|
-
expect(FileUtils).not_to receive(:chmod)
|
35
|
-
subject.scan(@file.path)
|
36
|
-
expect(File.stat(@file.path).mode).to eq(original_mode)
|
24
|
+
it "resets the original permissions" do
|
25
|
+
expect { subject.scan(@file.path) }.not_to change { File.stat(@file.path).mode }
|
37
26
|
end
|
38
27
|
end
|
39
28
|
end
|
40
29
|
|
41
30
|
describe "result" do
|
31
|
+
let(:path) { File.expand_path(File.join("..", "..", "fixtures", "blue-devil.png"), __FILE__) }
|
42
32
|
before do
|
43
|
-
allow(subject).to receive(:
|
33
|
+
allow(subject).to receive(:clamdscan).with(path) { ["output", exitcode] }
|
44
34
|
end
|
45
35
|
describe "when a virus is found" do
|
46
|
-
let(:
|
36
|
+
let(:exitcode) { 1 }
|
47
37
|
it "should raise a VirusFoundError" do
|
48
38
|
expect { subject.scan(path) }.to raise_error(VirusFoundError)
|
49
39
|
end
|
50
40
|
end
|
51
41
|
describe "when there is an error" do
|
52
|
-
let(:
|
53
|
-
it "
|
42
|
+
let(:exitcode) { 2 }
|
43
|
+
it "raises a ScannerError" do
|
54
44
|
expect { subject.scan(path) }.to raise_error(ScannerError)
|
55
45
|
end
|
56
46
|
end
|
57
47
|
describe "success" do
|
58
|
-
let(:
|
59
|
-
it "
|
48
|
+
let(:exitcode) { 0 }
|
49
|
+
it "has output" do
|
60
50
|
expect(subject.scan(path).output).to eq("output")
|
61
51
|
end
|
62
|
-
it "
|
52
|
+
it "has a scanned_at time" do
|
63
53
|
expect(subject.scan(path).scanned_at).to be_a(Time)
|
64
54
|
end
|
65
|
-
it "
|
55
|
+
it "has a version" do
|
66
56
|
expect(subject.scan(path).version).to eq("version")
|
67
57
|
end
|
68
|
-
it "
|
58
|
+
it "has the file_path" do
|
69
59
|
expect(subject.scan(path).file_path).to eq(path)
|
70
60
|
end
|
71
61
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddr-antivirus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Chandek-Stark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -76,6 +76,8 @@ files:
|
|
76
76
|
- lib/ddr/antivirus/scanner_adapter.rb
|
77
77
|
- lib/ddr/antivirus/version.rb
|
78
78
|
- spec/fixtures/blue-devil.png
|
79
|
+
- spec/fixtures/clean.txt
|
80
|
+
- spec/integration/clamd_spec.rb
|
79
81
|
- spec/spec_helper.rb
|
80
82
|
- spec/unit/clamd_scanner_adapter_spec.rb
|
81
83
|
homepage: https://github.com/duke-libraries/ddr-antivirus
|
@@ -104,5 +106,7 @@ specification_version: 4
|
|
104
106
|
summary: Pluggable antivirus scanning service.
|
105
107
|
test_files:
|
106
108
|
- spec/fixtures/blue-devil.png
|
109
|
+
- spec/fixtures/clean.txt
|
110
|
+
- spec/integration/clamd_spec.rb
|
107
111
|
- spec/spec_helper.rb
|
108
112
|
- spec/unit/clamd_scanner_adapter_spec.rb
|