diff --git a/fdroidserver/update.py b/fdroidserver/update.py index d1dd11bf..7529dbff 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -733,6 +733,8 @@ def _strip_and_copy_image(in_file, outpath): outpath can be path to either a file or dir. The dir that outpath refers to must exist before calling this. + Potential source of Python code to strip JPEGs without dependencies: + http://www.fetidcascade.com/public/minimal_exif_writer.py """ logging.debug('copying ' + in_file + ' ' + outpath) @@ -750,17 +752,25 @@ def _strip_and_copy_image(in_file, outpath): extension = common.get_extension(in_file)[1] if extension == 'png': - with open(in_file, 'rb') as fp: - in_image = Image.open(fp) - in_image.save(out_file, "PNG", optimize=True, - pnginfo=BLANK_PNG_INFO, icc_profile=None) + try: + with open(in_file, 'rb') as fp: + in_image = Image.open(fp) + in_image.save(out_file, "PNG", optimize=True, + pnginfo=BLANK_PNG_INFO, icc_profile=None) + except Exception as e: + logging.error(_("Failed copying {path}: {error}".format(path=in_file, error=e))) + return elif extension == 'jpg' or extension == 'jpeg': - with open(in_file, 'rb') as fp: - in_image = Image.open(fp) - data = list(in_image.getdata()) - out_image = Image.new(in_image.mode, in_image.size) - out_image.putdata(data) - out_image.save(out_file, "JPEG", optimize=True) + try: + with open(in_file, 'rb') as fp: + in_image = Image.open(fp) + data = list(in_image.getdata()) + out_image = Image.new(in_image.mode, in_image.size) + out_image.putdata(data) + out_image.save(out_file, "JPEG", optimize=True) + except Exception as e: + logging.error(_("Failed copying {path}: {error}".format(path=in_file, error=e))) + return else: raise FDroidException(_('Unsupported file type "{extension}" for repo graphic') .format(extension=extension)) diff --git a/tests/corrupt-featureGraphic.png b/tests/corrupt-featureGraphic.png new file mode 100644 index 00000000..f2adec12 Binary files /dev/null and b/tests/corrupt-featureGraphic.png differ diff --git a/tests/update.TestCase b/tests/update.TestCase index fc5f69bb..1b06e458 100755 --- a/tests/update.TestCase +++ b/tests/update.TestCase @@ -851,6 +851,20 @@ class UpdateTest(unittest.TestCase): icons_src = fdroidserver.update._get_apk_icons_src('urzip-release.apk', None) assert icons_src == {} + def test_strip_and_copy_image(self): + tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, + dir=self.tmpdir) + + in_file = os.path.join(self.basedir, 'metadata', 'info.guardianproject.urzip', 'en-US', 'images', 'icon.png') + out_file = os.path.join(tmptestsdir, 'icon.png') + fdroidserver.update._strip_and_copy_image(in_file, out_file) + self.assertTrue(os.path.exists(out_file)) + + in_file = os.path.join(self.basedir, 'corrupt-featureGraphic.png') + out_file = os.path.join(tmptestsdir, 'corrupt-featureGraphic.png') + fdroidserver.update._strip_and_copy_image(in_file, out_file) + self.assertFalse(os.path.exists(out_file)) + def test_create_metadata_from_template_empty_keys(self): apk = {'packageName': 'rocks.janicerand'} with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):