From aa70854c09a1e287342e830318c873131bf9744f Mon Sep 17 00:00:00 2001 From: "Harry (Open ERP)" Date: Tue, 6 Apr 2010 16:41:32 +0530 Subject: [IMP] document_webdav: removed DAV and refactore code bzr revid: hmo@tinyerp.com-20100406111132-9bscvnb6aojdvioo --- addons/document_webdav/webdav_server.py | 140 +++++++++++++++++++++++++++++--- 1 file changed, 130 insertions(+), 10 deletions(-) (limited to 'addons/document_webdav/webdav_server.py') 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 result element + + We differ between the good props and the bad ones for + each generating an extra -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) -- cgit v1.2.3 From 565d1a18c737021cde9e0faa7b5718ae04992972 Mon Sep 17 00:00:00 2001 From: "Harry (Open ERP)" Date: Mon, 12 Apr 2010 16:22:00 +0530 Subject: [REF+IMP] caldav bzr revid: hmo@tinyerp.com-20100412105200-c3kvao81ypbh8l0g --- addons/document_webdav/webdav_server.py | 96 ++------------------------------- 1 file changed, 3 insertions(+), 93 deletions(-) (limited to 'addons/document_webdav/webdav_server.py') diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py index f2c129dd608..6cda2d172ef 100644 --- a/addons/document_webdav/webdav_server.py +++ b/addons/document_webdav/webdav_server.py @@ -29,102 +29,11 @@ import netsvc import tools -from dav_fs import tinydav_handler +from dav_fs import openerp_dav_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 result element - - We differ between the good props and the bad ones for - each generating an extra -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: @@ -136,6 +45,7 @@ def OpenDAVConfig(**kw): return Config() + class DAVHandler(FixSendError,DAVRequestHandler): verbose = False @@ -162,7 +72,7 @@ class DAVHandler(FixSendError,DAVRequestHandler): def setup(self): 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) + self.IFACE_CLASS = openerp_dav_handler(self, self.verbose) def log_message(self, format, *args): -- cgit v1.2.3 From 5c3cf27f2fa72cd64c54e6241f10b86a089d357a Mon Sep 17 00:00:00 2001 From: "Harry (Open ERP)" Date: Wed, 21 Apr 2010 19:04:02 +0530 Subject: [IMP] caldav bzr revid: hmo@tinyerp.com-20100421133402-191nwwj3nohx6zas --- addons/document_webdav/webdav_server.py | 82 ++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) (limited to 'addons/document_webdav/webdav_server.py') diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py index 6cda2d172ef..5f88f90cf11 100644 --- a/addons/document_webdav/webdav_server.py +++ b/addons/document_webdav/webdav_server.py @@ -33,7 +33,10 @@ from dav_fs import openerp_dav_handler from tools.config import config from DAV.WebDAVServer import DAVRequestHandler from service.websrv_lib import HTTPDir,FixSendError - +import urlparse +import urllib +from string import atoi,split +from DAV.errors import * def OpenDAVConfig(**kw): class OpenDAV: @@ -81,6 +84,83 @@ class DAVHandler(FixSendError,DAVRequestHandler): def log_error(self, format, *args): netsvc.Logger().notifyChannel('xmlrpc',netsvc.LOG_WARNING,format % args) + def do_PUT(self): + dc=self.IFACE_CLASS + uri=urlparse.urljoin(self.get_baseuri(dc), self.path) + uri=urllib.unquote(uri) + # Handle If-Match + if self.headers.has_key('If-Match'): + test = False + etag = None + + for match in self.headers['If-Match'].split(','): + if match == '*': + if dc.exists(uri): + test = True + break + else: + if dc.match_prop(uri, match, "DAV:", "getetag"): + test = True + break + if not test: + self.send_status(412) + return + + # Handle If-None-Match + if self.headers.has_key('If-None-Match'): + test = True + etag = None + for match in self.headers['If-None-Match'].split(','): + if match == '*': + if dc.exists(uri): + test = False + break + else: + if dc.match_prop(uri, match, "DAV:", "getetag"): + test = False + break + if not test: + self.send_status(412) + return + + # Handle expect + expect = self.headers.get('Expect', '') + if (expect.lower() == '100-continue' and + self.protocol_version >= 'HTTP/1.1' and + self.request_version >= 'HTTP/1.1'): + self.send_status(100) + self._flush() + + # read the body + body=None + if self.headers.has_key("Content-Length"): + l=self.headers['Content-Length'] + body=self.rfile.read(atoi(l)) + + # locked resources are not allowed to be overwritten + if self._l_isLocked(uri): + return self.send_body(None, '423', 'Locked', 'Locked') + + ct=None + if self.headers.has_key("Content-Type"): + ct=self.headers['Content-Type'] + try: + location = dc.put(uri,body,ct) + except DAV_Error, (ec,dd): + return self.send_status(ec) + + headers = {} + if location: + headers['Location'] = location + + try: + etag = dc.get_prop(location or uri, "DAV:", "getetag") + headers['ETag'] = etag + except: + pass + + self.send_body(None, '201', 'Created', '', headers=headers) + try: from service.http_server import reg_http_service,OpenERPAuthProvider -- cgit v1.2.3