[Zope-Checkins] CVS: Zope2 - davcmds.py:1.8.98.5

chrism@serenade.digicool.com chrism@serenade.digicool.com
Mon, 9 Apr 2001 14:23:12 -0400


Update of /cvs-repository/Zope2/lib/python/webdav
In directory serenade.digicool.com:/home/chrism/sandboxes/DAVFTPMerge/lib/python/webdav

Modified Files:
      Tag: zope-2_3-branch
	davcmds.py 
Log Message:
Undoing branch changes from FTP merge.



--- Updated File davcmds.py in package Zope2 --
--- davcmds.py	2001/04/09 18:08:26	1.8.98.4
+++ davcmds.py	2001/04/09 18:23:11	1.8.98.5
@@ -90,13 +90,9 @@
 import sys, os, string, regex
 from common import absattr, aq_base, urlfix, urlbase
 from OFS.PropertySheets import DAVProperties
-from LockItem import LockItem
-from WriteLockInterface import WriteLockInterface
-from Acquisition import aq_parent
 from xmltools import XmlParser
 from cStringIO import StringIO
 from urllib import quote
-from AccessControl import getSecurityManager
 
 def safe_quote(url, mark=r'%', find=string.find):
     if find(url, mark) > -1:
@@ -213,14 +209,8 @@
         result.write('</d:response>\n')        
         if depth in ('1', 'infinity') and iscol:
             for ob in obj.objectValues():
-                try:
-                    ob.meta_type=='Broken Because Product is Gone': continue
-                except: pass
                 dflag=hasattr(ob, '_p_changed') and (ob._p_changed == None)
-                if hasattr(ob, '__locknull_resource__'):
-                    # Do nothing, a null resource shouldn't show up to DAV
-                    if dflag: ob._p_deactivate()
-                elif hasattr(ob, '__dav_resource__'):
+                if hasattr(ob, '__dav_resource__'):
                     uri=os.path.join(url, absattr(ob.id))
                     depth=depth=='infinity' and depth or 0
                     self.apply(ob, uri, depth, result, top=0)
@@ -348,220 +338,23 @@
 class Lock:
     """Model a LOCK request."""
     def __init__(self, request):
-        self.request = request
-        data = request.get('BODY', '')
-        self.scope = 'exclusive'
-        self.type = 'write'
-        self.owner = ''
-        timeout = request.get_header('Timeout', 'Infinite')
-        self.timeout = string.strip(string.split(timeout,',')[-1])
+        self.request=request
+        data=request.get('BODY', '')
+        self.scope='exclusive'
+        self.type='write'
+        self.owner=''
         self.parse(data)
 
     def parse(self, data, dav='DAV:'):
-        root = XmlParser().parse(data)
-        info = root.elements('lockinfo', ns=dav)[0]
-        ls = info.elements('lockscope', ns=dav)[0]
-        self.scope = ls.elements()[0].name()
-        lt = info.elements('locktype', ns=dav)[0]
-        self.type = lt.elements()[0].name()
-
-        lockowner = info.elements('owner', ns=dav)
-        if lockowner:
-            # Since the Owner element may contain children in different
-            # namespaces (or none at all), we have to find them for potential
-            # remapping.  Note that Cadaver doesn't use namespaces in the
-            # XML it sends.
-            lockowner = lockowner[0]
-            for el in lockowner.elements():
-                name, elns = el.name(), el.namespace()
-                if not elns:
-                    # There's no namespace, so we have to add one
-                    lockowner.remap({dav:'ot'})
-                    el.__nskey__ = 'ot'
-                    for subel in el.elements():
-                        if not subel.namespace():
-                            el.__nskey__ = 'ot'
-                else:
-                    el.remap({dav:'o'})
-            self.owner = lockowner.strval()
+        root=XmlParser().parse(data)
+        info=root.elements('lockinfo', ns=dav)[0]
+        ls=info.elements('lockscope', ns=dav)[0]
+        self.scope=ls.elements()[0].name()
+        lt=info.elements('locktype', ns=dav)[0]
+        self.type=lt.elements()[0].name()
+        lo=info.elements('owner', ns=dav)
+        if lo: self.owner=lo[0].toxml()
 
-    def apply(self, obj, creator=None, depth='infinity', token=None,
-              result=None, url=None, top=1):
-        """ Apply, built for recursion (so that we may lock subitems
-        of a collection if requested """
-        if result is None:
-            result = StringIO()
-            url = urlfix(self.request['URL'], 'LOCK')
-            url = urlbase(url)
-        iscol = hasattr(obj, '__dav_collection__')
-        if iscol and url[-1] != '/': url = url + '/'
-        errmsg = None
-        lock = None
-
-        try:
-            lock = LockItem(creator, self.owner, depth, self.timeout,
-                            self.type, self.scope, token)
-            if token is None: token = lock.getLockToken()
-        except ValueError, valerrors:
-            errmsg = "412 Precondition Failed"
-        except:
-            errmsg = "403 Forbidden"
-
-        try:
-            if not WriteLockInterface.isImplementedBy(obj):
-                if top:
-                    # This is the top level object in the apply, so we
-                    # do want an error
-                    errmsg = "405 Method Not Allowed"
-                else:
-                    # We're in an infinity request and a subobject does
-                    # not support locking, so we'll just pass
-                    pass
-            elif obj.wl_isLocked():
-                errmsg = "423 Locked"
-            else:
-                method = getattr(obj, 'wl_setLock')
-                vld = getSecurityManager().validate(None, obj, 'wl_setLock',
-                                                    method)
-                if vld and token and (lock is not None):
-                    obj.wl_setLock(token, lock)
-                else:
-                    errmsg = "403 Forbidden"
-        except:
-            errmsg = "403 Forbidden"
-            
-        if errmsg:
-            if top and ((depth in (0, '0')) or (not iscol)):
-                # We don't need to raise multistatus errors
-                raise errmsg[4:]
-            elif not result.getvalue():
-                # We haven't had any errors yet, so our result is empty
-                # and we need to set up the XML header
-                result.write('<?xml version="1.0" encoding="utf-8" ?>\n' \
-                             '<d:multistatus xmlns:d="DAV:">\n')
-            result.write('<d:response>\n <d:href>%s</d:href>\n' % url)
-            result.write(' <d:status>HTTP/1.1 %s</d:status>\n' % errmsg)
-            result.write('</d:response>\n')
-
-        if depth == 'infinity' and iscol:
-            for ob in obj.objectValues():
-                if hasattr(obj, '__dav_resource__'):
-                    uri = os.path.join(url, absattr(ob.id))
-                    self.apply(ob, creator, depth, token, result,
-                               uri, top=0)
-        if not top: return token, result
-        if result.getvalue():
-            # One or more subitems probably failed, so close the multistatus
-            # element and clear out all succesful locks
-            result.write('</d:multistatus>')
-            get_transaction().abort() # This *SHOULD* clear all succesful locks
-        return token, result.getvalue()
-    
 
-class Unlock:
-    """ Model an Unlock request """
 
-    def apply(self, obj, token, url=None, result=None, top=1):
-        if result is None:
-            result = StringIO()
-            url = urlfix(url, 'UNLOCK')
-            url = urlbase(url)
-        iscol = hasattr(obj, '__dav_collection__')
-        if iscol and url[-1] != '/': url = url + '/'
-        errmsg = None
-
-        islockable = WriteLockInterface.isImplementedBy(obj)
-
-        if islockable and obj.wl_hasLock(token):
-            method = getattr(obj, 'wl_delLock')
-            vld = getSecurityManager().validate(None,obj,'wl_delLock',method)
-            if vld: obj.wl_delLock(token)
-            else: errmsg = "403 Forbidden"
-        elif not islockable:
-            # Only set an error message if the command is being applied
-            # to a top level object.  Otherwise, we're descending a tree
-            # which may contain many objects that don't implement locking,
-            # so we just want to avoid them
-            if top: errmsg = "405 Method Not Allowed"
-
-        if errmsg:
-            if top and (not iscol):
-                # We don't need to raise multistatus errors
-                if errmsg[:3] == '403': raise "Forbidden"
-                else: raise "Precondition Failed"
-            elif not result.getvalue():
-                # We haven't had any errors yet, so our result is empty
-                # and we need to set up the XML header
-                result.write('<?xml version="1.0" encoding="utf-8" ?>\n' \
-                             '<d:multistatus xmlns:d="DAV:">\n')
-            result.write('<d:response>\n <d:href>%s</d:href>\n' % url)
-            result.write(' <d:status>HTTP/1.1 %s</d:status>\n' % errmsg)
-            result.write('</d:response>\n')
 
-        if iscol:
-            for ob in obj.objectValues():
-                if hasattr(ob, '__dav_resource__') and \
-                   WriteLockInterface.isImplementedBy(ob):
-                    uri = os.path.join(url, absattr(ob.id))
-                    self.apply(ob, token, uri, result, top=0)
-        if not top: return result
-        if result.getvalue():
-            # One or more subitems probably failed, so close the multistatus
-            # element and clear out all succesful unlocks
-            result.write('</d:multistatus>')
-            get_transaction().abort()
-        return result.getvalue()
-    
-
-class DeleteCollection:
-    """ With WriteLocks in the picture, deleting a collection involves
-    checking *all* descendents (deletes on collections are always of depth
-    infinite) for locks and if the locks match. """
-
-    def apply(self, obj, token, user, url=None, result=None, top=1):
-        if result is None:
-            result = StringIO()
-            url = urlfix(url, 'DELETE')
-            url = urlbase(url)
-        iscol = hasattr(obj, '__dav_collection__')
-        errmsg = None
-        parent = aq_parent(obj)
-
-        islockable = WriteLockInterface.isImplementedBy(obj)
-        if parent and (not user.has_permission('Delete objects', parent)):
-            # User doesn't have permission to delete this object
-            errmsg = "403 Forbidden"
-        elif islockable and obj.wl_isLocked():
-            if token and obj.wl_hasLock(token):
-                # Object is locked, and the token matches (no error)
-                errmsg = ""
-            else:
-                errmsg = "423 Locked"
-
-        if errmsg:
-            if top and (not iscol):
-                err = errmsg[4:]
-                raise err
-            elif not result.getvalue():
-                # We haven't had any errors yet, so our result is empty
-                # and we need to set up the XML header
-                result.write('<?xml version="1.0" encoding="utf-8" ?>\n' \
-                             '<d:multistatus xmlns:d="DAV:">\n')
-            result.write('<d:response>\n <d:href>%s</d:href>\n' % url)
-            result.write(' <d:status>HTTP/1.1 %s</d:status>\n' % errmsg)
-            result.write('</d:response>\n')
-
-        if iscol:
-            for ob in obj.objectValues():
-                dflag = hasattr(ob,'_p_changed') and (ob._p_changed == None)
-                if hasattr(ob, '__dav_resource__'):
-                    uri = os.path.join(url, absattr(ob.id))
-                    self.apply(ob, token, user, uri, result, top=0)
-                    if dflag: ob._p_deactivate()
-        if not top: return result
-        if result.getvalue():
-            # One or more subitems can't be delted, so close the multistatus
-            # element
-            result.write('</d:multistatus>\n')
-        return result.getvalue()
-