diff --git a/addons/document_webdav/dav_fs.py b/addons/document_webdav/dav_fs.py index 3805566f79d..f6dc92caf20 100644 --- a/addons/document_webdav/dav_fs.py +++ b/addons/document_webdav/dav_fs.py @@ -313,7 +313,7 @@ class openerp_dav_handler(dav_interface): self.parent.log_error("GET exception: %s",str(e)) self.parent.log_message("Exc: %s", traceback.format_exc()) raise DAV_Error, 409 - return datas + return str(datas) # FIXME! finally: if cr: cr.close() @@ -434,22 +434,27 @@ class openerp_dav_handler(dav_interface): if cr: cr.close() def mkcol(self,uri): - """ create a new collection """ + """ create a new collection + see par. 9.3 of rfc4918 + """ self.parent.log_message('MKCOL: %s' % uri) - uri = self.uri2local(uri)[1:] - if not uri: + cr, uid, pool, dbname, uri2 = self.get_cr(uri) + if not uri2[-1]: + cr.close() raise DAV_Error(409, "Cannot create nameless collection") - if uri[-1]=='/':uri=uri[:-1] - parent = '/'.join(uri.split('/')[:-1]) - parent = self.baseuri + parent - uri = self.baseuri + uri - cr, uid, pool,dbname, uri2 = self.get_cr(uri) if not dbname: + cr.close() raise DAV_Error, 409 node = self.uri2object(cr,uid,pool, uri2[:-1]) - if node: - node.create_child_collection(cr, uri2[-1]) - cr.commit() + if not node: + cr.close() + raise DAV_Error(409, "Parent path %s does not exist" % uri2[:-1]) + nc = node.child(cr, uri2[-1]) + if nc: + cr.close() + raise DAV_Error(405, "Path already exists") + self._try_function(node.create_child_collection, (cr, uri2[-1]), "create col %s" % uri2[-1], cr=cr) + cr.commit() cr.close() return True @@ -650,7 +655,6 @@ class openerp_dav_handler(dav_interface): advanced systems we might also have to copy properties from the source to the destination. """ - print " copy a collection." return self.mkcol(dst) diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py index b4cac5ffc70..9f9f2733a68 100644 --- a/addons/document_webdav/webdav_server.py +++ b/addons/document_webdav/webdav_server.py @@ -78,6 +78,18 @@ class DAVHandler(FixSendError,DAVRequestHandler): self.baseuri = "http://%s:%d/"% (self.server.server_name, self.server.server_port) self.IFACE_CLASS = openerp_dav_handler(self, self.verbose) + def copymove(self, CLASS): + """ Our uri scheme removes the /webdav/ component from there, so we + need to mangle the header, too. + """ + dest = self.headers['Destination'] + up = urlparse.urlparse(urllib.unquote(self.headers['Destination'])) + if up.path.startswith(self.davpath): + self.headers['Destination'] = up.path[len(self.davpath):] + else: + raise DAV_Forbidden("Not allowed to copy/move outside webdav path") + DAVRequestHandler.copymove(self, CLASS) + def get_davpath(self): return self.davpath