Skip to content

Commit

Permalink
Use bytes to determine file types as a default (#14)
Browse files Browse the repository at this point in the history
Fixe issue #13
  • Loading branch information
codingedward authored Sep 13, 2020
1 parent d47bbed commit 6453739
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 6 deletions.
1 change: 1 addition & 0 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pytz = "*"
flask = "*"
pillow = ">=7.1.0"
werkzeug = "*"
filetype = "*"

[requires]
python_version = "*"
12 changes: 10 additions & 2 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 11 additions & 2 deletions flask_sieve/rules_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import pytz
import operator
import requests
import filetype

from PIL import Image
from dateutil.parser import parse as dateparse
Expand Down Expand Up @@ -231,7 +232,11 @@ def validate_extension(self, value, params, **kwargs):
if not self.validate_file(value):
return False
self._assert_params_size(size=1, params=params, rule='extension')
return value.filename.split('.')[-1].lower() == params[0]
kind = filetype.guess(value.stream.read(512))
value.seek(0)
if kind is None:
return value.filename.split('.')[-1].lower() == params[0]
return kind.extension in params

@staticmethod
def validate_file(value, **kwargs):
Expand Down Expand Up @@ -375,7 +380,11 @@ def validate_mime_types(self, value, params, **kwargs):
if not self.validate_file(value):
return False
self._assert_params_size(size=1, params=params, rule='mime_types')
return value.mimetype in params
kind = filetype.guess(value.stream.read(512))
value.seek(0)
if kind is None:
return value.mimetype in params
return kind.mime in params

def validate_min(self, value, params, **kwargs):
self._assert_params_size(size=1, params=params, rule='min')
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ click==7.1.2
coverage==5.2.1
coveralls==2.1.2
docopt==0.6.2
filetype==1.0.7
Flask==1.1.2
idna==2.10
itsdangerous==1.1.0
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
name='flask-sieve',
description='A Laravel inspired requests validator for Flask',
long_description='Find the documentation at https://flask-sieve.readthedocs.io/en/latest/',
version='1.1.2',
version='1.1.3',
url='https://github.com/codingedward/flask-sieve',
license='BSD-2',
author='Edward Njoroge',
Expand All @@ -18,6 +18,7 @@
'python-dateutil',
'pytz',
'requests',
'filetype',
],
classifiers=[
'Development Status :: 5 - Production/Stable',
Expand Down
24 changes: 23 additions & 1 deletion tests/test_rules_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@
from flask_sieve.parser import Parser
from flask_sieve.rules_processor import RulesProcessor

class FakeFileStream:
def __init__(self, buf):
self.buf = buf

def read(self, buf_size):
return self.buf[:buf_size]

def seek(self, value):
pass


class TestRulesProcessor(unittest.TestCase):
def setUp(self):
Expand All @@ -19,7 +29,7 @@ def setUp(self):
name='image'
)
self.invalid_file = FileStorage(
stream=self.stream,
stream=FakeFileStream(bytearray([0xFE, 0x58, 0x8F, 0x00, 0x08])),
filename='invalid.png'
)

Expand Down Expand Up @@ -285,6 +295,10 @@ def test_validates_dimensions(self):
rules={'field': ['dimensions:2x1']},
request={'field': 'not a file'}
)
self.assert_fails(
rules={'field': ['dimensions:1x1']},
request={'field': self.invalid_file}
)

def test_validates_distinct(self):
self.assert_passes(
Expand Down Expand Up @@ -327,6 +341,10 @@ def test_validates_extension(self):
rules={'field': ['extension:png']},
request={'field': 1}
)
self.assert_fails(
rules={'field': ['extension:tnp']},
request={'field': self.invalid_file}
)

def test_validates_email(self):
self.assert_passes(
Expand Down Expand Up @@ -565,6 +583,10 @@ def test_validates_mime_types(self):
rules={'field': ['mime_types:image/png']},
request={'field': 1}
)
self.assert_fails(
rules={'field': ['mime_types:image/xpng']},
request={'field': self.invalid_file}
)

def test_validates_min(self):
self.assert_passes(
Expand Down

0 comments on commit 6453739

Please sign in to comment.