mirror of
https://github.com/correl/SleekXMPP.git
synced 2024-11-23 19:19:53 +00:00
Merge branch 'develop' of github.com:fritzy/SleekXMPP into develop
This commit is contained in:
commit
6eac0606cf
8 changed files with 43 additions and 179 deletions
6
setup.py
6
setup.py
|
@ -74,11 +74,6 @@ packages = [ 'sleekxmpp',
|
||||||
'sleekxmpp/thirdparty/suelta/mechanisms',
|
'sleekxmpp/thirdparty/suelta/mechanisms',
|
||||||
]
|
]
|
||||||
|
|
||||||
if sys.version_info < (3, 0):
|
|
||||||
py_modules = ['sleekxmpp.xmlstream.tostring.tostring26']
|
|
||||||
else:
|
|
||||||
py_modules = ['sleekxmpp.xmlstream.tostring.tostring']
|
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name = "sleekxmpp",
|
name = "sleekxmpp",
|
||||||
version = VERSION,
|
version = VERSION,
|
||||||
|
@ -90,7 +85,6 @@ setup(
|
||||||
license = 'MIT',
|
license = 'MIT',
|
||||||
platforms = [ 'any' ],
|
platforms = [ 'any' ],
|
||||||
packages = packages,
|
packages = packages,
|
||||||
py_modules = py_modules,
|
|
||||||
requires = [ 'tlslite', 'pythondns' ],
|
requires = [ 'tlslite', 'pythondns' ],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
from pubsub import xep_0060
|
from sleekxmpp.plugins.xep_0060.pubsub import xep_0060
|
||||||
import stanza
|
from sleekxmpp.plugins.xep_0060 import stanza
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
from pubsub import Pubsub, Affiliation, Affiliations, Subscription, Subscriptions, SubscribeOptions, Item, Items, Create, Publish, Retract, Unsubscribe, Subscribe, Configure, Options, PubsubState, PubsubStateEvent
|
from sleekxmpp.plugins.xep_0060.stanza.pubsub import Pubsub, Affiliation, Affiliations, Subscription, Subscriptions, SubscribeOptions, Item, Items, Create, Publish, Retract, Unsubscribe, Subscribe, Configure, Options, PubsubState, PubsubStateEvent
|
||||||
from pubsub_owner import PubsubOwner, DefaultConfig, OwnerAffiliations, OwnerAffiliation, OwnerConfigure, OwnerDefault, OwnerDelete, OwnerPurge, OwnerRedirect, OwnerSubscriptions, OwnerSubscription
|
from sleekxmpp.plugins.xep_0060.stanza.pubsub_owner import PubsubOwner, DefaultConfig, OwnerAffiliations, OwnerAffiliation, OwnerConfigure, OwnerDefault, OwnerDelete, OwnerPurge, OwnerRedirect, OwnerSubscriptions, OwnerSubscription
|
||||||
from pubsub_event import Event, EventItem, EventRetract, EventItems, EventCollection, EventAssociate, EventDisassociate, EventConfiguration, EventPurge, EventSubscription
|
from sleekxmpp.plugins.xep_0060.stanza.pubsub_event import Event, EventItem, EventRetract, EventItems, EventCollection, EventAssociate, EventDisassociate, EventConfiguration, EventPurge, EventSubscription
|
||||||
|
|
|
@ -5,7 +5,7 @@ from sleekxmpp.basexmpp import basexmpp
|
||||||
from sleekxmpp.xmlstream.xmlstream import XMLStream
|
from sleekxmpp.xmlstream.xmlstream import XMLStream
|
||||||
import logging
|
import logging
|
||||||
from sleekxmpp.plugins import xep_0004
|
from sleekxmpp.plugins import xep_0004
|
||||||
from base import OptionalSetting
|
from sleekxmpp.plugins.xep_0060.stanza.base import OptionalSetting
|
||||||
|
|
||||||
|
|
||||||
class Pubsub(ElementBase):
|
class Pubsub(ElementBase):
|
||||||
|
@ -55,7 +55,7 @@ class Subscription(ElementBase):
|
||||||
|
|
||||||
def setjid(self, value):
|
def setjid(self, value):
|
||||||
self._setattr('jid', str(value))
|
self._setattr('jid', str(value))
|
||||||
|
|
||||||
def getjid(self):
|
def getjid(self):
|
||||||
return jid(self._getattr('jid'))
|
return jid(self._getattr('jid'))
|
||||||
|
|
||||||
|
@ -93,12 +93,12 @@ class Item(ElementBase):
|
||||||
|
|
||||||
def setPayload(self, value):
|
def setPayload(self, value):
|
||||||
self.xml.append(value)
|
self.xml.append(value)
|
||||||
|
|
||||||
def getPayload(self):
|
def getPayload(self):
|
||||||
childs = self.xml.getchildren()
|
childs = self.xml.getchildren()
|
||||||
if len(childs) > 0:
|
if len(childs) > 0:
|
||||||
return childs[0]
|
return childs[0]
|
||||||
|
|
||||||
def delPayload(self):
|
def delPayload(self):
|
||||||
for child in self.xml.getchildren():
|
for child in self.xml.getchildren():
|
||||||
self.xml.remove(child)
|
self.xml.remove(child)
|
||||||
|
@ -167,10 +167,10 @@ class Unsubscribe(ElementBase):
|
||||||
interfaces = set(('node', 'jid'))
|
interfaces = set(('node', 'jid'))
|
||||||
plugin_attrib_map = {}
|
plugin_attrib_map = {}
|
||||||
plugin_tag_map = {}
|
plugin_tag_map = {}
|
||||||
|
|
||||||
def setJid(self, value):
|
def setJid(self, value):
|
||||||
self._setAttr('jid', str(value))
|
self._setAttr('jid', str(value))
|
||||||
|
|
||||||
def getJid(self):
|
def getJid(self):
|
||||||
return JID(self._getAttr('jid'))
|
return JID(self._getAttr('jid'))
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ class Subscribe(ElementBase):
|
||||||
|
|
||||||
def setJid(self, value):
|
def setJid(self, value):
|
||||||
self._setAttr('jid', str(value))
|
self._setAttr('jid', str(value))
|
||||||
|
|
||||||
def getJid(self):
|
def getJid(self):
|
||||||
return JID(self._getAttr('jid'))
|
return JID(self._getAttr('jid'))
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ class Configure(ElementBase):
|
||||||
t = self._getAttr('type')
|
t = self._getAttr('type')
|
||||||
if not t: t == 'leaf'
|
if not t: t == 'leaf'
|
||||||
return t
|
return t
|
||||||
|
|
||||||
registerStanzaPlugin(Pubsub, Configure)
|
registerStanzaPlugin(Pubsub, Configure)
|
||||||
registerStanzaPlugin(Configure, xep_0004.Form)
|
registerStanzaPlugin(Configure, xep_0004.Form)
|
||||||
|
|
||||||
|
@ -215,28 +215,28 @@ class Options(ElementBase):
|
||||||
interfaces = set(('jid', 'node', 'options'))
|
interfaces = set(('jid', 'node', 'options'))
|
||||||
plugin_attrib_map = {}
|
plugin_attrib_map = {}
|
||||||
plugin_tag_map = {}
|
plugin_tag_map = {}
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
ElementBase.__init__(self, *args, **kwargs)
|
ElementBase.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
def getOptions(self):
|
def getOptions(self):
|
||||||
config = self.xml.find('{jabber:x:data}x')
|
config = self.xml.find('{jabber:x:data}x')
|
||||||
form = xep_0004.Form()
|
form = xep_0004.Form()
|
||||||
if config is not None:
|
if config is not None:
|
||||||
form.fromXML(config)
|
form.fromXML(config)
|
||||||
return form
|
return form
|
||||||
|
|
||||||
def setOptions(self, value):
|
def setOptions(self, value):
|
||||||
self.xml.append(value.getXML())
|
self.xml.append(value.getXML())
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def delOptions(self):
|
def delOptions(self):
|
||||||
config = self.xml.find('{jabber:x:data}x')
|
config = self.xml.find('{jabber:x:data}x')
|
||||||
self.xml.remove(config)
|
self.xml.remove(config)
|
||||||
|
|
||||||
def setJid(self, value):
|
def setJid(self, value):
|
||||||
self._setAttr('jid', str(value))
|
self._setAttr('jid', str(value))
|
||||||
|
|
||||||
def getJid(self):
|
def getJid(self):
|
||||||
return JID(self._getAttr('jid'))
|
return JID(self._getAttr('jid'))
|
||||||
|
|
||||||
|
@ -250,15 +250,15 @@ class PubsubState(ElementBase):
|
||||||
interfaces = set(('node', 'item', 'payload'))
|
interfaces = set(('node', 'item', 'payload'))
|
||||||
plugin_attrib_map = {}
|
plugin_attrib_map = {}
|
||||||
plugin_tag_map = {}
|
plugin_tag_map = {}
|
||||||
|
|
||||||
def setPayload(self, value):
|
def setPayload(self, value):
|
||||||
self.xml.append(value)
|
self.xml.append(value)
|
||||||
|
|
||||||
def getPayload(self):
|
def getPayload(self):
|
||||||
childs = self.xml.getchildren()
|
childs = self.xml.getchildren()
|
||||||
if len(childs) > 0:
|
if len(childs) > 0:
|
||||||
return childs[0]
|
return childs[0]
|
||||||
|
|
||||||
def delPayload(self):
|
def delPayload(self):
|
||||||
for child in self.xml.getchildren():
|
for child in self.xml.getchildren():
|
||||||
self.xml.remove(child)
|
self.xml.remove(child)
|
||||||
|
|
|
@ -5,8 +5,8 @@ from sleekxmpp.basexmpp import basexmpp
|
||||||
from sleekxmpp.xmlstream.xmlstream import XMLStream
|
from sleekxmpp.xmlstream.xmlstream import XMLStream
|
||||||
import logging
|
import logging
|
||||||
from sleekxmpp.plugins import xep_0004
|
from sleekxmpp.plugins import xep_0004
|
||||||
from base import OptionalSetting
|
from sleekxmpp.plugins.xep_0060.stanza.base import OptionalSetting
|
||||||
from pubsub import Affiliations, Affiliation, Configure, Subscriptions
|
from sleekxmpp.plugins.xep_0060.stanza.pubsub import Affiliations, Affiliation, Configure, Subscriptions
|
||||||
|
|
||||||
class PubsubOwner(ElementBase):
|
class PubsubOwner(ElementBase):
|
||||||
namespace = 'http://jabber.org/protocol/pubsub#owner'
|
namespace = 'http://jabber.org/protocol/pubsub#owner'
|
||||||
|
@ -25,7 +25,7 @@ class DefaultConfig(ElementBase):
|
||||||
interfaces = set(('node', 'type', 'config'))
|
interfaces = set(('node', 'type', 'config'))
|
||||||
plugin_attrib_map = {}
|
plugin_attrib_map = {}
|
||||||
plugin_tag_map = {}
|
plugin_tag_map = {}
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
ElementBase.__init__(self, *args, **kwargs)
|
ElementBase.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
|
@ -33,10 +33,10 @@ class DefaultConfig(ElementBase):
|
||||||
t = self._getAttr('type')
|
t = self._getAttr('type')
|
||||||
if not t: t = 'leaf'
|
if not t: t = 'leaf'
|
||||||
return t
|
return t
|
||||||
|
|
||||||
def getConfig(self):
|
def getConfig(self):
|
||||||
return self['form']
|
return self['form']
|
||||||
|
|
||||||
def setConfig(self, value):
|
def setConfig(self, value):
|
||||||
self['form'].setStanzaValues(value.getStanzaValues())
|
self['form'].setStanzaValues(value.getStanzaValues())
|
||||||
return self
|
return self
|
||||||
|
@ -49,7 +49,7 @@ class OwnerAffiliations(Affiliations):
|
||||||
interfaces = set(('node'))
|
interfaces = set(('node'))
|
||||||
plugin_attrib_map = {}
|
plugin_attrib_map = {}
|
||||||
plugin_tag_map = {}
|
plugin_tag_map = {}
|
||||||
|
|
||||||
def append(self, affiliation):
|
def append(self, affiliation):
|
||||||
if not isinstance(affiliation, OwnerAffiliation):
|
if not isinstance(affiliation, OwnerAffiliation):
|
||||||
raise TypeError
|
raise TypeError
|
||||||
|
@ -77,10 +77,10 @@ class OwnerDefault(OwnerConfigure):
|
||||||
interfaces = set(('node', 'config'))
|
interfaces = set(('node', 'config'))
|
||||||
plugin_attrib_map = {}
|
plugin_attrib_map = {}
|
||||||
plugin_tag_map = {}
|
plugin_tag_map = {}
|
||||||
|
|
||||||
def getConfig(self):
|
def getConfig(self):
|
||||||
return self['form']
|
return self['form']
|
||||||
|
|
||||||
def setConfig(self, value):
|
def setConfig(self, value):
|
||||||
self['form'].setStanzaValues(value.getStanzaValues())
|
self['form'].setStanzaValues(value.getStanzaValues())
|
||||||
return self
|
return self
|
||||||
|
@ -114,10 +114,10 @@ class OwnerRedirect(ElementBase):
|
||||||
interfaces = set(('node', 'jid'))
|
interfaces = set(('node', 'jid'))
|
||||||
plugin_attrib_map = {}
|
plugin_attrib_map = {}
|
||||||
plugin_tag_map = {}
|
plugin_tag_map = {}
|
||||||
|
|
||||||
def setJid(self, value):
|
def setJid(self, value):
|
||||||
self._setAttr('jid', str(value))
|
self._setAttr('jid', str(value))
|
||||||
|
|
||||||
def getJid(self):
|
def getJid(self):
|
||||||
return JID(self._getAttr('jid'))
|
return JID(self._getAttr('jid'))
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ class OwnerSubscriptions(Subscriptions):
|
||||||
interfaces = set(('node',))
|
interfaces = set(('node',))
|
||||||
plugin_attrib_map = {}
|
plugin_attrib_map = {}
|
||||||
plugin_tag_map = {}
|
plugin_tag_map = {}
|
||||||
|
|
||||||
def append(self, subscription):
|
def append(self, subscription):
|
||||||
if not isinstance(subscription, OwnerSubscription):
|
if not isinstance(subscription, OwnerSubscription):
|
||||||
raise TypeError
|
raise TypeError
|
||||||
|
@ -147,6 +147,6 @@ class OwnerSubscription(ElementBase):
|
||||||
|
|
||||||
def setJid(self, value):
|
def setJid(self, value):
|
||||||
self._setAttr('jid', str(value))
|
self._setAttr('jid', str(value))
|
||||||
|
|
||||||
def getJid(self):
|
def getJid(self):
|
||||||
return JID(self._getAttr('from'))
|
return JID(self._getAttr('from'))
|
||||||
|
|
|
@ -6,6 +6,11 @@
|
||||||
See the file LICENSE for copying permission.
|
See the file LICENSE for copying permission.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if sys.version_info < (3, 0):
|
||||||
|
import types
|
||||||
|
|
||||||
|
|
||||||
def tostring(xml=None, xmlns='', stanza_ns='', stream=None,
|
def tostring(xml=None, xmlns='', stanza_ns='', stream=None,
|
||||||
outbuffer='', top_level=False):
|
outbuffer='', top_level=False):
|
||||||
|
@ -103,6 +108,10 @@ def xml_escape(text):
|
||||||
Arguments:
|
Arguments:
|
||||||
text -- The XML text to convert.
|
text -- The XML text to convert.
|
||||||
"""
|
"""
|
||||||
|
if sys.version_info < (3, 0):
|
||||||
|
if type(text) != types.UnicodeType:
|
||||||
|
text = unicode(text, 'utf-8', 'ignore')
|
||||||
|
|
||||||
text = list(text)
|
text = list(text)
|
||||||
escapes = {'&': '&',
|
escapes = {'&': '&',
|
||||||
'<': '<',
|
'<': '<',
|
|
@ -1,19 +0,0 @@
|
||||||
"""
|
|
||||||
SleekXMPP: The Sleek XMPP Library
|
|
||||||
Copyright (C) 2010 Nathanael C. Fritz
|
|
||||||
This file is part of SleekXMPP.
|
|
||||||
|
|
||||||
See the file LICENSE for copying permission.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Import the correct tostring and xml_escape functions based on the Python
|
|
||||||
# version in order to properly handle Unicode.
|
|
||||||
|
|
||||||
if sys.version_info < (3, 0):
|
|
||||||
from sleekxmpp.xmlstream.tostring.tostring26 import tostring, xml_escape
|
|
||||||
else:
|
|
||||||
from sleekxmpp.xmlstream.tostring.tostring import tostring, xml_escape
|
|
||||||
|
|
||||||
__all__ = ['tostring', 'xml_escape']
|
|
|
@ -1,120 +0,0 @@
|
||||||
"""
|
|
||||||
SleekXMPP: The Sleek XMPP Library
|
|
||||||
Copyright (C) 2010 Nathanael C. Fritz
|
|
||||||
This file is part of SleekXMPP.
|
|
||||||
|
|
||||||
See the file LICENSE for copying permission.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
import types
|
|
||||||
|
|
||||||
|
|
||||||
def tostring(xml=None, xmlns='', stanza_ns='', stream=None,
|
|
||||||
outbuffer='', top_level=False):
|
|
||||||
"""
|
|
||||||
Serialize an XML object to a Unicode string.
|
|
||||||
|
|
||||||
If namespaces are provided using xmlns or stanza_ns, then elements
|
|
||||||
that use those namespaces will not include the xmlns attribute in
|
|
||||||
the output.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
xml -- The XML object to serialize. If the value is None,
|
|
||||||
then the XML object contained in this stanza
|
|
||||||
object will be used.
|
|
||||||
xmlns -- Optional namespace of an element wrapping the XML
|
|
||||||
object.
|
|
||||||
stanza_ns -- The namespace of the stanza object that contains
|
|
||||||
the XML object.
|
|
||||||
stream -- The XML stream that generated the XML object.
|
|
||||||
outbuffer -- Optional buffer for storing serializations during
|
|
||||||
recursive calls.
|
|
||||||
top_level -- Indicates that the element is the outermost
|
|
||||||
element.
|
|
||||||
"""
|
|
||||||
# Add previous results to the start of the output.
|
|
||||||
output = [outbuffer]
|
|
||||||
|
|
||||||
# Extract the element's tag name.
|
|
||||||
tag_name = xml.tag.split('}', 1)[-1]
|
|
||||||
|
|
||||||
# Extract the element's namespace if it is defined.
|
|
||||||
if '}' in xml.tag:
|
|
||||||
tag_xmlns = xml.tag.split('}', 1)[0][1:]
|
|
||||||
else:
|
|
||||||
tag_xmlns = u''
|
|
||||||
|
|
||||||
default_ns = ''
|
|
||||||
stream_ns = ''
|
|
||||||
if stream:
|
|
||||||
default_ns = stream.default_ns
|
|
||||||
stream_ns = stream.stream_ns
|
|
||||||
|
|
||||||
# Output the tag name and derived namespace of the element.
|
|
||||||
namespace = u''
|
|
||||||
if top_level and tag_xmlns not in ['', default_ns, stream_ns] or \
|
|
||||||
tag_xmlns not in ['', xmlns, stanza_ns, stream_ns]:
|
|
||||||
namespace = u' xmlns="%s"' % tag_xmlns
|
|
||||||
if stream and tag_xmlns in stream.namespace_map:
|
|
||||||
mapped_namespace = stream.namespace_map[tag_xmlns]
|
|
||||||
if mapped_namespace:
|
|
||||||
tag_name = u"%s:%s" % (mapped_namespace, tag_name)
|
|
||||||
output.append(u"<%s" % tag_name)
|
|
||||||
output.append(namespace)
|
|
||||||
|
|
||||||
# Output escaped attribute values.
|
|
||||||
for attrib, value in xml.attrib.items():
|
|
||||||
value = xml_escape(value)
|
|
||||||
if '}' not in attrib:
|
|
||||||
output.append(' %s="%s"' % (attrib, value))
|
|
||||||
else:
|
|
||||||
attrib_ns = attrib.split('}')[0][1:]
|
|
||||||
attrib = attrib.split('}')[1]
|
|
||||||
if stream and attrib_ns in stream.namespace_map:
|
|
||||||
mapped_ns = stream.namespace_map[attrib_ns]
|
|
||||||
if mapped_ns:
|
|
||||||
output.append(' %s:%s="%s"' % (mapped_ns,
|
|
||||||
attrib,
|
|
||||||
value))
|
|
||||||
|
|
||||||
if len(xml) or xml.text:
|
|
||||||
# If there are additional child elements to serialize.
|
|
||||||
output.append(u">")
|
|
||||||
if xml.text:
|
|
||||||
output.append(xml_escape(xml.text))
|
|
||||||
if len(xml):
|
|
||||||
for child in xml.getchildren():
|
|
||||||
output.append(tostring(child, tag_xmlns, stanza_ns, stream))
|
|
||||||
output.append(u"</%s>" % tag_name)
|
|
||||||
elif xml.text:
|
|
||||||
# If we only have text content.
|
|
||||||
output.append(u">%s</%s>" % (xml_escape(xml.text), tag_name))
|
|
||||||
else:
|
|
||||||
# Empty element.
|
|
||||||
output.append(u" />")
|
|
||||||
if xml.tail:
|
|
||||||
# If there is additional text after the element.
|
|
||||||
output.append(xml_escape(xml.tail))
|
|
||||||
return u''.join(output)
|
|
||||||
|
|
||||||
|
|
||||||
def xml_escape(text):
|
|
||||||
"""
|
|
||||||
Convert special characters in XML to escape sequences.
|
|
||||||
|
|
||||||
Arguments:
|
|
||||||
text -- The XML text to convert.
|
|
||||||
"""
|
|
||||||
if type(text) != types.UnicodeType:
|
|
||||||
text = list(unicode(text, 'utf-8', 'ignore'))
|
|
||||||
else:
|
|
||||||
text = list(text)
|
|
||||||
escapes = {u'&': u'&',
|
|
||||||
u'<': u'<',
|
|
||||||
u'>': u'>',
|
|
||||||
u"'": u''',
|
|
||||||
u'"': u'"'}
|
|
||||||
for i, c in enumerate(text):
|
|
||||||
text[i] = escapes.get(c, c)
|
|
||||||
return u''.join(text)
|
|
Loading…
Reference in a new issue