|
|
@ -2,15 +2,21 @@ import clamd |
|
|
from clamd import BufferTooLongError |
|
|
from clamd import BufferTooLongError |
|
|
from unittest import mock |
|
|
from unittest import mock |
|
|
|
|
|
|
|
|
from django import forms |
|
|
|
|
|
from django.test import TestCase |
|
|
from django.test import TestCase |
|
|
from django.core.files.uploadedfile import SimpleUploadedFile |
|
|
from django.core.files.uploadedfile import SimpleUploadedFile |
|
|
|
|
|
from rest_framework import serializers |
|
|
|
|
|
from rest_framework.test import APIRequestFactory |
|
|
|
|
|
|
|
|
from ..validators import file_scan_validation |
|
|
from ..validators import file_scan_validation |
|
|
|
|
|
from ..models import Document |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestUploadForm(forms.Form): |
|
|
|
|
|
upload = forms.FileField(validators=[file_scan_validation]) |
|
|
|
|
|
|
|
|
class TestUploadSerializer(serializers.ModelSerializer): |
|
|
|
|
|
upload = serializers.FileField(validators=[file_scan_validation]) |
|
|
|
|
|
|
|
|
|
|
|
class Meta: |
|
|
|
|
|
model = Document |
|
|
|
|
|
fields = ('upload', 'filename') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UploadScanTests(TestCase): |
|
|
class UploadScanTests(TestCase): |
|
|
@ -18,17 +24,17 @@ class UploadScanTests(TestCase): |
|
|
def test_validation_disabled(self): |
|
|
def test_validation_disabled(self): |
|
|
with self.settings(CLAMAV_ENABLED=False): |
|
|
with self.settings(CLAMAV_ENABLED=False): |
|
|
infected = SimpleUploadedFile('infected.txt', clamd.EICAR) |
|
|
infected = SimpleUploadedFile('infected.txt', clamd.EICAR) |
|
|
form = TestUploadForm(files={'upload': infected}) |
|
|
|
|
|
|
|
|
serializer = TestUploadSerializer(data={'upload': infected}) |
|
|
|
|
|
|
|
|
self.assertTrue(form.is_valid(), form.errors) |
|
|
|
|
|
|
|
|
self.assertTrue(serializer.is_valid(), serializer.errors) |
|
|
|
|
|
|
|
|
def test_validation_invalid_network_connection(self): |
|
|
def test_validation_invalid_network_connection(self): |
|
|
with self.settings(CLAMAV_TCP_PORT=9999): |
|
|
with self.settings(CLAMAV_TCP_PORT=9999): |
|
|
infected = SimpleUploadedFile('infected.txt', clamd.EICAR) |
|
|
infected = SimpleUploadedFile('infected.txt', clamd.EICAR) |
|
|
form = TestUploadForm(files={'upload': infected}) |
|
|
|
|
|
|
|
|
serializer = TestUploadSerializer(data={'upload': infected}) |
|
|
|
|
|
|
|
|
self.assertFalse(form.is_valid()) |
|
|
|
|
|
self.assertEqual(form.errors['upload'][0], 'Unable to scan file.') |
|
|
|
|
|
|
|
|
self.assertFalse(serializer.is_valid()) |
|
|
|
|
|
self.assertEqual(serializer.errors['upload'][0], 'Unable to scan file.') |
|
|
|
|
|
|
|
|
@mock.patch('clamd.ClamdNetworkSocket.instream') |
|
|
@mock.patch('clamd.ClamdNetworkSocket.instream') |
|
|
def test_validation_buffer_overflow(self, mock_clam): |
|
|
def test_validation_buffer_overflow(self, mock_clam): |
|
|
@ -36,26 +42,26 @@ class UploadScanTests(TestCase): |
|
|
|
|
|
|
|
|
# by default clamav has a 10mb limit for instream |
|
|
# by default clamav has a 10mb limit for instream |
|
|
clean = SimpleUploadedFile('clean.txt', b'clean file') |
|
|
clean = SimpleUploadedFile('clean.txt', b'clean file') |
|
|
form = TestUploadForm(files={'upload': clean}) |
|
|
|
|
|
|
|
|
serializer = TestUploadSerializer(data={'upload': clean}) |
|
|
|
|
|
|
|
|
self.assertFalse(form.is_valid()) |
|
|
|
|
|
self.assertEqual(form.errors['upload'][0], 'Unable to scan file.') |
|
|
|
|
|
|
|
|
self.assertFalse(serializer.is_valid()) |
|
|
|
|
|
self.assertEqual(serializer.errors['upload'][0], 'Unable to scan file.') |
|
|
|
|
|
|
|
|
@mock.patch('clamd.ClamdNetworkSocket.instream') |
|
|
@mock.patch('clamd.ClamdNetworkSocket.instream') |
|
|
def test_validation_virus_found(self, mock_clam): |
|
|
def test_validation_virus_found(self, mock_clam): |
|
|
mock_clam.return_value = {'stream': ('FOUND', 'Eicar-Test-Signature')} |
|
|
mock_clam.return_value = {'stream': ('FOUND', 'Eicar-Test-Signature')} |
|
|
|
|
|
|
|
|
infected = SimpleUploadedFile('infected.txt', clamd.EICAR) |
|
|
infected = SimpleUploadedFile('infected.txt', clamd.EICAR) |
|
|
form = TestUploadForm(files={'upload': infected}) |
|
|
|
|
|
|
|
|
serializer = TestUploadSerializer(data={'upload': infected}) |
|
|
|
|
|
|
|
|
self.assertFalse(form.is_valid()) |
|
|
|
|
|
self.assertEqual(form.errors['upload'][0], 'Infected file found.') |
|
|
|
|
|
|
|
|
self.assertFalse(serializer.is_valid()) |
|
|
|
|
|
self.assertEqual(serializer.errors['upload'][0], 'Infected file found.') |
|
|
|
|
|
|
|
|
@mock.patch('clamd.ClamdNetworkSocket.instream') |
|
|
@mock.patch('clamd.ClamdNetworkSocket.instream') |
|
|
def test_validation_no_virus_found(self, mock_clam): |
|
|
def test_validation_no_virus_found(self, mock_clam): |
|
|
mock_clam.return_value = {'stream': ('OK', None)} |
|
|
mock_clam.return_value = {'stream': ('OK', None)} |
|
|
|
|
|
|
|
|
clean = SimpleUploadedFile('clean.txt', b'clean file') |
|
|
clean = SimpleUploadedFile('clean.txt', b'clean file') |
|
|
form = TestUploadForm(files={'upload': clean}) |
|
|
|
|
|
|
|
|
serializer = TestUploadSerializer(data={'upload': clean}) |
|
|
|
|
|
|
|
|
self.assertTrue(form.is_valid()) |
|
|
|
|
|
|
|
|
self.assertTrue(serializer.is_valid()) |