summaryrefslogtreecommitdiff
path: root/addons/document_webdav/webdav.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/document_webdav/webdav.py')
-rw-r--r--addons/document_webdav/webdav.py350
1 files changed, 0 insertions, 350 deletions
diff --git a/addons/document_webdav/webdav.py b/addons/document_webdav/webdav.py
deleted file mode 100644
index aedad059c16..00000000000
--- a/addons/document_webdav/webdav.py
+++ /dev/null
@@ -1,350 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
-# Copyright (c) 1999 Christian Scholz (ruebe@aachen.heimat.de)
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-import logging
-
-_logger = logging.getLogger(__name__)
-import xml.dom.minidom
-domimpl = xml.dom.minidom.getDOMImplementation()
-from xml.dom.minicompat import StringTypes
-
-import urlparse
-import urllib
-from openerp.osv import osv
-from openerp.tools.translate import _
-
-try:
- from pywebdav.lib import utils
- from pywebdav.lib.propfind import PROPFIND
- from pywebdav.lib.report import REPORT
-except ImportError:
- from DAV import utils
- from DAV.propfind import PROPFIND
- from DAV.report import REPORT
-
-from openerp import tools
-
-class Text2(xml.dom.minidom.Text):
- def writexml(self, writer, indent="", addindent="", newl=""):
- data = "%s%s%s" % (indent, self.data, newl)
- data = data.replace("&", "&amp;").replace("<", "&lt;")
- data = data.replace(">", "&gt;")
- writer.write(data)
-
-class Prop2xml(object):
- """ A helper class to convert property structs to DAV:XML
-
- Written to generalize the use of _prop_child(), a class is
- needed to hold some persistent data accross the recursions
- of _prop_elem_child().
- """
-
- def __init__(self, doc, namespaces, nsnum):
- """ Init the structure
- @param doc the xml doc element
- @param namespaces a dict of namespaces
- @param nsnum the next namespace number to define
- """
- self.doc = doc
- self.namespaces = namespaces
- self.nsnum = nsnum
-
- def createText2Node(self, data):
- if not isinstance(data, StringTypes):
- raise TypeError, "Node contents must be a string."
- t = Text2()
- t.data = data
- t.ownerDocument = self.doc
- return t
-
- def _prop_child(self, xnode, ns, prop, value):
- """Append a property xml node to xnode, with <prop>value</prop>
-
- And a little smarter than that, it will consider namespace and
- also allow nested properties etc.
-
- :param ns the namespace of the <prop/> node
- :param prop the name of the property
- :param value the value. Can be:
- string: text node
- tuple ('elem', 'ns') for empty sub-node <ns:elem />
- tuple ('elem', 'ns', sub-elems) for sub-node with elements
- tuple ('elem', 'ns', sub-elems, {attrs}) for sub-node with
- optional elements and attributes
- list, of above tuples
- """
- if ns == 'DAV:':
- ns_prefix = 'D:'
- else:
- ns_prefix="ns"+str(self.namespaces.index(ns))+":"
-
- pe = self.doc.createElement(ns_prefix+str(prop))
- if hasattr(value, '__class__') and value.__class__.__name__ == 'Element':
- pe.appendChild(value)
- else:
- if ns == 'DAV:' and prop=="resourcetype" and isinstance(value, int):
- # hack, to go..
- if value == 1:
- ve = self.doc.createElement("D:collection")
- pe.appendChild(ve)
- else:
- self._prop_elem_child(pe, ns, value, ns_prefix)
-
- xnode.appendChild(pe)
-
- def _prop_elem_child(self, pnode, pns, v, pns_prefix):
-
- if isinstance(v, list):
- for vit in v:
- self._prop_elem_child(pnode, pns, vit, pns_prefix)
- elif isinstance(v,tuple):
- need_ns = False
- if v[1] == pns:
- ns_prefix = pns_prefix
- elif v[1] == 'DAV:':
- ns_prefix = 'D:'
- elif v[1] in self.namespaces:
- ns_prefix="ns"+str(self.namespaces.index(v[1]))+":"
- else:
- ns_prefix="ns"+str(self.nsnum)+":"
- need_ns = True
-
- ve = self.doc.createElement(ns_prefix+v[0])
- if need_ns:
- ve.setAttribute("xmlns:ns"+str(self.nsnum), v[1])
- if len(v) > 2 and v[2] is not None:
- if isinstance(v[2], (list, tuple)):
- # support nested elements like:
- # ( 'elem', 'ns:', [('sub-elem1', 'ns1'), ...]
- self._prop_elem_child(ve, v[1], v[2], ns_prefix)
- else:
- vt = self.createText2Node(tools.ustr(v[2]))
- ve.appendChild(vt)
- if len(v) > 3 and v[3]:
- assert isinstance(v[3], dict)
- for ak, av in v[3].items():
- ve.setAttribute(ak, av)
- pnode.appendChild(ve)
- else:
- ve = self.createText2Node(tools.ustr(v))
- pnode.appendChild(ve)
-
-
-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
- namespaces = self.namespaces[:]
- if 'DAV:' in namespaces:
- namespaces.remove('DAV:')
- for nsname in namespaces:
- re.setAttribute("xmlns:ns"+str(nsnum),nsname)
- nsnum=nsnum+1
-
- propgen = Prop2xml(doc, namespaces, nsnum)
- # write href information
- uparts=urlparse.urlparse(uri)
- fileloc=uparts[2]
- if uparts[3]:
- fileloc += ';' + uparts[3]
- if isinstance(fileloc, unicode):
- fileloc = fileloc.encode('utf-8')
- href=doc.createElement("D:href")
- davpath = self._dataclass.parent.get_davpath()
- if uparts[0] and uparts[1]:
- hurl = '%s://%s%s%s' % (uparts[0], uparts[1], davpath, urllib.quote(fileloc))
- else:
- # When the request has been relative, we don't have enough data to
- # reply with absolute url here.
- hurl = '%s%s' % (davpath, urllib.quote(fileloc))
- huri=doc.createTextNode(hurl)
- href.appendChild(huri)
- re.appendChild(href)
-
- # write good properties
- ps=doc.createElement("D:propstat")
- if good_props:
- re.appendChild(ps)
- s=doc.createElement("D:status")
- t=doc.createTextNode("HTTP/1.1 200 OK")
- s.appendChild(t)
- ps.appendChild(s)
-
- gp=doc.createElement("D:prop")
- for ns in good_props.keys():
- if ns == 'DAV:':
- ns_prefix = 'D:'
- else:
- ns_prefix="ns"+str(namespaces.index(ns))+":"
- for p,v in good_props[ns].items():
- if v is None:
- continue
- propgen._prop_child(gp, ns, p, v)
-
- ps.appendChild(gp)
- 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)
- s=doc.createElement("D:status")
- t=doc.createTextNode(utils.gen_estring(ecode))
- s.appendChild(t)
- ps.appendChild(s)
- bp=doc.createElement("D:prop")
- ps.appendChild(bp)
-
- for ns in bad_props[ecode].keys():
- if ns == 'DAV:':
- ns_prefix='D:'
- else:
- 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)
-
- re.appendChild(ps)
-
- # return the new response element
- return re
-
-
-def mk_propname_response(self, uri, propnames, doc):
- """ make a new <prop> result element for a PROPNAME request
-
- This will simply format the propnames list.
- propnames should have the format {NS1 : [prop1, prop2, ...], NS2: ...}
-
- """
- re=doc.createElement("D:response")
-
- # write href information
- uparts=urlparse.urlparse(uri)
- fileloc=uparts[2]
- if uparts[3]:
- fileloc += ';' + uparts[3]
- if isinstance(fileloc, unicode):
- fileloc = fileloc.encode('utf-8')
- href=doc.createElement("D:href")
- davpath = self._dataclass.parent.get_davpath()
- if uparts[0] and uparts[1]:
- hurl = '%s://%s%s%s' % (uparts[0], uparts[1], davpath, urllib.quote(fileloc))
- else:
- # When the request has been relative, we don't have enough data to
- # reply with absolute url here.
- hurl = '%s%s' % (davpath, urllib.quote(fileloc))
- huri=doc.createTextNode(hurl)
- href.appendChild(huri)
- re.appendChild(href)
-
- ps=doc.createElement("D:propstat")
- nsnum=0
-
- for ns,plist in propnames.items():
- # write prop element
- pr=doc.createElement("D:prop")
- if ns == 'DAV':
- nsp = 'D'
- else:
- nsp="ns"+str(nsnum)
- ps.setAttribute("xmlns:"+nsp,ns)
- nsnum=nsnum+1
-
- # write propertynames
- for p in plist:
- pe=doc.createElement(nsp+":"+p)
- pr.appendChild(pe)
-
- ps.appendChild(pr)
-
- re.appendChild(ps)
-
- return re
-
-PROPFIND.mk_prop_response = mk_prop_response
-PROPFIND.mk_propname_response = mk_propname_response
-
-def mk_lock_response(self, uri, props):
- """ Prepare the data response to a DAV LOCK command
-
- This function is here, merely to be in the same file as the
- ones above, that have similar code.
- """
- doc = domimpl.createDocument('DAV:', "D:prop", None)
- ms = doc.documentElement
- ms.setAttribute("xmlns:D", "DAV:")
- # ms.tagName = 'D:multistatus'
- namespaces = []
- nsnum = 0
- propgen = Prop2xml(doc, namespaces, nsnum)
- # write href information
- uparts=urlparse.urlparse(uri)
- fileloc=uparts[2]
- if uparts[3]:
- fileloc += ';' + uparts[3]
- if isinstance(fileloc, unicode):
- fileloc = fileloc.encode('utf-8')
- davpath = self.parent.get_davpath()
- if uparts[0] and uparts[1]:
- hurl = '%s://%s%s%s' % (uparts[0], uparts[1], davpath, urllib.quote(fileloc))
- else:
- # When the request has been relative, we don't have enough data to
- # reply with absolute url here.
- hurl = '%s%s' % (davpath, urllib.quote(fileloc))
-
- props.append( ('lockroot', 'DAV:', ('href', 'DAV:', (hurl))))
- pld = doc.createElement('D:lockdiscovery')
- ms.appendChild(pld)
- propgen._prop_child(pld, 'DAV:', 'activelock', props)
-
- return doc.toxml(encoding="utf-8")
-
-super_create_prop = REPORT.create_prop
-
-def create_prop(self):
- try:
- if (self.filter is not None) and self._depth == "0":
- hrefs = self.filter.getElementsByTagNameNS('DAV:', 'href')
- if hrefs:
- self._depth = "1"
- except Exception:
- pass
- return super_create_prop(self)
-
-REPORT.create_prop = create_prop
-
-#eof
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: