2014-06-27 07:37:49 +04:00
|
|
|
import shutil
|
2019-07-06 23:40:53 +03:00
|
|
|
|
|
|
|
from PIL import GifImagePlugin, Image, JpegImagePlugin
|
2014-06-27 07:37:49 +04:00
|
|
|
|
2019-07-06 23:40:53 +03:00
|
|
|
from .helper import (
|
|
|
|
PillowTestCase,
|
|
|
|
cjpeg_available,
|
|
|
|
djpeg_available,
|
2019-09-25 12:46:54 +03:00
|
|
|
is_win32,
|
2019-07-06 23:40:53 +03:00
|
|
|
netpbm_available,
|
|
|
|
unittest,
|
|
|
|
)
|
2014-06-27 07:37:49 +04:00
|
|
|
|
2014-09-04 09:44:46 +04:00
|
|
|
TEST_JPG = "Tests/images/hopper.jpg"
|
|
|
|
TEST_GIF = "Tests/images/hopper.gif"
|
2014-06-27 07:37:49 +04:00
|
|
|
|
2019-06-13 18:54:46 +03:00
|
|
|
test_filenames = ("temp_';", 'temp_";', "temp_'\"|", "temp_'\"||", "temp_'\"&&")
|
2014-06-27 07:37:49 +04:00
|
|
|
|
2014-08-28 15:44:19 +04:00
|
|
|
|
2019-09-25 12:46:54 +03:00
|
|
|
@unittest.skipIf(is_win32(), "requires Unix or macOS")
|
2014-06-27 07:37:49 +04:00
|
|
|
class TestShellInjection(PillowTestCase):
|
|
|
|
def assert_save_filename_check(self, src_img, save_func):
|
|
|
|
for filename in test_filenames:
|
|
|
|
dest_file = self.tempfile(filename)
|
|
|
|
save_func(src_img, 0, dest_file)
|
|
|
|
# If file can't be opened, shell injection probably occurred
|
|
|
|
Image.open(dest_file).load()
|
|
|
|
|
2014-06-28 02:12:37 +04:00
|
|
|
@unittest.skipUnless(djpeg_available(), "djpeg not available")
|
2014-06-27 07:37:49 +04:00
|
|
|
def test_load_djpeg_filename(self):
|
|
|
|
for filename in test_filenames:
|
|
|
|
src_file = self.tempfile(filename)
|
2014-09-04 09:44:46 +04:00
|
|
|
shutil.copy(TEST_JPG, src_file)
|
2014-06-27 07:37:49 +04:00
|
|
|
|
|
|
|
im = Image.open(src_file)
|
|
|
|
im.load_djpeg()
|
|
|
|
|
2014-06-28 02:12:37 +04:00
|
|
|
@unittest.skipUnless(cjpeg_available(), "cjpeg not available")
|
2014-06-27 07:37:49 +04:00
|
|
|
def test_save_cjpeg_filename(self):
|
2014-09-04 09:44:46 +04:00
|
|
|
im = Image.open(TEST_JPG)
|
2014-06-27 07:37:49 +04:00
|
|
|
self.assert_save_filename_check(im, JpegImagePlugin._save_cjpeg)
|
|
|
|
|
2014-06-28 02:12:37 +04:00
|
|
|
@unittest.skipUnless(netpbm_available(), "netpbm not available")
|
2014-06-27 07:37:49 +04:00
|
|
|
def test_save_netpbm_filename_bmp_mode(self):
|
2014-09-04 09:44:46 +04:00
|
|
|
im = Image.open(TEST_GIF).convert("RGB")
|
2014-06-27 07:37:49 +04:00
|
|
|
self.assert_save_filename_check(im, GifImagePlugin._save_netpbm)
|
|
|
|
|
2014-06-28 02:12:37 +04:00
|
|
|
@unittest.skipUnless(netpbm_available(), "netpbm not available")
|
2014-06-27 07:37:49 +04:00
|
|
|
def test_save_netpbm_filename_l_mode(self):
|
2014-09-04 09:44:46 +04:00
|
|
|
im = Image.open(TEST_GIF).convert("L")
|
2014-06-27 07:37:49 +04:00
|
|
|
self.assert_save_filename_check(im, GifImagePlugin._save_netpbm)
|