[Zope-Checkins] SVN: Zope/trunk/ Moved ``TaintedString`` into the new AccessControl.tainted module.
Hanno Schlichting
hannosch at hannosch.eu
Sat Jun 5 12:25:50 EDT 2010
Log message for revision 113152:
Moved ``TaintedString`` into the new AccessControl.tainted module.
Changed:
U Zope/trunk/doc/CHANGES.rst
A Zope/trunk/src/AccessControl/tainted.py
A Zope/trunk/src/AccessControl/tests/test_tainted.py
U Zope/trunk/src/DocumentTemplate/DT_Util.py
U Zope/trunk/src/DocumentTemplate/DT_Var.py
U Zope/trunk/src/DocumentTemplate/tests/test_DT_Var.py
U Zope/trunk/src/OFS/DTMLMethod.py
U Zope/trunk/src/OFS/tests/testSimpleItem.py
U Zope/trunk/src/OFS/tests/test_DTMLMethod.py
U Zope/trunk/src/Shared/TaintedString/__init__.py
D Zope/trunk/src/Shared/TaintedString/tests.py
U Zope/trunk/src/ZPublisher/HTTPRequest.py
U Zope/trunk/src/ZPublisher/TaintedString.py
U Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py
-=-
Modified: Zope/trunk/doc/CHANGES.rst
===================================================================
--- Zope/trunk/doc/CHANGES.rst 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/doc/CHANGES.rst 2010-06-05 16:25:50 UTC (rev 113152)
@@ -11,6 +11,8 @@
Restructuring
+++++++++++++
+- Moved ``TaintedString`` into the new AccessControl.tainted module.
+
- Moved the ``zExceptions`` package into its own distribution.
- Completely refactored ``ZPublisher.WSGIResponse`` in order to provide
Added: Zope/trunk/src/AccessControl/tainted.py
===================================================================
--- Zope/trunk/src/AccessControl/tainted.py (rev 0)
+++ Zope/trunk/src/AccessControl/tainted.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -0,0 +1,153 @@
+##############################################################################
+#
+# Copyright (c) 2002 Zope Foundation and Contributors.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" TaintedString implementation.
+
+TaintedStrings hold potentially dangerous untrusted data; anything that could
+possibly hold HTML is considered dangerous. DTML code will use the quoted
+value of this string, and raised exceptions in Zope will use the repr()
+conversion.
+"""
+
+from cgi import escape
+
+
+class TaintedString:
+
+ def __init__(self, value):
+ self._value = value
+
+ def __str__(self):
+ return self._value
+
+ def __repr__(self):
+ return repr(self.quoted())
+
+ def __cmp__(self, o):
+ return cmp(self._value, o)
+
+ def __hash__(self):
+ return hash(self._value)
+
+ def __len__(self):
+ return len(self._value)
+
+ def __getitem__(self, index):
+ v = self._value[index]
+ if '<' in v:
+ v = self.__class__(v)
+ return v
+
+ def __getslice__(self, i, j):
+ i = max(i, 0)
+ j = max(j, 0)
+ v = self._value[i:j]
+ if '<' in v:
+ v = self.__class__(v)
+ return v
+
+ def __add__(self, o):
+ return self.__class__(self._value + o)
+
+ def __radd__(self, o):
+ return self.__class__(o + self._value)
+
+ def __mul__(self, o):
+ return self.__class__(self._value * o)
+
+ def __rmul__(self, o):
+ return self.__class__(o * self._value)
+
+ def __mod__(self, o):
+ return self.__class__(self._value % o)
+
+ def __int__(self):
+ return int(self._value)
+
+ def __float__(self):
+ return float(self._value)
+
+ def __long__(self):
+ return long(self._value)
+
+ def __getstate__(self):
+ # If an object tries to store a TaintedString, it obviously wasn't
+ # aware that it was playing with untrusted data. Complain acordingly.
+ raise SystemError("A TaintedString cannot be pickled. Code that "
+ "caused this TaintedString to be stored should be more careful "
+ "with untrusted data from the REQUEST.")
+
+ def __getattr__(self, a):
+ # for string methods support other than those defined below
+ return getattr(self._value, a)
+
+ # Python 2.2 only.
+ def decode(self, *args):
+ return self.__class__(self._value.decode(*args))
+
+ def encode(self, *args):
+ return self.__class__(self._value.encode(*args))
+
+ def expandtabs(self, *args):
+ return self.__class__(self._value.expandtabs(*args))
+
+ def replace(self, *args):
+ v = self._value.replace(*args)
+ if '<' in v:
+ v = self.__class__(v)
+ return v
+
+ def split(self, *args):
+ r = self._value.split(*args)
+ return map(lambda v, c=self.__class__: '<' in v and c(v) or v, r)
+
+ def splitlines(self, *args):
+ r = self._value.splitlines(*args)
+ return map(lambda v, c=self.__class__: '<' in v and c(v) or v, r)
+
+ def translate(self, *args):
+ v = self._value.translate(*args)
+ if '<' in v:
+ v = self.__class__(v)
+ return v
+
+ def quoted(self):
+ return escape(self._value, 1)
+
+ # As called by cDocumentTemplate
+ __untaint__ = quoted
+
+
+def createSimpleWrapper(func):
+ return lambda s, f=func: s.__class__(getattr(s._value, f)())
+
+
+def createOneArgWrapper(func):
+ return lambda s, a, f=func: s.__class__(getattr(s._value, f)(a))
+
+
+def createOneOptArgWrapper(func):
+ return lambda s, a=None, f=func: s.__class__(getattr(s._value, f)(a))
+
+
+simpleWrappedMethods = ["capitalize", "lower", "swapcase", "title", "upper"]
+oneArgWrappedMethods = ["center", "join", "ljust", "rjust"]
+oneOptArgWrappedMethods = ["lstrip", "rstrip", "strip"]
+
+for f in simpleWrappedMethods:
+ setattr(TaintedString, f, createSimpleWrapper(f))
+
+for f in oneArgWrappedMethods:
+ setattr(TaintedString, f, createOneArgWrapper(f))
+
+for f in oneOptArgWrappedMethods:
+ setattr(TaintedString, f, createOneOptArgWrapper(f))
Property changes on: Zope/trunk/src/AccessControl/tainted.py
___________________________________________________________________
Added: svn:eol-style
+ native
Added: Zope/trunk/src/AccessControl/tests/test_tainted.py
===================================================================
--- Zope/trunk/src/AccessControl/tests/test_tainted.py (rev 0)
+++ Zope/trunk/src/AccessControl/tests/test_tainted.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -0,0 +1,159 @@
+##############################################################################
+#
+# Copyright (c) 2002 Zope Foundation and Contributors.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+""" TaintedString tests.
+"""
+
+import unittest
+
+class TestTaintedString(unittest.TestCase):
+
+ def setUp(self):
+ self.unquoted = '<test attr="&">'
+ self.quoted = '<test attr="&">'
+ self.tainted = self._getClass()(self.unquoted)
+
+ def _getClass(self):
+ from AccessControl.tainted import TaintedString
+ return TaintedString
+
+ def testStr(self):
+ self.assertEquals(str(self.tainted), self.unquoted)
+
+ def testRepr(self):
+ self.assertEquals(repr(self.tainted), repr(self.quoted))
+
+ def testCmp(self):
+ self.assertEquals(cmp(self.tainted, self.unquoted), 0)
+ self.assertEquals(cmp(self.tainted, 'a'), -1)
+ self.assertEquals(cmp(self.tainted, '.'), 1)
+
+ def testHash(self):
+ hash = {}
+ hash[self.tainted] = self.quoted
+ hash[self.unquoted] = self.unquoted
+ self.assertEquals(hash[self.tainted], self.unquoted)
+
+ def testLen(self):
+ self.assertEquals(len(self.tainted), len(self.unquoted))
+
+ def testGetItem(self):
+ self.assert_(isinstance(self.tainted[0], self._getClass()))
+ self.assertEquals(self.tainted[0], '<')
+ self.failIf(isinstance(self.tainted[-1], self._getClass()))
+ self.assertEquals(self.tainted[-1], '>')
+
+ def testGetSlice(self):
+ self.assert_(isinstance(self.tainted[0:1], self._getClass()))
+ self.assertEquals(self.tainted[0:1], '<')
+ self.failIf(isinstance(self.tainted[1:], self._getClass()))
+ self.assertEquals(self.tainted[1:], self.unquoted[1:])
+
+ def testConcat(self):
+ self.assert_(isinstance(self.tainted + 'test', self._getClass()))
+ self.assertEquals(self.tainted + 'test', self.unquoted + 'test')
+ self.assert_(isinstance('test' + self.tainted, self._getClass()))
+ self.assertEquals('test' + self.tainted, 'test' + self.unquoted)
+
+ def testMultiply(self):
+ self.assert_(isinstance(2 * self.tainted, self._getClass()))
+ self.assertEquals(2 * self.tainted, 2 * self.unquoted)
+ self.assert_(isinstance(self.tainted * 2, self._getClass()))
+ self.assertEquals(self.tainted * 2, self.unquoted * 2)
+
+ def testInterpolate(self):
+ tainted = self._getClass()('<%s>')
+ self.assert_(isinstance(tainted % 'foo', self._getClass()))
+ self.assertEquals(tainted % 'foo', '<foo>')
+ tainted = self._getClass()('<%s attr="%s">')
+ self.assert_(isinstance(tainted % ('foo', 'bar'), self._getClass()))
+ self.assertEquals(tainted % ('foo', 'bar'), '<foo attr="bar">')
+
+ def testStringMethods(self):
+ simple = "capitalize isalpha isdigit islower isspace istitle isupper" \
+ " lower lstrip rstrip strip swapcase upper".split()
+ returnsTainted = "capitalize lower lstrip rstrip strip swapcase upper"
+ returnsTainted = returnsTainted.split()
+ unquoted = '\tThis is a test '
+ tainted = self._getClass()(unquoted)
+ for f in simple:
+ v = getattr(tainted, f)()
+ self.assertEquals(v, getattr(unquoted, f)())
+ if f in returnsTainted:
+ self.assert_(isinstance(v, self._getClass()))
+ else:
+ self.failIf(isinstance(v, self._getClass()))
+
+ optArg = "lstrip rstrip strip".split()
+ for f in optArg:
+ v = getattr(tainted, f)(" ")
+ self.assertEquals(v, getattr(unquoted, f)(" "))
+ self.assert_(isinstance(v, self._getClass()))
+
+ justify = "center ljust rjust".split()
+ for f in justify:
+ v = getattr(tainted, f)(30)
+ self.assertEquals(v, getattr(unquoted, f)(30))
+ self.assert_(isinstance(v, self._getClass()))
+
+ searches = "find index rfind rindex endswith startswith".split()
+ searchraises = "index rindex".split()
+ for f in searches:
+ v = getattr(tainted, f)('test')
+ self.assertEquals(v, getattr(unquoted, f)('test'))
+ if f in searchraises:
+ self.assertRaises(ValueError, getattr(tainted, f), 'nada')
+
+ self.assertEquals(tainted.count('test', 1, -1),
+ unquoted.count('test', 1, -1))
+
+ self.assertEquals(tainted.encode(), unquoted.encode())
+ self.assert_(isinstance(tainted.encode(), self._getClass()))
+
+ self.assertEquals(tainted.expandtabs(10),
+ unquoted.expandtabs(10))
+ self.assert_(isinstance(tainted.expandtabs(), self._getClass()))
+
+ self.assertEquals(tainted.replace('test', 'spam'),
+ unquoted.replace('test', 'spam'))
+ self.assert_(isinstance(tainted.replace('test', '<'), self._getClass()))
+ self.failIf(isinstance(tainted.replace('test', 'spam'),
+ self._getClass()))
+
+ self.assertEquals(tainted.split(), unquoted.split())
+ for part in self._getClass()('< < <').split():
+ self.assert_(isinstance(part, self._getClass()))
+ for part in tainted.split():
+ self.failIf(isinstance(part, self._getClass()))
+
+ multiline = 'test\n<tainted>'
+ lines = self._getClass()(multiline).split()
+ self.assertEquals(lines, multiline.split())
+ self.assert_(isinstance(lines[1], self._getClass()))
+ self.failIf(isinstance(lines[0], self._getClass()))
+
+ transtable = ''.join(map(chr, range(256)))
+ self.assertEquals(tainted.translate(transtable),
+ unquoted.translate(transtable))
+ self.assert_(isinstance(self._getClass()('<').translate(transtable),
+ self._getClass()))
+ self.failIf(isinstance(self._getClass()('<').translate(transtable, '<'),
+ self._getClass()))
+
+ def testQuoted(self):
+ self.assertEquals(self.tainted.quoted(), self.quoted)
+
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestTaintedString))
+ return suite
Property changes on: Zope/trunk/src/AccessControl/tests/test_tainted.py
___________________________________________________________________
Added: svn:eol-style
+ native
Modified: Zope/trunk/src/DocumentTemplate/DT_Util.py
===================================================================
--- Zope/trunk/src/DocumentTemplate/DT_Util.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/DocumentTemplate/DT_Util.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -31,7 +31,7 @@
from RestrictedPython.Utilities import utility_builtins
from RestrictedPython.Eval import RestrictionCapableEval
-from Shared.TaintedString import TaintedString
+from AccessControl.tainted import TaintedString
test = utility_builtins['test'] # for backwards compatibility, dont remove!
Modified: Zope/trunk/src/DocumentTemplate/DT_Var.py
===================================================================
--- Zope/trunk/src/DocumentTemplate/DT_Var.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/DocumentTemplate/DT_Var.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -160,7 +160,7 @@
from DocumentTemplate.DT_Util import parse_params, name_param, str, ustr
from Acquisition import aq_base
-from Shared.TaintedString import TaintedString
+from AccessControl.tainted import TaintedString
from zope.structuredtext.html import HTML
from zope.structuredtext.document import DocumentWithImages
from App.config import getConfiguration
Modified: Zope/trunk/src/DocumentTemplate/tests/test_DT_Var.py
===================================================================
--- Zope/trunk/src/DocumentTemplate/tests/test_DT_Var.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/DocumentTemplate/tests/test_DT_Var.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -51,7 +51,7 @@
... <li>line one</li>
... <li>line two</li>
... '''
- >>> from Shared.TaintedString import TaintedString
+ >>> from AccessControl.tainted import TaintedString
>>> tainted = TaintedString(text)
>>> print DT_Var.newline_to_br(tainted)
<br />
Modified: Zope/trunk/src/OFS/DTMLMethod.py
===================================================================
--- Zope/trunk/src/OFS/DTMLMethod.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/OFS/DTMLMethod.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -29,12 +29,12 @@
from AccessControl.Permissions import ftp_access
from AccessControl.DTML import RestrictedDTML
from AccessControl.requestmethod import requestmethod
+from AccessControl.tainted import TaintedString
from OFS.Cache import Cacheable
from OFS.History import Historical
from OFS.History import html_diff
from OFS.SimpleItem import Item_w__name__
from OFS.ZDOM import ElementWithTitle
-from Shared.TaintedString import TaintedString
from webdav.Lockable import ResourceLockedError
from zExceptions import Forbidden
from zExceptions.TracebackSupplement import PathTracebackSupplement
Modified: Zope/trunk/src/OFS/tests/testSimpleItem.py
===================================================================
--- Zope/trunk/src/OFS/tests/testSimpleItem.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/OFS/tests/testSimpleItem.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -44,7 +44,7 @@
self.failUnless('full details: testing' in value.message)
def test_raise_StandardErrorMessage_TaintedString_errorValue(self):
- from Shared.TaintedString import TaintedString
+ from AccessControl.tainted import TaintedString
class REQUEST(object):
class RESPONSE(object):
handle_errors = True
Modified: Zope/trunk/src/OFS/tests/test_DTMLMethod.py
===================================================================
--- Zope/trunk/src/OFS/tests/test_DTMLMethod.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/OFS/tests/test_DTMLMethod.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -15,7 +15,7 @@
verifyClass(IWriteLock, self._getTargetClass())
def test_edit_taintedstring(self):
- from Shared.TaintedString import TaintedString
+ from AccessControl.tainted import TaintedString
doc = self._makeOne()
self.assertEquals(doc.read(), '')
data = TaintedString('hello<br/>')
Modified: Zope/trunk/src/Shared/TaintedString/__init__.py
===================================================================
--- Zope/trunk/src/Shared/TaintedString/__init__.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/Shared/TaintedString/__init__.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -1,155 +1,8 @@
-##############################################################################
-#
-# Copyright (c) 2002 Zope Foundation and Contributors.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-""" TaintedString implementation.
-
-TaintedStrings hold potentially dangerous untrusted data; anything that could
-possibly hold HTML is considered dangerous. DTML code will use the quoted
-value of this string, and raised exceptions in Zope will use the repr()
-conversion.
-
-$Id$
-"""
-
-from cgi import escape
-
-
-class TaintedString:
-
- def __init__(self, value):
- self._value = value
-
- def __str__(self):
- return self._value
-
- def __repr__(self):
- return repr(self.quoted())
-
- def __cmp__(self, o):
- return cmp(self._value, o)
-
- def __hash__(self):
- return hash(self._value)
-
- def __len__(self):
- return len(self._value)
-
- def __getitem__(self, index):
- v = self._value[index]
- if '<' in v:
- v = self.__class__(v)
- return v
-
- def __getslice__(self, i, j):
- i = max(i, 0)
- j = max(j, 0)
- v = self._value[i:j]
- if '<' in v:
- v = self.__class__(v)
- return v
-
- def __add__(self, o):
- return self.__class__(self._value + o)
-
- def __radd__(self, o):
- return self.__class__(o + self._value)
-
- def __mul__(self, o):
- return self.__class__(self._value * o)
-
- def __rmul__(self, o):
- return self.__class__(o * self._value)
-
- def __mod__(self, o):
- return self.__class__(self._value % o)
-
- def __int__(self):
- return int(self._value)
-
- def __float__(self):
- return float(self._value)
-
- def __long__(self):
- return long(self._value)
-
- def __getstate__(self):
- # If an object tries to store a TaintedString, it obviously wasn't aware
- # that it was playing with untrusted data. Complain acordingly.
- raise SystemError("A TaintedString cannot be pickled. Code that "
- "caused this TaintedString to be stored should be more careful "
- "with untrusted data from the REQUEST.")
-
- def __getattr__(self, a):
- # for string methods support other than those defined below
- return getattr(self._value, a)
-
- # Python 2.2 only.
- def decode(self, *args):
- return self.__class__(self._value.decode(*args))
-
- def encode(self, *args):
- return self.__class__(self._value.encode(*args))
-
- def expandtabs(self, *args):
- return self.__class__(self._value.expandtabs(*args))
-
- def replace(self, *args):
- v = self._value.replace(*args)
- if '<' in v:
- v = self.__class__(v)
- return v
-
- def split(self, *args):
- r = self._value.split(*args)
- return map(lambda v, c=self.__class__: '<' in v and c(v) or v, r)
-
- def splitlines(self, *args):
- r = self._value.splitlines(*args)
- return map(lambda v, c=self.__class__: '<' in v and c(v) or v, r)
-
- def translate(self, *args):
- v = self._value.translate(*args)
- if '<' in v:
- v = self.__class__(v)
- return v
-
- def quoted(self):
- return escape(self._value, 1)
-
- # As called by cDocumentTemplate
- __untaint__ = quoted
-
-
-def createSimpleWrapper(func):
- return lambda s, f=func: s.__class__(getattr(s._value, f)())
-
-def createOneArgWrapper(func):
- return lambda s, a, f=func: s.__class__(getattr(s._value, f)(a))
-
-def createOneOptArgWrapper(func):
- return lambda s, a=None, f=func: s.__class__(getattr(s._value, f)(a))
-
-simpleWrappedMethods = \
- "capitalize lower swapcase title upper".split()
-
-oneArgWrappedMethods = "center join ljust rjust".split()
-
-oneOptArgWrappedMethods = "lstrip rstrip strip".split()
-
-for f in simpleWrappedMethods:
- setattr(TaintedString, f, createSimpleWrapper(f))
-
-for f in oneArgWrappedMethods:
- setattr(TaintedString, f, createOneArgWrapper(f))
-
-for f in oneOptArgWrappedMethods:
- setattr(TaintedString, f, createOneOptArgWrapper(f))
+from zope.deferredimport import deprecated
+deprecated('Shared.TaintedString will be removed in Zope 2.14. Please '
+ 'import from AccessControl.tainted instead.',
+ TaintedString = 'AccessControl.tainted:TaintedString',
+ createSimpleWrapper = 'AccessControl.tainted:createSimpleWrapper',
+ createOneArgWrapper = 'AccessControl.tainted:createOneArgWrapper',
+ createOneOptArgWrapper = 'AccessControl.tainted:createOneOptArgWrapper',
+)
Deleted: Zope/trunk/src/Shared/TaintedString/tests.py
===================================================================
--- Zope/trunk/src/Shared/TaintedString/tests.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/Shared/TaintedString/tests.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -1,164 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2002 Zope Foundation and Contributors.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-""" TaintedString tests.
-
-$Id$
-"""
-
-import unittest
-
-class TestTaintedString(unittest.TestCase):
-
- def setUp(self):
- self.unquoted = '<test attr="&">'
- self.quoted = '<test attr="&">'
- self.tainted = self._getClass()(self.unquoted)
-
- def _getClass(self):
- from Shared.TaintedString import TaintedString
- return TaintedString
-
- def testStr(self):
- self.assertEquals(str(self.tainted), self.unquoted)
-
- def testRepr(self):
- self.assertEquals(repr(self.tainted), repr(self.quoted))
-
- def testCmp(self):
- self.assertEquals(cmp(self.tainted, self.unquoted), 0)
- self.assertEquals(cmp(self.tainted, 'a'), -1)
- self.assertEquals(cmp(self.tainted, '.'), 1)
-
- def testHash(self):
- hash = {}
- hash[self.tainted] = self.quoted
- hash[self.unquoted] = self.unquoted
- self.assertEquals(hash[self.tainted], self.unquoted)
-
- def testLen(self):
- self.assertEquals(len(self.tainted), len(self.unquoted))
-
- def testGetItem(self):
- self.assert_(isinstance(self.tainted[0], self._getClass()))
- self.assertEquals(self.tainted[0], '<')
- self.failIf(isinstance(self.tainted[-1], self._getClass()))
- self.assertEquals(self.tainted[-1], '>')
-
- def testGetSlice(self):
- self.assert_(isinstance(self.tainted[0:1], self._getClass()))
- self.assertEquals(self.tainted[0:1], '<')
- self.failIf(isinstance(self.tainted[1:], self._getClass()))
- self.assertEquals(self.tainted[1:], self.unquoted[1:])
-
- def testConcat(self):
- self.assert_(isinstance(self.tainted + 'test', self._getClass()))
- self.assertEquals(self.tainted + 'test', self.unquoted + 'test')
- self.assert_(isinstance('test' + self.tainted, self._getClass()))
- self.assertEquals('test' + self.tainted, 'test' + self.unquoted)
-
- def testMultiply(self):
- self.assert_(isinstance(2 * self.tainted, self._getClass()))
- self.assertEquals(2 * self.tainted, 2 * self.unquoted)
- self.assert_(isinstance(self.tainted * 2, self._getClass()))
- self.assertEquals(self.tainted * 2, self.unquoted * 2)
-
- def testInterpolate(self):
- tainted = self._getClass()('<%s>')
- self.assert_(isinstance(tainted % 'foo', self._getClass()))
- self.assertEquals(tainted % 'foo', '<foo>')
- tainted = self._getClass()('<%s attr="%s">')
- self.assert_(isinstance(tainted % ('foo', 'bar'), self._getClass()))
- self.assertEquals(tainted % ('foo', 'bar'), '<foo attr="bar">')
-
- def testStringMethods(self):
- simple = "capitalize isalpha isdigit islower isspace istitle isupper" \
- " lower lstrip rstrip strip swapcase upper".split()
- returnsTainted = "capitalize lower lstrip rstrip strip swapcase upper"
- returnsTainted = returnsTainted.split()
- unquoted = '\tThis is a test '
- tainted = self._getClass()(unquoted)
- for f in simple:
- v = getattr(tainted, f)()
- self.assertEquals(v, getattr(unquoted, f)())
- if f in returnsTainted:
- self.assert_(isinstance(v, self._getClass()))
- else:
- self.failIf(isinstance(v, self._getClass()))
-
- optArg = "lstrip rstrip strip".split()
- for f in optArg:
- v = getattr(tainted, f)(" ")
- self.assertEquals(v, getattr(unquoted, f)(" "))
- self.assert_(isinstance(v, self._getClass()))
-
- justify = "center ljust rjust".split()
- for f in justify:
- v = getattr(tainted, f)(30)
- self.assertEquals(v, getattr(unquoted, f)(30))
- self.assert_(isinstance(v, self._getClass()))
-
- searches = "find index rfind rindex endswith startswith".split()
- searchraises = "index rindex".split()
- for f in searches:
- v = getattr(tainted, f)('test')
- self.assertEquals(v, getattr(unquoted, f)('test'))
- if f in searchraises:
- self.assertRaises(ValueError, getattr(tainted, f), 'nada')
-
- self.assertEquals(tainted.count('test', 1, -1),
- unquoted.count('test', 1, -1))
-
- self.assertEquals(tainted.encode(), unquoted.encode())
- self.assert_(isinstance(tainted.encode(), self._getClass()))
-
- self.assertEquals(tainted.expandtabs(10),
- unquoted.expandtabs(10))
- self.assert_(isinstance(tainted.expandtabs(), self._getClass()))
-
- self.assertEquals(tainted.replace('test', 'spam'),
- unquoted.replace('test', 'spam'))
- self.assert_(isinstance(tainted.replace('test', '<'), self._getClass()))
- self.failIf(isinstance(tainted.replace('test', 'spam'),
- self._getClass()))
-
- self.assertEquals(tainted.split(), unquoted.split())
- for part in self._getClass()('< < <').split():
- self.assert_(isinstance(part, self._getClass()))
- for part in tainted.split():
- self.failIf(isinstance(part, self._getClass()))
-
- multiline = 'test\n<tainted>'
- lines = self._getClass()(multiline).split()
- self.assertEquals(lines, multiline.split())
- self.assert_(isinstance(lines[1], self._getClass()))
- self.failIf(isinstance(lines[0], self._getClass()))
-
- transtable = ''.join(map(chr, range(256)))
- self.assertEquals(tainted.translate(transtable),
- unquoted.translate(transtable))
- self.assert_(isinstance(self._getClass()('<').translate(transtable),
- self._getClass()))
- self.failIf(isinstance(self._getClass()('<').translate(transtable, '<'),
- self._getClass()))
-
- def testQuoted(self):
- self.assertEquals(self.tainted.quoted(), self.quoted)
-
-
-def test_suite():
- suite = unittest.TestSuite()
- suite.addTest(unittest.makeSuite(TestTaintedString))
- return suite
-
-if __name__ == '__main__':
- unittest.main(defaultTest='test_suite')
Modified: Zope/trunk/src/ZPublisher/HTTPRequest.py
===================================================================
--- Zope/trunk/src/ZPublisher/HTTPRequest.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/ZPublisher/HTTPRequest.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -38,7 +38,7 @@
from zope.publisher.base import DebugFlags
from zope.publisher.interfaces.browser import IBrowserRequest
-from Shared.TaintedString import TaintedString
+from AccessControl.tainted import TaintedString
from ZPublisher.BaseRequest import BaseRequest
from ZPublisher.BaseRequest import quote
from ZPublisher.Converters import get_converter
Modified: Zope/trunk/src/ZPublisher/TaintedString.py
===================================================================
--- Zope/trunk/src/ZPublisher/TaintedString.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/ZPublisher/TaintedString.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -11,12 +11,10 @@
#
##############################################################################
"""TaintedString legacy module.
-
-$Id$
"""
from zope.deferredimport import deprecated
deprecated('ZPublisher.TaintedString will be removed in Zope 2.14. Please '
- 'import from Shared.TaintedString instead.',
- TaintedString = 'Shared.TaintedString:TaintedString',
+ 'import from AccessControl.tainted instead.',
+ TaintedString = 'AccessControl.tainted:TaintedString',
)
Modified: Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py
===================================================================
--- Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py 2010-06-05 16:12:31 UTC (rev 113151)
+++ Zope/trunk/src/ZPublisher/tests/testHTTPRequest.py 2010-06-05 16:25:50 UTC (rev 113152)
@@ -71,7 +71,7 @@
# Also raises an Assertion if a string which *should* have been
# tainted is found, or when a tainted string is not deemed dangerous.
from ZPublisher.HTTPRequest import record
- from Shared.TaintedString import TaintedString
+ from AccessControl.tainted import TaintedString
retval = 0
More information about the Zope-Checkins
mailing list