File suds-insecure-cache-tempdir.patch of Package python-suds-jurko
--- suds/cache.py.orig 2014-01-21 20:06:03.000000000 +0100
+++ suds/cache.py 2014-02-11 13:22:39.047914048 +0100
@@ -26,7 +26,7 @@
from datetime import datetime as dt
from datetime import timedelta
import os
-from tempfile import gettempdir as tmp
+import tempfile
try:
import cPickle as pickle
except Exception:
@@ -93,6 +93,9 @@
A file-based URL cache.
@cvar fnprefix: The file name prefix.
@type fnsuffix: str
+ @cvar remove_default_location_on_exit: Whether to remove the default cache
+ location on process exit (default=True).
+ @type remove_default_location_on_exit: bool
@ivar duration: The cached file duration which defines how
long the file will be cached.
@type duration: (unit, value)
@@ -100,10 +103,21 @@
@type location: str
"""
fnprefix = 'suds'
+ __default_location = None
+ remove_default_location_on_exit = True
units = ('months', 'weeks', 'days', 'hours', 'minutes', 'seconds')
def __init__(self, location=None, **duration):
"""
+ Initialized a new FileCache instance.
+
+ If no cache location is specified, a temporary default location will be
+ used. Such default cache location will be shared by all FileCache
+ instances with no explicitly specified location within the same
+ process. The default cache location will be removed automatically on
+ process exit unless user sets the remove_default_location_on_exit
+ FileCache class attribute to False.
+
@param location: The directory for the cached files.
@type location: str
@param duration: The cached file duration which defines how
@@ -112,7 +126,7 @@
@type duration: {unit:value}
"""
if location is None:
- location = os.path.join(tmp(), 'suds')
+ location = self.__get_default_location()
self.location = location
self.duration = (None, 0)
self.setduration(**duration)
@@ -250,6 +264,34 @@
fn = '%s-%s.%s' % (self.fnprefix, name, suffix)
return os.path.join(self.location, fn)
+ @staticmethod
+ def __get_default_location():
+ """
+ Returns the current process's default cache location folder.
+
+ The folder is determined lazily on first call.
+
+ """
+ if not FileCache.__default_location:
+ tmp = tempfile.mkdtemp("suds-default-cache")
+ FileCache.__default_location = tmp
+ import atexit
+ atexit.register(FileCache.__remove_default_location)
+ return FileCache.__default_location
+
+ @staticmethod
+ def __remove_default_location():
+ """
+ Removes the default cache location folder.
+
+ This removal may be disabled by setting the
+ remove_default_location_on_exit FileCache class attribute to False.
+
+ """
+ if FileCache.remove_default_location_on_exit:
+ import shutil
+ shutil.rmtree(FileCache.__default_location, ignore_errors=True)
+
class DocumentCache(FileCache):
"""
--- tests/test_cache.py.orig 2014-01-21 20:06:03.000000000 +0100
+++ tests/test_cache.py 2014-02-11 13:32:00.713225646 +0100
@@ -133,14 +133,7 @@
assert cache2.get("unga2") == value_p22
-def test_FileCache_location(tmpdir):
- defaultLocation = os.path.join(tempfile.gettempdir(), "suds")
- cache = suds.cache.FileCache()
- assert os.path.isdir(cache.location)
- assert cache.location == defaultLocation
- assert suds.cache.FileCache().location == defaultLocation
- assert cache.location == defaultLocation
-
+def test_FileCache_non_default_location(tmpdir):
cacheFolder1 = tmpdir.join("flip-flop1").strpath
assert not os.path.isdir(cacheFolder1)
assert suds.cache.FileCache(location=cacheFolder1).location == cacheFolder1