Commit b97ac428 authored by 's avatar

Added logic to App's __bobo_traverse__ to support DAV, fixed

a bug that affected COPY in specific overwrite situations, added
a borg-specific header to dissuade ie5 from sending multiple
requests to see if we have FrontPage extensions.
parent 6e8f5d10
...@@ -85,8 +85,8 @@ ...@@ -85,8 +85,8 @@
__doc__='''Application support __doc__='''Application support
$Id: Application.py,v 1.95 1999/03/25 17:06:06 jim Exp $''' $Id: Application.py,v 1.96 1999/03/26 19:50:37 brian Exp $'''
__version__='$Revision: 1.95 $'[11:-2] __version__='$Revision: 1.96 $'[11:-2]
import Globals,Folder,os,regex,sys,App.Product, App.ProductRegistry, misc_ import Globals,Folder,os,regex,sys,App.Product, App.ProductRegistry, misc_
...@@ -96,6 +96,7 @@ from DateTime import DateTime ...@@ -96,6 +96,7 @@ from DateTime import DateTime
from AccessControl.User import UserFolder from AccessControl.User import UserFolder
from HelpSys.HelpSys import HelpSys from HelpSys.HelpSys import HelpSys
from App.ApplicationManager import ApplicationManager from App.ApplicationManager import ApplicationManager
from webdav.NullResource import NullResource
from Globals import Persistent from Globals import Persistent
from FindSupport import FindSupport from FindSupport import FindSupport
from urllib import quote from urllib import quote
...@@ -222,14 +223,16 @@ class Application(Globals.ApplicationDefaultPermissions, Folder.Folder, ...@@ -222,14 +223,16 @@ class Application(Globals.ApplicationDefaultPermissions, Folder.Folder,
try: self._p_jar.cache.incrgc() # Perform incremental GC try: self._p_jar.cache.incrgc() # Perform incremental GC
except: pass except: pass
try: return getattr(self, name) try: return getattr(self, name)
except AttributeError: except AttributeError: pass
try: return self[name] try: return self[name]
except KeyError: except KeyError: pass
raise 'NotFound',( method=REQUEST.get('REQUEST_METHOD', 'GET')
"Sorry, the requested document does not exist.<p>" if not method in ('GET', 'POST'):
"\n<!--\n%s\n%s\n-->" % (name,REQUEST['REQUEST_METHOD'])) return NullResource(self, name, REQUEST).__of__(self)
raise 'NotFound',(
"Sorry, the requested document does not exist.<p>"
"\n<!--\n%s\n%s\n-->" % (name, method))
def PrincipiaTime(self, *args): def PrincipiaTime(self, *args):
"""Utility function to return current date/time""" """Utility function to return current date/time"""
......
...@@ -84,14 +84,15 @@ ...@@ -84,14 +84,15 @@
############################################################################## ##############################################################################
__doc__="""Object Manager __doc__="""Object Manager
$Id: ObjectManager.py,v 1.57 1999/03/25 15:45:46 jim Exp $""" $Id: ObjectManager.py,v 1.58 1999/03/26 19:50:37 brian Exp $"""
__version__='$Revision: 1.57 $'[11:-2] __version__='$Revision: 1.58 $'[11:-2]
import App.Management, Acquisition, App.Undo, Globals, CopySupport import App.Management, Acquisition, App.Undo, Globals, CopySupport
import App.FactoryDispatcher, ts_regex import App.FactoryDispatcher, ts_regex
from Globals import HTMLFile, HTMLFile, Persistent from Globals import HTMLFile, HTMLFile, Persistent
from Globals import MessageDialog, default__class_init__ from Globals import MessageDialog, default__class_init__
from webdav.NullResource import NullResource
from urllib import quote from urllib import quote
bad_id=ts_regex.compile('[^a-zA-Z0-9-_~\,\. ]').match bad_id=ts_regex.compile('[^a-zA-Z0-9-_~\,\. ]').match
...@@ -463,10 +464,10 @@ class ObjectManager( ...@@ -463,10 +464,10 @@ class ObjectManager(
mtime=self.bobobase_modification_time().timeTime() mtime=self.bobobase_modification_time().timeTime()
return marshal.dumps((mode,0,0,1,0,0,0,mtime,mtime,mtime)) return marshal.dumps((mode,0,0,1,0,0,0,mtime,mtime,mtime))
def __getitem__(self, key): def __getitem__(self, key):
v=self._getOb(key, None) v=self._getOb(key, None)
if v is not None: return v if v is not None: return v
if hasattr(self, 'REQUEST'): if hasattr(self, 'REQUEST'):
request=self.REQUEST request=self.REQUEST
method=request.get('REQUEST_METHOD', 'GET') method=request.get('REQUEST_METHOD', 'GET')
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
############################################################################## ##############################################################################
"""Property sheets""" """Property sheets"""
__version__='$Revision: 1.32 $'[11:-2] __version__='$Revision: 1.33 $'[11:-2]
import time, string, App.Management, Globals import time, string, App.Management, Globals
from ZPublisher.Converters import type_converters from ZPublisher.Converters import type_converters
...@@ -257,8 +257,10 @@ class PropertySheet(Persistent, Implicit): ...@@ -257,8 +257,10 @@ class PropertySheet(Persistent, Implicit):
def propertyMap(self): def propertyMap(self):
# Return a tuple of mappings, giving meta-data for properties. # Return a tuple of mappings, giving meta-data for properties.
__traceback_info__=(`self`, `self.p_self()`, `self.id`, `self.xml_namespace()`, `hasattr(self.p_self(), '__propsets__')`)
return self.p_self()._properties return self.p_self()._properties
def _propdict(self): def _propdict(self):
dict={} dict={}
for p in self.propertyMap(): for p in self.propertyMap():
......
...@@ -85,11 +85,12 @@ ...@@ -85,11 +85,12 @@
"""WebDAV support - collection objects.""" """WebDAV support - collection objects."""
__version__='$Revision: 1.12 $'[11:-2] __version__='$Revision: 1.13 $'[11:-2]
import sys, os, string import sys, os, string, Globals
from Resource import Resource
from common import urlfix, rfc1123_date from common import urlfix, rfc1123_date
from Resource import Resource
class Collection(Resource): class Collection(Resource):
...@@ -103,7 +104,8 @@ class Collection(Resource): ...@@ -103,7 +104,8 @@ class Collection(Resource):
__ac_permissions__=( __ac_permissions__=(
('Add Documents, Images, and Files', ('PUT',)), ('Add Documents, Images, and Files', ('PUT',)),
('Add Folders', ('MKCOL',)), # ('Add Folders', ('MKCOL',)),
('Delete objects', ('DELETE',)),
) )
def dav__init(self, request, response): def dav__init(self, request, response):
...@@ -117,6 +119,7 @@ class Collection(Resource): ...@@ -117,6 +119,7 @@ class Collection(Resource):
response.setHeader('Content-Location', location) response.setHeader('Content-Location', location)
response.setHeader('Connection', 'close', 1) response.setHeader('Connection', 'close', 1)
response.setHeader('Date', rfc1123_date(), 1) response.setHeader('Date', rfc1123_date(), 1)
response.setHeader('MS-Author-Via', 'DAV')
def PUT(self, REQUEST, RESPONSE): def PUT(self, REQUEST, RESPONSE):
"""The PUT method has no inherent meaning for collection """The PUT method has no inherent meaning for collection
...@@ -139,3 +142,5 @@ class Collection(Resource): ...@@ -139,3 +142,5 @@ class Collection(Resource):
RESPONSE.setStatus(204) RESPONSE.setStatus(204)
return RESPONSE return RESPONSE
Globals.default__class_init__(Collection)
...@@ -85,9 +85,9 @@ ...@@ -85,9 +85,9 @@
"""WebDAV support - null resource objects.""" """WebDAV support - null resource objects."""
__version__='$Revision: 1.16 $'[11:-2] __version__='$Revision: 1.17 $'[11:-2]
import sys, os, string, mimetypes import sys, os, string, mimetypes, Globals
import Acquisition, OFS.content_types import Acquisition, OFS.content_types
from common import absattr, aq_base, urlfix from common import absattr, aq_base, urlfix
from AccessControl.Permission import Permission from AccessControl.Permission import Permission
...@@ -101,6 +101,15 @@ class NullResource(Persistent, Acquisition.Implicit, Resource): ...@@ -101,6 +101,15 @@ class NullResource(Persistent, Acquisition.Implicit, Resource):
__null_resource__=1 __null_resource__=1
__ac_permissions__=(
('View', ('HEAD',)),
('Access contents information', ('PROPFIND',)),
('Manage properties', ('PROPPATCH',)),
('Add Documents, Images, and Files', ('PUT',)),
('Add Folders', ('MKCOL',)),
('Delete objects', ('DELETE',)),
)
def __init__(self, parent, name, request=None): def __init__(self, parent, name, request=None):
self.__name__=name self.__name__=name
self.__parent__=parent self.__parent__=parent
...@@ -175,3 +184,6 @@ class NullResource(Persistent, Acquisition.Implicit, Resource): ...@@ -175,3 +184,6 @@ class NullResource(Persistent, Acquisition.Implicit, Resource):
"""Remove a lock-null resource.""" """Remove a lock-null resource."""
self.dav__init(REQUEST, RESPONSE) self.dav__init(REQUEST, RESPONSE)
raise 'Method Not Allowed', 'Method not supported for this resource.' raise 'Method Not Allowed', 'Method not supported for this resource.'
Globals.default__class_init__(NullResource)
...@@ -85,11 +85,11 @@ ...@@ -85,11 +85,11 @@
"""WebDAV support - resource objects.""" """WebDAV support - resource objects."""
__version__='$Revision: 1.23 $'[11:-2] __version__='$Revision: 1.24 $'[11:-2]
import sys, os, string, mimetypes, davcmds, ExtensionClass import sys, os, string, mimetypes, davcmds, ExtensionClass
from common import absattr, aq_base, urlfix, rfc1123_date from common import absattr, aq_base, urlfix, rfc1123_date
import Globals
class Resource(ExtensionClass.Base): class Resource(ExtensionClass.Base):
"""The Resource mixin class provides basic WebDAV support for """The Resource mixin class provides basic WebDAV support for
...@@ -108,8 +108,10 @@ class Resource(ExtensionClass.Base): ...@@ -108,8 +108,10 @@ class Resource(ExtensionClass.Base):
__ac_permissions__=( __ac_permissions__=(
('View', ('HEAD',)), ('View', ('HEAD',)),
('Access contents information', ('PROPFIND',)), ('Access contents information', ('PROPFIND',)),
('Delete objects', ('DELETE',)),
('Manage properties', ('PROPPATCH',)), ('Manage properties', ('PROPPATCH',)),
('Add Documents, Images, and Files', ('PUT',)),
('Delete objects', ('DELETE',)),
('Add Folders', ('MKCOL',)),
) )
def dav__init(self, request, response): def dav__init(self, request, response):
...@@ -215,7 +217,7 @@ class Resource(ExtensionClass.Base): ...@@ -215,7 +217,7 @@ class Resource(ExtensionClass.Base):
def PROPPATCH(self, REQUEST, RESPONSE): def PROPPATCH(self, REQUEST, RESPONSE):
"""Set and/or remove properties defined on the resource.""" """Set and/or remove properties defined on the resource."""
self.dav__init(REQUEST, RESPONSE) self.dav__init(REQUEST, RESPONSE)
if not hasattr(self, '__propsets__'): if not hasattr(aq_base(self), 'propertysheets'):
raise 'Method Not Allowed', ( raise 'Method Not Allowed', (
'Method not supported for this resource.') 'Method not supported for this resource.')
# TODO: add lock checking here # TODO: add lock checking here
...@@ -280,7 +282,7 @@ class Resource(ExtensionClass.Base): ...@@ -280,7 +282,7 @@ class Resource(ExtensionClass.Base):
ob._delObject(id) ob._delObject(id)
if existing: if existing:
object=getattr(parent, name) object=getattr(parent, name)
obj.dav__validate(object, 'DELETE', request) self.dav__validate(object, 'DELETE', REQUEST)
parent._delObject(name) parent._delObject(name)
parent._setObject(name, ob) parent._setObject(name, ob)
ob=ob.__of__(parent) ob=ob.__of__(parent)
...@@ -359,3 +361,6 @@ class Resource(ExtensionClass.Base): ...@@ -359,3 +361,6 @@ class Resource(ExtensionClass.Base):
"""Remove an existing lock on a resource.""" """Remove an existing lock on a resource."""
self.dav__init(REQUEST, RESPONSE) self.dav__init(REQUEST, RESPONSE)
raise 'Method Not Allowed', 'Method not supported for this resource.' raise 'Method Not Allowed', 'Method not supported for this resource.'
Globals.default__class_init__(Resource)
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
"""WebDAV xml request objects.""" """WebDAV xml request objects."""
__version__='$Revision: 1.3 $'[11:-2] __version__='$Revision: 1.4 $'[11:-2]
import sys, os, string, regex import sys, os, string, regex
from common import absattr, aq_base, urlfix from common import absattr, aq_base, urlfix
...@@ -103,21 +103,13 @@ class DAVProps(DAVProperties): ...@@ -103,21 +103,13 @@ class DAVProps(DAVProperties):
self.__obj__=obj self.__obj__=obj
def v_self(self): def v_self(self):
return self.__obj__ return self.__obj__
p_self=v_self
## file=open('/projects/users/davtest/var/debug.out', 'w')
## def debug(r):
## file.write(str(r))
## file.write('\n')
## file.write(r.get('BODY', 'No body'))
## file.write('\n\n')
## file.flush()
class PropFind: class PropFind:
"""Model a PROPFIND request.""" """Model a PROPFIND request."""
def __init__(self, request): def __init__(self, request):
# debug(request)
self.request=request self.request=request
self.depth='infinity' self.depth='infinity'
self.allprop=0 self.allprop=0
...@@ -164,7 +156,7 @@ class PropFind: ...@@ -164,7 +156,7 @@ class PropFind:
iscol=hasattr(obj, '__dav_collection__') iscol=hasattr(obj, '__dav_collection__')
if iscol and url[-1] != '/': url=url+'/' if iscol and url[-1] != '/': url=url+'/'
result.write('<d:response>\n<d:href>%s</d:href>\n' % url) result.write('<d:response>\n<d:href>%s</d:href>\n' % url)
if hasattr(obj, '__propsets__'): if hasattr(aq_base(obj), 'propertysheets'):
propsets=obj.propertysheets.values() propsets=obj.propertysheets.values()
obsheets=obj.propertysheets obsheets=obj.propertysheets
else: else:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment