From f9766a20499e79ed756269474d0579b8d8c0e0c1 Mon Sep 17 00:00:00 2001 From: Marius Gedminas Date: Fri, 25 Oct 2019 14:21:03 +0300 Subject: [PATCH] Python 3: fix bytes vs strings in viruscheck plugin Socket communication deals with bytes. There are probably remaining issues with the viruscheck plugin on Python 3, we just can't see them because the code is not fully covered with tests. --- linkcheck/plugins/viruscheck.py | 12 ++++++------ tests/test_clamav.py | 34 +++++++++++++++++---------------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/linkcheck/plugins/viruscheck.py b/linkcheck/plugins/viruscheck.py index 5b6d3b2b..aa452708 100644 --- a/linkcheck/plugins/viruscheck.py +++ b/linkcheck/plugins/viruscheck.py @@ -87,11 +87,11 @@ class ClamdScanner (object): """Return a connected socket for sending scan data to it.""" port = None try: - self.sock.sendall("STREAM") + self.sock.sendall(b"STREAM") port = None for dummy in range(60): data = self.sock.recv(self.sock_rcvbuf) - i = data.find("PORT") + i = data.find(b"PORT") if i != -1: port = int(data[i+5:]) break @@ -118,10 +118,10 @@ class ClamdScanner (object): self.wsock.close() data = self.sock.recv(self.sock_rcvbuf) while data: - if "FOUND\n" in data: - self.infected.append(data) - if "ERROR\n" in data: - self.errors.append(data) + if b"FOUND\n" in data: + self.infected.append(data.decode('UTF-8', 'replace')) + if b"ERROR\n" in data: + self.errors.append(data.decode('UTF-8', 'replace')) data = self.sock.recv(self.sock_rcvbuf) self.sock.close() diff --git a/tests/test_clamav.py b/tests/test_clamav.py index 82b51c82..7bf4fb8d 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -29,7 +29,7 @@ class TestClamav (unittest.TestCase): @need_clamav def testClean (self): - data = "" + data = b"" infected, errors = clamav.scan(data, self.clamav_conf) self.assertFalse(infected) self.assertFalse(errors) @@ -37,24 +37,26 @@ class TestClamav (unittest.TestCase): @need_clamav def testInfected (self): # from the clamav test direcotry: the clamav test file as html data - data = 't' + data = ( + b't' + ) infected, errors = clamav.scan(data, self.clamav_conf) # different versions of clamav report different responses, apparently acceptable_responses = ( - ['stream: ClamAV-Test-File(2d1206194bd704385e37000be6113f73:781) FOUND\n'], - ['stream: Clamav.Test.File-6(aa15bcf478d165efd2065190eb473bcb:544) FOUND\n'], + [u'stream: ClamAV-Test-File(2d1206194bd704385e37000be6113f73:781) FOUND\n'], + [u'stream: Clamav.Test.File-6(aa15bcf478d165efd2065190eb473bcb:544) FOUND\n'], ) self.assertIn(infected, acceptable_responses) self.assertFalse(errors)