diff options
-rwxr-xr-x | sleekxmpp/componentxmpp.py | 8 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/matcher/xmlmask.py | 3 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/matcher/xpath.py | 18 |
3 files changed, 27 insertions, 2 deletions
diff --git a/sleekxmpp/componentxmpp.py b/sleekxmpp/componentxmpp.py index 72111e3c..078a1d3f 100755 --- a/sleekxmpp/componentxmpp.py +++ b/sleekxmpp/componentxmpp.py @@ -22,6 +22,14 @@ from __future__ import absolute_import from . basexmpp import basexmpp from xml.etree import cElementTree as ET + +# some servers use different namespaces for components -- this is a hack, but is there for compatibility +import xmlstream.matcher.xmlmask +import xmlstream.matcher.xpath +xmlstream.matcher.xmlmask.ignore_ns = True +xmlstream.matcher.xpath.ignore_ns = True +# ---------- + from . xmlstream.xmlstream import XMLStream from . xmlstream.xmlstream import RestartStream from . xmlstream.matcher.xmlmask import MatchXMLMask diff --git a/sleekxmpp/xmlstream/matcher/xmlmask.py b/sleekxmpp/xmlstream/matcher/xmlmask.py index 02a644cb..30cb13bb 100644 --- a/sleekxmpp/xmlstream/matcher/xmlmask.py +++ b/sleekxmpp/xmlstream/matcher/xmlmask.py @@ -2,6 +2,8 @@ from . import base from xml.etree import cElementTree from xml.parsers.expat import ExpatError +ignore_ns = False + class MatchXMLMask(base.MatcherBase): def __init__(self, criteria): @@ -19,6 +21,7 @@ class MatchXMLMask(base.MatcherBase): def maskcmp(self, source, maskobj, use_ns=False, default_ns='__no_ns__'): """maskcmp(xmlobj, maskobj): Compare etree xml object to etree xml object mask""" + use_ns = not ignore_ns #TODO require namespaces if source == None: #if element not found (happens during recursive check below) return False diff --git a/sleekxmpp/xmlstream/matcher/xpath.py b/sleekxmpp/xmlstream/matcher/xpath.py index b141dd87..060d5df3 100644 --- a/sleekxmpp/xmlstream/matcher/xpath.py +++ b/sleekxmpp/xmlstream/matcher/xpath.py @@ -1,11 +1,25 @@ from . import base from xml.etree import cElementTree +ignore_ns = False + class MatchXPath(base.MatcherBase): def match(self, xml): x = cElementTree.Element('x') x.append(xml) - if x.find(self._criteria) is not None: + if not ignore_ns: + if x.find(self._criteria) is not None: + return True + return False + else: + criteria = [c.split('}')[-1] for c in self._criteria.split('/')] + xml = x + for tag in criteria: + children = [c.tag.split('}')[-1] for c in xml.getchildren()] + try: + idx = children.index(tag) + except ValueError: + return False + xml = xml.getchildren()[idx] return True - return False |