Merge branch 'master' into develop

This commit is contained in:
Lance Stout 2012-07-30 09:08:58 -07:00
commit 44ce01a70b
12 changed files with 135 additions and 15 deletions

View File

@ -45,13 +45,11 @@ The latest source code for SleekXMPP may be found on `Github
``develop`` branch. ``develop`` branch.
**Latest Release** **Latest Release**
- `1.1.9 <http://github.com/fritzy/SleekXMPP/zipball/1.1.9>`_ - `1.1.10 <http://github.com/fritzy/SleekXMPP/zipball/1.1.10>`_
**Develop Releases** **Develop Releases**
- `Latest Develop Version <http://github.com/fritzy/SleekXMPP/zipball/develop>`_ - `Latest Develop Version <http://github.com/fritzy/SleekXMPP/zipball/develop>`_
**Older Stable Releases**
- `1.0 <http://github.com/fritzy/SleekXMPP/zipball/1.0>`_
Installing DNSPython Installing DNSPython
--------------------- ---------------------

View File

@ -83,6 +83,7 @@ packages = [ 'sleekxmpp',
'sleekxmpp/plugins/xep_0115', 'sleekxmpp/plugins/xep_0115',
'sleekxmpp/plugins/xep_0118', 'sleekxmpp/plugins/xep_0118',
'sleekxmpp/plugins/xep_0128', 'sleekxmpp/plugins/xep_0128',
'sleekxmpp/plugins/xep_0131',
'sleekxmpp/plugins/xep_0153', 'sleekxmpp/plugins/xep_0153',
'sleekxmpp/plugins/xep_0172', 'sleekxmpp/plugins/xep_0172',
'sleekxmpp/plugins/xep_0184', 'sleekxmpp/plugins/xep_0184',

View File

@ -29,7 +29,9 @@ ILLEGAL_CHARS = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r' + \
#: The basic regex pattern that a JID must match in order to determine #: The basic regex pattern that a JID must match in order to determine
#: the local, domain, and resource parts. This regex does NOT do any #: the local, domain, and resource parts. This regex does NOT do any
#: validation, which requires application of nodeprep, resourceprep, etc. #: validation, which requires application of nodeprep, resourceprep, etc.
JID_PATTERN = "^(?:([^\"&'/:<>@]{1,1023})@)?([^/@]{1,1023})(?:/(.{1,1023}))?$" JID_PATTERN = re.compile(
"^(?:([^\"&'/:<>@]{1,1023})@)?([^/@]{1,1023})(?:/(.{1,1023}))?$"
)
#: The set of escape sequences for the characters not allowed by nodeprep. #: The set of escape sequences for the characters not allowed by nodeprep.
JID_ESCAPE_SEQUENCES = set(['\\20', '\\22', '\\26', '\\27', '\\2f', JID_ESCAPE_SEQUENCES = set(['\\20', '\\22', '\\26', '\\27', '\\2f',
@ -118,7 +120,7 @@ def _parse_jid(data):
:returns: tuple of the validated local, domain, and resource strings :returns: tuple of the validated local, domain, and resource strings
""" """
match = re.match(JID_PATTERN, data) match = JID_PATTERN.match(data)
if not match: if not match:
raise InvalidJID('JID could not be parsed') raise InvalidJID('JID could not be parsed')

View File

@ -43,6 +43,7 @@ __all__ = [
'xep_0115', # Entity Capabilities 'xep_0115', # Entity Capabilities
'xep_0118', # User Tune 'xep_0118', # User Tune
'xep_0128', # Extended Service Discovery 'xep_0128', # Extended Service Discovery
'xep_0131', # Standard Headers and Internet Metadata
'xep_0133', # Service Administration 'xep_0133', # Service Administration
'xep_0153', # vCard-Based Avatars 'xep_0153', # vCard-Based Avatars
'xep_0163', # Personal Eventing Protocol 'xep_0163', # Personal Eventing Protocol

View File

@ -26,7 +26,7 @@ class XEP_0060(BasePlugin):
name = 'xep_0060' name = 'xep_0060'
description = 'XEP-0060: Publish-Subscribe' description = 'XEP-0060: Publish-Subscribe'
dependencies = set(['xep_0030', 'xep_0004']) dependencies = set(['xep_0030', 'xep_0004', 'xep_0082', 'xep_0131'])
stanza = stanza stanza = stanza
def plugin_init(self): def plugin_init(self):
@ -53,6 +53,8 @@ class XEP_0060(BasePlugin):
StanzaPath('message/pubsub_event/subscription'), StanzaPath('message/pubsub_event/subscription'),
self._handle_event_subscription)) self._handle_event_subscription))
self.xmpp['xep_0131'].supported_headers.add('SubID')
def plugin_end(self): def plugin_end(self):
self.xmpp.remove_handler('Pubsub Event: Items') self.xmpp.remove_handler('Pubsub Event: Items')
self.xmpp.remove_handler('Pubsub Event: Purge') self.xmpp.remove_handler('Pubsub Event: Purge')

View File

@ -104,12 +104,17 @@ class XEP_0115(BasePlugin):
self.xmpp['xep_0030'].add_feature(stanza.Capabilities.namespace) self.xmpp['xep_0030'].add_feature(stanza.Capabilities.namespace)
def _filter_add_caps(self, stanza): def _filter_add_caps(self, stanza):
if isinstance(stanza, Presence) and self.broadcast: if not isinstance(stanza, Presence) or not self.broadcast:
ver = self.get_verstring(stanza['from']) return stanza
if ver:
stanza['caps']['node'] = self.caps_node if stanza['type'] not in ('available', 'chat', 'away', 'dnd', 'xa'):
stanza['caps']['hash'] = self.hash return stanza
stanza['caps']['ver'] = ver
ver = self.get_verstring(stanza['from'])
if ver:
stanza['caps']['node'] = self.caps_node
stanza['caps']['hash'] = self.hash
stanza['caps']['ver'] = ver
return stanza return stanza
def _handle_caps(self, presence): def _handle_caps(self, presence):

View File

@ -0,0 +1,16 @@
"""
SleekXMPP: The Sleek XMPP Library
Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
This file is part of SleekXMPP.
See the file LICENSE for copying permission.
"""
from sleekxmpp.plugins.base import register_plugin
from sleekxmpp.plugins.xep_0131 import stanza
from sleekxmpp.plugins.xep_0131.stanza import Headers
from sleekxmpp.plugins.xep_0131.headers import XEP_0131
register_plugin(XEP_0131)

View File

@ -0,0 +1,41 @@
"""
SleekXMPP: The Sleek XMPP Library
Copyright (C) 2011 Nathanael C. Fritz, Lance J.T. Stout
This file is part of SleekXMPP.
See the file LICENSE for copying permission.
"""
from sleekxmpp import Message, Presence
from sleekxmpp.xmlstream import register_stanza_plugin
from sleekxmpp.plugins import BasePlugin
from sleekxmpp.plugins.xep_0131 import stanza
from sleekxmpp.plugins.xep_0131.stanza import Headers
class XEP_0131(BasePlugin):
name = 'xep_0131'
description = 'XEP-0131: Stanza Headers and Internet Metadata'
dependencies = set(['xep_0030'])
stanza = stanza
default_config = {
'supported_headers': set()
}
def plugin_init(self):
register_stanza_plugin(Message, Headers)
register_stanza_plugin(Presence, Headers)
def plugin_end(self):
self.xmpp['xep_0030'].del_feature(feature=Headers.namespace)
for header in self.supported_headers:
self.xmpp['xep_0030'].del_feature(
feature='%s#%s' % (Headers.namespace, header))
def session_bind(self, jid):
self.xmpp['xep_0030'].add_feature(Headers.namespace)
for header in self.supported_headers:
self.xmpp['xep_0030'].add_feature('%s#%s' % (
Headers.namespace,
header))

View File

@ -0,0 +1,51 @@
"""
SleekXMPP: The Sleek XMPP Library
Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
This file is part of SleekXMPP.
See the file LICENSE for copying permission.
"""
from sleekxmpp.thirdparty import OrderedDict
from sleekxmpp.xmlstream import ET, ElementBase
class Headers(ElementBase):
name = 'headers'
namespace = 'http://jabber.org/protocol/shim'
plugin_attrib = 'headers'
interfaces = set(['headers'])
is_extension = True
def get_headers(self):
result = OrderedDict()
headers = self.xml.findall('{%s}header' % self.namespace)
for header in headers:
name = header.attrib.get('name', '')
value = header.text
if name in result:
if not isinstance(result[name], set):
result[name] = [result[name]]
else:
result[name] = []
result[name].add(value)
else:
result[name] = value
return result
def set_headers(self, values):
self.del_headers()
for name in values:
vals = values[name]
if not isinstance(vals, (list, set)):
vals = [values[name]]
for value in vals:
header = ET.Element('{%s}header' % self.namespace)
header.attrib['name'] = name
header.text = value
self.xml.append(header)
def del_headers(self):
headers = self.xml.findall('{%s}header' % self.namespace)
for header in headers:
self.xml.remove(header)

View File

@ -87,6 +87,9 @@ class XEP_0153(BasePlugin):
if not isinstance(stanza, Presence): if not isinstance(stanza, Presence):
return stanza return stanza
if stanza['type'] not in ('available', 'dnd', 'chat', 'away', 'xa'):
return stanza
current_hash = self.api['get_hash'](stanza['from']) current_hash = self.api['get_hash'](stanza['from'])
stanza['vcard_temp_update']['photo'] = current_hash stanza['vcard_temp_update']['photo'] = current_hash
return stanza return stanza

View File

@ -9,5 +9,5 @@
# We don't want to have to import the entire library # We don't want to have to import the entire library
# just to get the version info for setup.py # just to get the version info for setup.py
__version__ = '1.1.9' __version__ = '1.1.10'
__version_info__ = (1, 1, 9, '', 0) __version_info__ = (1, 1, 10, '', 0)

View File

@ -468,7 +468,7 @@ class XMLStream(object):
log.debug("No remaining DNS records to try.") log.debug("No remaining DNS records to try.")
self.dns_answers = None self.dns_answers = None
if reattempt: if reattempt:
self.reconnect_delay = delay self.reconnect_delay = None
return False return False
af = Socket.AF_INET af = Socket.AF_INET