summaryrefslogtreecommitdiff
path: root/addons/document_webdav/webdav_server.py
diff options
context:
space:
mode:
authorHarry (Open ERP) <hmo@tinyerp.com>2010-04-06 18:04:29 +0530
committerHarry (Open ERP) <hmo@tinyerp.com>2010-04-06 18:04:29 +0530
commit85c42e9270d9689e08b2864a5292ae801ecbfd67 (patch)
treed013befdb389847c9320f980f4e8ec824fda3bee /addons/document_webdav/webdav_server.py
parentd07c7bc4d6f85d593071e1d5a4900771d32545d1 (diff)
parentaa70854c09a1e287342e830318c873131bf9744f (diff)
[MERGE]
bzr revid: hmo@tinyerp.com-20100406123429-hu7m4lnflo0amjr5
Diffstat (limited to 'addons/document_webdav/webdav_server.py')
-rw-r--r--addons/document_webdav/webdav_server.py140
1 files changed, 130 insertions, 10 deletions
diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py
index 15e8e030824..f2c129dd608 100644
--- a/addons/document_webdav/webdav_server.py
+++ b/addons/document_webdav/webdav_server.py
@@ -28,10 +28,113 @@
import netsvc
+import tools
from dav_fs import tinydav_handler
from tools.config import config
from DAV.WebDAVServer import DAVRequestHandler
from service.websrv_lib import HTTPDir,FixSendError
+from DAV.propfind import PROPFIND
+
+import xml.dom.minidom
+domimpl = xml.dom.minidom.getDOMImplementation()
+import urlparse
+import urllib
+from DAV import utils
+
+super_mk_prop_response = PROPFIND.mk_prop_response
+def mk_prop_response(self,uri,good_props,bad_props,doc):
+ """ make a new <prop> result element
+
+ We differ between the good props and the bad ones for
+ each generating an extra <propstat>-Node (for each error
+ one, that means).
+
+ """
+ re=doc.createElement("D:response")
+ # append namespaces to response
+ nsnum=0
+ for nsname in self.namespaces:
+ re.setAttribute("xmlns:ns"+str(nsnum),nsname)
+ nsnum=nsnum+1
+
+ # write href information
+ uparts=urlparse.urlparse(uri)
+ fileloc=uparts[2]
+ href=doc.createElement("D:href")
+ huri=doc.createTextNode(uparts[0]+'://'+'/'.join(uparts[1:2]) + urllib.quote(fileloc))
+ href.appendChild(huri)
+ re.appendChild(href)
+
+ # write good properties
+ ps=doc.createElement("D:propstat")
+ if good_props:
+ re.appendChild(ps)
+
+ gp=doc.createElement("D:prop")
+ for ns in good_props.keys():
+ ns_prefix="ns"+str(self.namespaces.index(ns))+":"
+ for p,v in good_props[ns].items():
+ if not v:
+ pass
+ pe=doc.createElement(ns_prefix+str(p))
+ if hasattr(v, '__class__') and v.__class__.__name__ == 'Element':
+ pe.appendChild(v)
+ else:
+ if p=="resourcetype":
+ if v==1:
+ ve=doc.createElement("D:collection")
+ pe.appendChild(ve)
+ else:
+ ve=doc.createTextNode(tools.ustr(v))
+ pe.appendChild(ve)
+
+ gp.appendChild(pe)
+
+ ps.appendChild(gp)
+ s=doc.createElement("D:status")
+ t=doc.createTextNode("HTTP/1.1 200 OK")
+ s.appendChild(t)
+ ps.appendChild(s)
+ re.appendChild(ps)
+
+ # now write the errors!
+ if len(bad_props.items()):
+
+ # write a propstat for each error code
+ for ecode in bad_props.keys():
+ ps=doc.createElement("D:propstat")
+ re.appendChild(ps)
+ bp=doc.createElement("D:prop")
+ ps.appendChild(bp)
+
+ for ns in bad_props[ecode].keys():
+ ns_prefix="ns"+str(self.namespaces.index(ns))+":"
+
+ for p in bad_props[ecode][ns]:
+ pe=doc.createElement(ns_prefix+str(p))
+ bp.appendChild(pe)
+
+ s=doc.createElement("D:status")
+ t=doc.createTextNode(utils.gen_estring(ecode))
+ s.appendChild(t)
+ ps.appendChild(s)
+ re.appendChild(ps)
+
+ # return the new response element
+ return re
+
+
+PROPFIND.mk_prop_response = mk_prop_response
+
+def OpenDAVConfig(**kw):
+ class OpenDAV:
+ def __init__(self, **kw):
+ self.__dict__.update(**kw)
+
+ class Config:
+ DAV = OpenDAV(**kw)
+
+ return Config()
class DAVHandler(FixSendError,DAVRequestHandler):
verbose = False
@@ -43,16 +146,24 @@ class DAVHandler(FixSendError,DAVRequestHandler):
netsvc.Logger().notifyChannel("webdav",netsvc.LOG_DEBUG,message)
def handle(self):
- pass
+ self._init_buffer()
def finish(self):
pass
+ def get_db_from_path(self, uri):
+ if uri or uri == '/':
+ dbs = self.IFACE_CLASS.db_list()
+ res = len(dbs) and dbs[0] or False
+ else:
+ res = self.IFACE_CLASS.get_db(uri)
+ return res
+
def setup(self):
- davpath = '/'+config.get_misc('webdav','vdir','webdav')+'/'
- self.baseuri = "http://%s:%d%s"% (self.server.server_name,self.server.server_port,davpath)
- self.IFACE_CLASS = tinydav_handler(self)
- pass
+ davpath = '/'+config.get_misc('webdav','vdir','webdav')
+ self.baseuri = "http://%s:%d/"% (self.server.server_name,self.server.server_port)
+ self.IFACE_CLASS = tinydav_handler(self, self.verbose)
+
def log_message(self, format, *args):
netsvc.Logger().notifyChannel('webdav',netsvc.LOG_DEBUG_RPC,format % args)
@@ -62,14 +173,23 @@ class DAVHandler(FixSendError,DAVRequestHandler):
try:
- from service.http_server import reg_http_service,OpenERPAuthProvider
+ from service.http_server import reg_http_service,OpenERPAuthProvider
+
if (config.get_misc('webdav','enable',True)):
- davpath = '/'+config.get_misc('webdav','vdir','webdav')+'/'
+ directory = '/'+config.get_misc('webdav','vdir','webdav')
handler = DAVHandler
- handler.verbose = config.get_misc('webdav','verbose',True)
+ verbose = config.get_misc('webdav','verbose',True)
handler.debug = config.get_misc('webdav','debug',True)
- reg_http_service(HTTPDir(davpath,DAVHandler,OpenERPAuthProvider()))
- netsvc.Logger().notifyChannel('webdav',netsvc.LOG_INFO,"WebDAV service registered at path: %s/ "% davpath)
+ _dc = { 'verbose' : verbose,
+ 'directory' : directory,
+ 'lockemulation' : False,
+
+ }
+
+ conf = OpenDAVConfig(**_dc)
+ handler._config = conf
+ reg_http_service(HTTPDir(directory,DAVHandler,OpenERPAuthProvider()))
+ netsvc.Logger().notifyChannel('webdav',netsvc.LOG_INFO,"WebDAV service registered at path: %s/ "% directory)
except Exception, e:
logger = netsvc.Logger()
logger.notifyChannel('webdav', netsvc.LOG_ERROR, 'Cannot launch webdav: %s' % e)