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 _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org https://mail.zope.org/mailman/listinfo/zope-checkins