Skip to content

Commit

Permalink
Merge pull request #1 from 0x2b3bfa0/patch-1
Browse files Browse the repository at this point in the history
Quick fix for CVE Request 766166
  • Loading branch information
frostming committed Oct 5, 2019
2 parents 45b6364 + f242125 commit 748f60b
Show file tree
Hide file tree
Showing 4 changed files with 164 additions and 170 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,4 @@ target/
.ipynb_checkpoints
venv/
.python-version
.vscode/
49 changes: 21 additions & 28 deletions rediswrapper/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from collections import MutableSet
from collections import MutableMapping
from collections import MutableSequence

try:
import cPickle as pickle
except ImportError:
Expand All @@ -23,6 +24,7 @@ def __init__(self, key, client):

class HashType(RedisType, MutableMapping):
"""Dict-like wrapper for list data"""

def __getitem__(self, key):
if not self._r.hexists(self.key, key):
raise KeyError(key)
Expand All @@ -39,7 +41,7 @@ def __delitem__(self, key):
def __iter__(self):
for key in self._r.hkeys(self.key):
if isinstance(key, bytes):
key = key.decode('utf8')
key = key.decode("utf8")
yield key

def __len__(self):
Expand All @@ -52,7 +54,7 @@ def __getattr__(self, name):
raise AttributeError(name)

def __repr__(self):
return '%s value(%s)' % (self.__class__.__name__, dict(self))
return "%s value(%s)" % (self.__class__.__name__, dict(self))

def _set(self, other):
for key in self:
Expand All @@ -62,6 +64,7 @@ def _set(self, other):

class ListType(RedisType, MutableSequence):
"""List-like wrapper for list data"""

def __setitem__(self, index, value):
if isinstance(index, slice):
gen = iter(value)
Expand All @@ -74,7 +77,7 @@ def __setitem__(self, index, value):
if indices[2] != 1:
raise ValueError("The value length doesn't match")
else:
del self[i:indices[1]]
del self[i : indices[1]]
break
else:
# The value length is larger than slice
Expand All @@ -88,11 +91,10 @@ def __setitem__(self, index, value):
elif isinstance(index, int):
index = index + len(self) if index < 0 else index
if index >= len(self):
raise IndexError('Index out of range')
raise IndexError("Index out of range")
self._r.lset(self.key, index, from_value(value))
else:
raise TypeError('list indices must be integers, not %r'
% type(index))
raise TypeError("list indices must be integers, not %r" % type(index))

def __getitem__(self, index):
if isinstance(index, slice):
Expand All @@ -101,9 +103,9 @@ def __getitem__(self, index):
elif isinstance(index, int):
index = index + len(self) if index < 0 else index
if index >= len(self):
raise IndexError('Index out of range')
raise IndexError("Index out of range")
return to_value(self._r.lindex(self.key, index))
raise TypeError('list indices must be integers, not %r' % type(index))
raise TypeError("list indices must be integers, not %r" % type(index))

def __delitem__(self, index):
if isinstance(index, slice):
Expand All @@ -114,18 +116,17 @@ def __delitem__(self, index):
elif isinstance(index, int):
index = index + len(self) if index < 0 else index
if index >= len(self):
raise IndexError('Index out of range')
raise IndexError("Index out of range")
if index == 0:
return self._r.lpop(self.key)
elif index == len(self) - 1:
return self._r.rpop(self.key)
temp = self._r.lrange(self.key, index+1, len(self))
self._r.ltrim(self.key, 0, index-1)
temp = self._r.lrange(self.key, index + 1, len(self))
self._r.ltrim(self.key, 0, index - 1)
for item in temp:
self._r.rpush(self.key, item)
else:
raise TypeError('list indices must be integers, not %r'
% type(index))
raise TypeError("list indices must be integers, not %r" % type(index))

def __len__(self):
return self._r.llen(self.key)
Expand All @@ -136,15 +137,15 @@ def __eq__(self, other):
return list(self) == list(other)

def __repr__(self):
return '%s value(%s)' % (self.__class__.__name__, list(self))
return "%s value(%s)" % (self.__class__.__name__, list(self))

def insert(self, index, value):
index = index + len(self) if index < 0 else index
if index < len(self):
if index == 0:
return self._r.lpush(self.key, from_value(value))
temp = self._r.lrange(self.key, index, len(self))
self._r.ltrim(self.key, 0, index-1)
self._r.ltrim(self.key, 0, index - 1)
self.append(value)
for item in temp:
self._r.rpush(self.key, item)
Expand All @@ -157,6 +158,7 @@ def _set(self, other):

class SetType(RedisType, MutableSet):
"""Set-like wrapper for list data"""

def __contains__(self, value):
return self._r.sismember(self.key, from_value(value))

Expand All @@ -174,7 +176,7 @@ def discard(self, value):
self._r.srem(self.key, from_value(value))

def __repr__(self):
return '%s value(%s)' % (self.__class__.__name__, list(self))
return "%s value(%s)" % (self.__class__.__name__, list(self))

def _set(self, other):
for v in self:
Expand All @@ -186,23 +188,14 @@ def _from_iterable(self, other):
return set(other)


type_map = {'list': ListType, 'hash': HashType, 'set': SetType}
type_map = {"list": ListType, "hash": HashType, "set": SetType}


def from_value(value):
"""Convert a value to be stored in redis"""
if isinstance(value, basestring):
# Keep most readability, do not pickle string values
return value
try:
return pickle.dumps(value)
except Exception:
return value
return pickle.dumps(value)


def to_value(pickled):
"""Convert a storage value from redis to human readable"""
try:
return pickle.loads(pickled)
except:
return pickled.decode('utf8')
return pickle.loads(pickled)
78 changes: 40 additions & 38 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,29 @@
from setuptools import setup


if sys.argv[-1] == 'publish':
if sys.argv[-1] == "publish":
os.system("python setup.py sdist upload")
sys.exit()

if sys.argv[-1] == 'test':
if sys.argv[-1] == "test":
try:
__import__('py')
__import__("pytest")
except ImportError:
print('pytest required.')
print("pytest required.")
sys.exit(1)

errors = os.system('py.test')
errors = os.system("pytest")
sys.exit(bool(errors))


def get_version():
content = open('rediswrapper/__init__.py').read()
content = open("rediswrapper/__init__.py").read()
return re.findall(r'__version__\s*=\s*[\'"](.*)[\'"]', content)[0]

readme = 'README'
for name in os.listdir('.'):
if name.startswith('README'):

readme = "README"
for name in os.listdir("."):
if name.startswith("README"):
readme = name
break
try:
Expand All @@ -34,32 +35,33 @@ def get_version():
except:
long_description = "RedisWrapper, a pythonic wrapper for redis client"

setup(name='rediswrapper',
version=get_version(),
description='Pythonic wrapper for Redis Client.',
url='https://github.com/frostming/rediswrapper',
author='Frost Ming',
author_email='mianghong@gmail.com',
license='MIT',
packages=['rediswrapper'],
test_suite='test_rediswrapper',
zip_safe=False,
long_description=long_description,
keywords='redis client mock',
test_requires=['pytest', 'fakeredis'],
install_requires=['redis'],
classifiers=[
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Topic :: Software Development",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Development Status :: 3 - Alpha",
"License :: OSI Approved :: MIT License"
],
)
setup(
name="rediswrapper",
version=get_version(),
description="Pythonic wrapper for Redis Client.",
url="https://github.com/frostming/rediswrapper",
author="Frost Ming",
author_email="mianghong@gmail.com",
license="MIT",
packages=["rediswrapper"],
test_suite="test_rediswrapper",
zip_safe=False,
long_description=long_description,
keywords="redis client mock",
test_requires=["pytest", "fakeredis"],
install_requires=["redis"],
classifiers=[
"Intended Audience :: Developers",
"Operating System :: OS Independent",
"Topic :: Software Development",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Development Status :: 3 - Alpha",
"License :: OSI Approved :: MIT License",
],
)
Loading

0 comments on commit 748f60b

Please sign in to comment.