[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 = '&lt;test attr=&quot;&amp;&quot;&gt;'
+        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 = '&lt;test attr=&quot;&amp;&quot;&gt;'
-        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