Log message for revision 76721:
  Tests 15 (propnullns) and 16 (propget) from the props suite
  of litmus version 10.5 (http://www.webdav.org/neon/litmus/)
  expose a bug in Zope propertysheet access via DAV.  If a
  proppatch command sets a property with a null xmlns,
  e.g. with a PROPPATCH body like:
  
  <?xml version="1.0" encoding="utf-8" ?>
  <propertyupdate xmlns="DAV:">
  <set>
  <prop>
   <nonamespace xmlns="">randomvalue</nonamespace>
  </prop>
  </set>
  </propertyupdate>
  
  When we set properties in the null namespace, Zope turns
  around and creates (or finds) a propertysheet with the
  xml_namespace of None and sets the value on it.  The
  response to a subsequent PROPFIND for the resource will fail
  because the XML generated by dav__propstat included a bogus
  namespace declaration (xmlns="None").
  
  Fixed by amending OFS.PropertySheets.dav__propstat.
  
  

Changed:
  U   Zope/trunk/doc/CHANGES.txt
  U   Zope/trunk/lib/python/OFS/PropertySheets.py
  U   Zope/trunk/lib/python/OFS/tests/testProperties.py

-=-
Modified: Zope/trunk/doc/CHANGES.txt
===================================================================
--- Zope/trunk/doc/CHANGES.txt  2007-06-16 11:40:18 UTC (rev 76720)
+++ Zope/trunk/doc/CHANGES.txt  2007-06-16 20:37:33 UTC (rev 76721)
@@ -97,6 +97,11 @@
 
     Bugs Fixed
 
+      - When Zope properties were set via DAV in the "null" namespace
+        (xmlns="") a subsequent PROPFIND for the property would cause the 
+        XML representation for that property to show a namespace of 
+        xmlns="None".  Fixed within OFS.PropertySheets.dav__propstat.
+
       - Relaxed requirements for context of
         Products.Five.browser.pagetemplatefile.ZopeTwoPageTemplateFile,
         to reduce barriers for testing renderability of views which use them.

Modified: Zope/trunk/lib/python/OFS/PropertySheets.py
===================================================================
--- Zope/trunk/lib/python/OFS/PropertySheets.py 2007-06-16 11:40:18 UTC (rev 
76720)
+++ Zope/trunk/lib/python/OFS/PropertySheets.py 2007-06-16 20:37:33 UTC (rev 
76721)
@@ -363,7 +363,10 @@
         xml_id=self.xml_namespace()
         propdict=self._propdict()
         if not propdict.has_key(name):
-            prop='<n:%s xmlns:n="%s"/>\n' % (name, xml_id)
+            if xml_id:
+                prop='<n:%s xmlns:n="%s"/>\n' % (name, xml_id)
+            else:
+                prop='<%s xmlns=""/>\n' % name
             code='404 Not Found'
             if not result.has_key(code):
                 result[code]=[prop]
@@ -388,8 +391,12 @@
                 attrs=''
                 if not hasattr(self, 'dav__%s' % name):
                     value = xml_escape(value)
-            prop='<n:%s%s xmlns:n="%s">%s</n:%s>\n' % (
-                name, attrs, xml_id, value, name)
+            if xml_id:
+                prop='<n:%s%s xmlns:n="%s">%s</n:%s>\n' % (
+                    name, attrs, xml_id, value, name)
+            else:
+                prop ='<%s%s xmlns="">%s</%s>\n' % (
+                    name, attrs, value, name)
             code='200 OK'
             if not result.has_key(code):
                 result[code]=[prop]

Modified: Zope/trunk/lib/python/OFS/tests/testProperties.py
===================================================================
--- Zope/trunk/lib/python/OFS/tests/testProperties.py   2007-06-16 11:40:18 UTC 
(rev 76720)
+++ Zope/trunk/lib/python/OFS/tests/testProperties.py   2007-06-16 20:37:33 UTC 
(rev 76721)
@@ -76,7 +76,51 @@
         self.failUnless(type(inst.getProperty('prop2')) == type(()))
         self.failUnless(type(inst.prop2) == type(()))
 
+    def test_dav__propstat_nullns(self):
+        # Tests 15 (propnullns) and 16 (propget) from the props suite
+        # of litmus version 10.5 (http://www.webdav.org/neon/litmus/)
+        # expose a bug in Zope propertysheet access via DAV.  If a
+        # proppatch command sets a property with a null xmlns,
+        # e.g. with a PROPPATCH body like:
+        #
+        # <?xml version="1.0" encoding="utf-8" ?>
+        # <propertyupdate xmlns="DAV:">
+        # <set>
+        # <prop>
+        # <nonamespace xmlns="">randomvalue</nonamespace>
+        # </prop>
+        # </set>
+        # </propertyupdate>
+        #
+        # When we set properties in the null namespace, Zope turns
+        # around and creates (or finds) a propertysheet with the
+        # xml_namespace of None and sets the value on it.  The
+        # response to a subsequent PROPFIND for the resource will fail
+        # because the XML generated by dav__propstat included a bogus
+        # namespace declaration (xmlns="None").
+        #
+        inst = self._makeOne('foo')
 
+        inst._md = {'xmlns':None}
+        resultd = {}
+        inst._setProperty('foo', 'bar')
+        inst.dav__propstat('foo', resultd)
+        self.assertEqual(len(resultd['200 OK']), 1)
+        self.assertEqual(resultd['200 OK'][0], '<foo xmlns="">bar</foo>\n')
+
+    def test_dav__propstat_notnullns(self):
+        # see test_dav__propstat_nullns
+        inst = self._makeOne('foo')
+
+        inst._md = {'xmlns':'http://www.example.com/props'}
+        resultd = {}
+        inst._setProperty('foo', 'bar')
+        inst.dav__propstat('foo', resultd)
+        self.assertEqual(len(resultd['200 OK']), 1)
+        self.assertEqual(resultd['200 OK'][0],
+                         '<n:foo xmlns:n="http://www.example.com/props";>bar'
+                         '</n:foo>\n')
+
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(TestPropertyManager),

_______________________________________________
Zope-Checkins maillist  -  Zope-Checkins@zope.org
http://mail.zope.org/mailman/listinfo/zope-checkins

Reply via email to