Add support for XEP-0131: Standard Headers and Internet Metadata

This commit is contained in:
Lance Stout 2012-07-28 01:06:21 -07:00
parent 54656b331a
commit 5ae6c8f8fa
6 changed files with 113 additions and 1 deletions

View File

@ -82,6 +82,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

@ -42,6 +42,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

@ -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)