Compare commits

...

22 Commits

Author SHA1 Message Date
mathieui
fb3ac78bf9 slixmpp 1.2.3 2016-12-07 21:47:54 +01:00
mathieui
ffd9436e5c Fix roster push origin detection and tests 2016-12-07 19:06:25 +01:00
louiz’
bbb1344d79 Add very basic gitlab-ci.yml file 2016-12-05 00:13:13 +01:00
Emmanuel Gil Peyrot
457785b286 XEP-0380: Add a helper to test for the presence of an EME tag. 2016-11-26 16:41:48 +00:00
Emmanuel Gil Peyrot
4847f834bd Add a plugin for XEP-0380: Explicit Message Encryption. 2016-11-26 16:29:19 +00:00
mathieui
53191ff1cf slixmpp 1.2.2
Fix CVE-2015-8688, and a few bugfixes.
2016-11-21 21:46:02 +01:00
mathieui
ffdb6ffd69 Check origin of roster pushes
slixmpp is vulnerable to roster push attacks as described by Daniel
Gultsch at https://gultsch.de/gajim_roster_push_and_message_interception.html.

(CVE-2015-8688)
2016-11-21 21:42:51 +01:00
Emmanuel Gil Peyrot
7560db856b stringprep_profiles: Emit a correct StringPrepError on query + unassigned. 2016-10-27 06:44:38 +01:00
Emmanuel Gil Peyrot
63d245ac48 SASL: Fix traceback on non-hashing mechanism using channel binding. 2016-10-27 06:26:39 +01:00
Emmanuel Gil Peyrot
7ddd37be29 XEP-0323: Fix wrong import. 2016-10-27 06:23:08 +01:00
Emmanuel Gil Peyrot
a4d3a4a25e XEP-0313: Add missing setter argument. 2016-10-27 06:22:50 +01:00
mathieui
58bd07628b Add missing parameters in XEP-0222 and XEP-0223 2016-10-27 00:21:01 +02:00
mathieui
3569038493 XEP-0009: fix a traceback on recipient unavailable
(probably a past typo)
2016-10-27 00:18:43 +02:00
mathieui
20c4ff823a Add missing JID import in XEP-0079 and 0258 2016-10-27 00:17:29 +02:00
mathieui
8a7448a5a1 Add missing imports in XEP-0333 2016-10-27 00:15:25 +02:00
mathieui
d23d8f901e Fix a traceback on XEP-0221 del uri['value']
(typo)
2016-10-27 00:11:27 +02:00
Emmanuel Gil Peyrot
391f12eeab Transform an if into an elif in cert parsing. 2016-10-23 14:15:02 +01:00
Emmanuel Gil Peyrot
d008988843 Manual cleanup of the remaining set([…]) and set((…)). 2016-10-22 13:37:46 +01:00
Emmanuel Gil Peyrot
dcacc7d7d5 sed -i 's/set(\[\(.*\)\])$/{\1}/g' **/*.py 2016-10-22 13:21:44 +01:00
Emmanuel Gil Peyrot
c4285961df sed -i 's/set((\(.*\)))$/{\1}/g' **/*.py 2016-10-22 13:21:42 +01:00
Emmanuel Gil Peyrot
1038f656eb sed -i 's/set((\(.*\),))$/{\1}/g' **/*.py 2016-10-22 13:21:41 +01:00
Emmanuel Gil Peyrot
3c7236fe73 setup.py: Check for libidn before trying to use Cython. 2016-10-05 20:28:11 +01:00
178 changed files with 790 additions and 610 deletions

8
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,8 @@
test:
tags:
- docker
image: ubuntu:latest
script:
- apt update
- apt install -y python3 cython3
- ./run_tests.py

View File

@@ -163,7 +163,7 @@ behaviour:
namespace = 'jabber:iq:register'
name = 'query'
plugin_attrib = 'register'
interfaces = set(('username', 'password', 'registered', 'remove'))
interfaces = {'username', 'password', 'registered', 'remove'}
sub_interfaces = interfaces
def getRegistered(self):
@@ -535,10 +535,10 @@ with some additional registration fields implemented.
namespace = 'jabber:iq:register'
name = 'query'
plugin_attrib = 'register'
interfaces = set(('username', 'password', 'email', 'nick', 'name',
'first', 'last', 'address', 'city', 'state', 'zip',
'phone', 'url', 'date', 'misc', 'text', 'key',
'registered', 'remove', 'instructions'))
interfaces = {'username', 'password', 'email', 'nick', 'name',
'first', 'last', 'address', 'city', 'state', 'zip',
'phone', 'url', 'date', 'misc', 'text', 'key',
'registered', 'remove', 'instructions'}
sub_interfaces = interfaces
def getRegistered(self):

View File

@@ -41,7 +41,7 @@ class Action(ElementBase):
#: del action['status']
#:
#: to set, get, or remove its values.
interfaces = set(('method', 'param', 'status'))
interfaces = {'method', 'param', 'status'}
#: By default, values in the `interfaces` set are mapped to
#: attribute values. This can be changed such that an interface

View File

@@ -7,20 +7,15 @@
# This software is licensed as described in the README.rst and LICENSE
# file, which you should have received as part of this distribution.
import os
from pathlib import Path
from subprocess import call, DEVNULL
from tempfile import TemporaryFile
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
try:
from Cython.Build import cythonize
except ImportError:
print('Cython not found, falling back to the slow stringprep module.')
ext_modules = None
else:
ext_modules = cythonize('slixmpp/stringprep.pyx')
from run_tests import TestCommand
from slixmpp.version import __version__
@@ -40,6 +35,27 @@ CLASSIFIERS = [
packages = [str(mod.parent) for mod in Path('slixmpp').rglob('__init__.py')]
def check_include(header):
command = [os.environ.get('CC', 'cc'), '-E', '-']
with TemporaryFile('w+') as c_file:
c_file.write('#include <%s>' % header)
c_file.seek(0)
try:
return call(command, stdin=c_file, stdout=DEVNULL, stderr=DEVNULL) == 0
except FileNotFoundError:
return False
ext_modules = None
if check_include('stringprep.h'):
try:
from Cython.Build import cythonize
except ImportError:
print('Cython not found, falling back to the slow stringprep module.')
else:
ext_modules = cythonize('slixmpp/stringprep.pyx')
else:
print('libidn-dev not found, falling back to the slow stringprep module.')
setup(
name="slixmpp",
version=VERSION,

View File

@@ -15,6 +15,7 @@
import asyncio
import logging
from slixmpp.jid import JID
from slixmpp.stanza import StreamFeatures
from slixmpp.basexmpp import BaseXMPP
from slixmpp.exceptions import XMPPError
@@ -108,10 +109,21 @@ class ClientXMPP(BaseXMPP):
CoroutineCallback('Stream Features',
MatchXPath('{%s}features' % self.stream_ns),
self._handle_stream_features))
def roster_push_filter(iq):
from_ = iq['from']
if from_ and from_ != JID('') and from_ != self.boundjid.bare:
reply = iq.reply()
reply['type'] = 'error'
reply['error']['type'] = 'cancel'
reply['error']['code'] = 503
reply['error']['condition'] = 'service-unavailable'
reply.send()
return
self.event('roster_update', iq)
self.register_handler(
Callback('Roster Update',
StanzaPath('iq@type=set/roster'),
lambda iq: self.event('roster_update', iq)))
roster_push_filter))
# Setup default stream features
self.register_plugin('feature_starttls')

View File

@@ -16,6 +16,6 @@ class Bind(ElementBase):
name = 'bind'
namespace = 'urn:ietf:params:xml:ns:xmpp-bind'
interfaces = set(('resource', 'jid'))
interfaces = {'resource', 'jid'}
sub_interfaces = interfaces
plugin_attrib = 'bind'

View File

@@ -49,7 +49,7 @@ class FeatureMechanisms(BasePlugin):
if self.security_callback is None:
self.security_callback = self._default_security
creds = self.sasl_callback(set(['username']), set())
creds = self.sasl_callback({'username'}, set())
if not self.use_mech and not creds['username']:
self.use_mech = 'ANONYMOUS'

View File

@@ -19,12 +19,12 @@ class Auth(StanzaBase):
name = 'auth'
namespace = 'urn:ietf:params:xml:ns:xmpp-sasl'
interfaces = set(('mechanism', 'value'))
interfaces = {'mechanism', 'value'}
plugin_attrib = name
#: Some SASL mechs require sending values as is,
#: without converting base64.
plain_mechs = set(['X-MESSENGER-OAUTH2'])
plain_mechs = {'X-MESSENGER-OAUTH2'}
def setup(self, xml):
StanzaBase.setup(self, xml)

View File

@@ -19,7 +19,7 @@ class Challenge(StanzaBase):
name = 'challenge'
namespace = 'urn:ietf:params:xml:ns:xmpp-sasl'
interfaces = set(('value',))
interfaces = {'value'}
plugin_attrib = name
def setup(self, xml):

View File

@@ -16,13 +16,14 @@ class Failure(StanzaBase):
name = 'failure'
namespace = 'urn:ietf:params:xml:ns:xmpp-sasl'
interfaces = set(('condition', 'text'))
interfaces = {'condition', 'text'}
plugin_attrib = name
sub_interfaces = set(('text',))
conditions = set(('aborted', 'account-disabled', 'credentials-expired',
'encryption-required', 'incorrect-encoding', 'invalid-authzid',
'invalid-mechanism', 'malformed-request', 'mechansism-too-weak',
'not-authorized', 'temporary-auth-failure'))
sub_interfaces = {'text'}
conditions = {'aborted', 'account-disabled', 'credentials-expired',
'encryption-required', 'incorrect-encoding',
'invalid-authzid', 'invalid-mechanism', 'malformed-request',
'mechansism-too-weak', 'not-authorized',
'temporary-auth-failure'}
def setup(self, xml=None):
"""

View File

@@ -16,7 +16,7 @@ class Mechanisms(ElementBase):
name = 'mechanisms'
namespace = 'urn:ietf:params:xml:ns:xmpp-sasl'
interfaces = set(('mechanisms', 'required'))
interfaces = {'mechanisms', 'required'}
plugin_attrib = name
is_extension = True

View File

@@ -19,7 +19,7 @@ class Response(StanzaBase):
name = 'response'
namespace = 'urn:ietf:params:xml:ns:xmpp-sasl'
interfaces = set(('value',))
interfaces = {'value'}
plugin_attrib = name
def setup(self, xml):

View File

@@ -18,7 +18,7 @@ class Success(StanzaBase):
name = 'success'
namespace = 'urn:ietf:params:xml:ns:xmpp-sasl'
interfaces = set(['value'])
interfaces = {'value'}
plugin_attrib = name
def setup(self, xml):

View File

@@ -16,7 +16,7 @@ class STARTTLS(ElementBase):
name = 'starttls'
namespace = 'urn:ietf:params:xml:ns:xmpp-tls'
interfaces = set(('required',))
interfaces = {'required'}
plugin_attrib = name
def get_required(self):

View File

@@ -21,7 +21,7 @@ class GmailQuery(ElementBase):
namespace = 'google:mail:notify'
name = 'query'
plugin_attrib = 'gmail'
interfaces = set(('newer-than-time', 'newer-than-tid', 'q', 'search'))
interfaces = {'newer-than-time', 'newer-than-tid', 'q', 'search'}
def get_search(self):
return self['q']
@@ -37,8 +37,8 @@ class MailBox(ElementBase):
namespace = 'google:mail:notify'
name = 'mailbox'
plugin_attrib = 'mailbox'
interfaces = set(('result-time', 'total-matched', 'total-estimate',
'url', 'threads', 'matched', 'estimate'))
interfaces = {'result-time', 'total-matched', 'total-estimate',
'url', 'threads', 'matched', 'estimate'}
def get_threads(self):
threads = []
@@ -58,9 +58,9 @@ class MailThread(ElementBase):
namespace = 'google:mail:notify'
name = 'mail-thread-info'
plugin_attrib = 'thread'
interfaces = set(('tid', 'participation', 'messages', 'date',
'senders', 'url', 'labels', 'subject', 'snippet'))
sub_interfaces = set(('labels', 'subject', 'snippet'))
interfaces = {'tid', 'participation', 'messages', 'date',
'senders', 'url', 'labels', 'subject', 'snippet'}
sub_interfaces = {'labels', 'subject', 'snippet'}
def get_senders(self):
senders = []
@@ -75,7 +75,7 @@ class MailSender(ElementBase):
namespace = 'google:mail:notify'
name = 'sender'
plugin_attrib = 'sender'
interfaces = set(('address', 'name', 'originator', 'unread'))
interfaces = {'address', 'name', 'originator', 'unread'}
def get_originator(self):
return self.xml.attrib.get('originator', '0') == '1'

View File

@@ -13,7 +13,7 @@ class GoogleAuth(ElementBase):
name = 'auth'
namespace = 'http://www.google.com/talk/protocol/auth'
plugin_attrib = 'google'
interfaces = set(['client_uses_full_bind_result', 'service'])
interfaces = {'client_uses_full_bind_result', 'service'}
discovery_attr= '{%s}client-uses-full-bind-result' % namespace
service_attr= '{%s}service' % namespace

View File

@@ -14,7 +14,7 @@ class NoSave(ElementBase):
name = 'x'
namespace = 'google:nosave'
plugin_attrib = 'google_nosave'
interfaces = set(['value'])
interfaces = {'value'}
def get_value(self):
return self._get_attr('value', '') == 'enabled'
@@ -35,7 +35,7 @@ class Item(ElementBase):
namespace = 'google:nosave'
plugin_attrib = 'item'
plugin_multi_attrib = 'items'
interfaces = set(['jid', 'source', 'value'])
interfaces = {'jid', 'source', 'value'}
def get_value(self):
return self._get_attr('value', '') == 'enabled'

View File

@@ -23,7 +23,7 @@ class XEP_0004(BasePlugin):
name = 'xep_0004'
description = 'XEP-0004: Data Forms'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -14,21 +14,21 @@ class FormField(ElementBase):
name = 'field'
plugin_attrib = 'field'
plugin_multi_attrib = 'fields'
interfaces = set(('answer', 'desc', 'required', 'value',
'label', 'type', 'var'))
sub_interfaces = set(('desc',))
interfaces = {'answer', 'desc', 'required', 'value',
'label', 'type', 'var'}
sub_interfaces = {'desc'}
plugin_tag_map = {}
plugin_attrib_map = {}
field_types = set(('boolean', 'fixed', 'hidden', 'jid-multi',
'jid-single', 'list-multi', 'list-single',
'text-multi', 'text-private', 'text-single'))
field_types = {'boolean', 'fixed', 'hidden', 'jid-multi',
'jid-single', 'list-multi', 'list-single',
'text-multi', 'text-private', 'text-single'}
true_values = set((True, '1', 'true'))
option_types = set(('list-multi', 'list-single'))
multi_line_types = set(('hidden', 'text-multi'))
multi_value_types = set(('hidden', 'jid-multi',
'list-multi', 'text-multi'))
true_values = {True, '1', 'true'}
option_types = {'list-multi', 'list-single'}
multi_line_types = {'hidden', 'text-multi'}
multi_value_types = {'hidden', 'jid-multi',
'list-multi', 'text-multi'}
def setup(self, xml=None):
if ElementBase.setup(self, xml):
@@ -164,8 +164,8 @@ class FieldOption(ElementBase):
namespace = 'jabber:x:data'
name = 'option'
plugin_attrib = 'option'
interfaces = set(('label', 'value'))
sub_interfaces = set(('value',))
interfaces = {'label', 'value'}
sub_interfaces = {'value'}
plugin_multi_attrib = 'options'

View File

@@ -24,8 +24,8 @@ class Form(ElementBase):
name = 'x'
plugin_attrib = 'form'
interfaces = OrderedSet(('instructions', 'reported', 'title', 'type', 'items', ))
sub_interfaces = set(('title',))
form_types = set(('cancel', 'form', 'result', 'submit'))
sub_interfaces = {'title'}
form_types = {'cancel', 'form', 'result', 'submit'}
def __init__(self, *args, **kwargs):
title = None

View File

@@ -24,7 +24,7 @@ class XEP_0009(BasePlugin):
name = 'xep_0009'
description = 'XEP-0009: Jabber-RPC'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
@@ -121,7 +121,7 @@ class XEP_0009(BasePlugin):
def _recipient_unvailable(self, iq):
payload = iq.get_payload()
iq = iq.reply()
error().set_payload(payload)
iq.error().set_payload(payload)
iq['error']['code'] = '404'
iq['error']['type'] = 'wait'
iq['error']['condition'] = 'recipient-unavailable'

View File

@@ -14,8 +14,8 @@ class RPCQuery(ElementBase):
name = 'query'
namespace = 'jabber:iq:rpc'
plugin_attrib = 'rpc_query'
interfaces = set(())
subinterfaces = set(())
interfaces = {}
subinterfaces = {}
plugin_attrib_map = {}
plugin_tag_map = {}
@@ -24,8 +24,8 @@ class MethodCall(ElementBase):
name = 'methodCall'
namespace = 'jabber:iq:rpc'
plugin_attrib = 'method_call'
interfaces = set(('method_name', 'params'))
subinterfaces = set(())
interfaces = {'method_name', 'params'}
subinterfaces = {}
plugin_attrib_map = {}
plugin_tag_map = {}
@@ -46,8 +46,8 @@ class MethodResponse(ElementBase):
name = 'methodResponse'
namespace = 'jabber:iq:rpc'
plugin_attrib = 'method_response'
interfaces = set(('params', 'fault'))
subinterfaces = set(())
interfaces = {'params', 'fault'}
subinterfaces = {}
plugin_attrib_map = {}
plugin_tag_map = {}

View File

@@ -29,7 +29,7 @@ class XEP_0012(BasePlugin):
name = 'xep_0012'
description = 'XEP-0012: Last Activity'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -14,7 +14,7 @@ class LastActivity(ElementBase):
name = 'query'
namespace = 'jabber:iq:last'
plugin_attrib = 'last_activity'
interfaces = set(('seconds', 'status'))
interfaces = {'seconds', 'status'}
def get_seconds(self):
return int(self._get_attr('seconds'))

View File

@@ -29,7 +29,7 @@ class XEP_0013(BasePlugin):
name = 'xep_0013'
description = 'XEP-0013: Flexible Offline Message Retrieval'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -14,7 +14,7 @@ class Offline(ElementBase):
name = 'offline'
namespace = 'http://jabber.org/protocol/offline'
plugin_attrib = 'offline'
interfaces = set(['fetch', 'purge', 'results'])
interfaces = {'fetch', 'purge', 'results'}
bool_interfaces = interfaces
def setup(self, xml=None):
@@ -39,9 +39,9 @@ class Item(ElementBase):
name = 'item'
namespace = 'http://jabber.org/protocol/offline'
plugin_attrib = 'item'
interfaces = set(['action', 'node', 'jid'])
interfaces = {'action', 'node', 'jid'}
actions = set(['view', 'remove'])
actions = {'view', 'remove'}
def get_jid(self):
return JID(self._get_attr('jid'))

View File

@@ -17,7 +17,7 @@ class XEP_0016(BasePlugin):
name = 'xep_0016'
description = 'XEP-0016: Privacy Lists'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -18,14 +18,14 @@ class Active(ElementBase):
name = 'active'
namespace = 'jabber:iq:privacy'
plugin_attrib = name
interfaces = set(['name'])
interfaces = {'name'}
class Default(ElementBase):
name = 'default'
namespace = 'jabber:iq:privacy'
plugin_attrib = name
interfaces = set(['name'])
interfaces = {'name'}
class List(ElementBase):
@@ -33,7 +33,7 @@ class List(ElementBase):
namespace = 'jabber:iq:privacy'
plugin_attrib = name
plugin_multi_attrib = 'lists'
interfaces = set(['name'])
interfaces = {'name'}
def add_item(self, value, action, order, itype=None, iq=False,
message=False, presence_in=False, presence_out=False):
@@ -55,9 +55,9 @@ class Item(ElementBase):
namespace = 'jabber:iq:privacy'
plugin_attrib = name
plugin_multi_attrib = 'items'
interfaces = set(['type', 'value', 'action', 'order', 'iq',
'message', 'presence_in', 'presence_out'])
bool_interfaces = set(['message', 'iq', 'presence_in', 'presence_out'])
interfaces = {'type', 'value', 'action', 'order', 'iq',
'message', 'presence_in', 'presence_out'}
bool_interfaces = {'message', 'iq', 'presence_in', 'presence_out'}
type_values = ('', 'jid', 'group', 'subscription')
action_values = ('allow', 'deny')

View File

@@ -24,7 +24,7 @@ class XEP_0020(BasePlugin):
name = 'xep_0020'
description = 'XEP-0020: Feature Negotiation'
dependencies = set(['xep_0004', 'xep_0030'])
dependencies = {'xep_0004', 'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -13,7 +13,7 @@ class Signed(ElementBase):
name = 'x'
namespace = 'jabber:x:signed'
plugin_attrib = 'signed'
interfaces = set(['signed'])
interfaces = {'signed'}
is_extension = True
def set_signed(self, value):
@@ -33,7 +33,7 @@ class Encrypted(ElementBase):
name = 'x'
namespace = 'jabber:x:encrypted'
plugin_attrib = 'encrypted'
interfaces = set(['encrypted'])
interfaces = {'encrypted'}
is_extension = True
def set_encrypted(self, value):

View File

@@ -71,8 +71,8 @@ class DiscoInfo(ElementBase):
name = 'query'
namespace = 'http://jabber.org/protocol/disco#info'
plugin_attrib = 'disco_info'
interfaces = set(('node', 'features', 'identities'))
lang_interfaces = set(('identities',))
interfaces = {'node', 'features', 'identities'}
lang_interfaces = {'identities'}
# Cache identities and features
_identities = set()
@@ -91,7 +91,7 @@ class DiscoInfo(ElementBase):
"""
ElementBase.setup(self, xml)
self._identities = set([id[0:3] for id in self['identities']])
self._identities = {id[0:3] for id in self['identities']}
self._features = self['features']
def add_identity(self, category, itype, name=None, lang=None):

View File

@@ -45,7 +45,7 @@ class DiscoItems(ElementBase):
name = 'query'
namespace = 'http://jabber.org/protocol/disco#items'
plugin_attrib = 'disco_items'
interfaces = set(('node', 'items'))
interfaces = {'node', 'items'}
# Cache items
_items = set()
@@ -62,7 +62,7 @@ class DiscoItems(ElementBase):
xml -- Use an existing XML object for the stanza's values.
"""
ElementBase.setup(self, xml)
self._items = set([item[0:2] for item in self['items']])
self._items = {item[0:2] for item in self['items']}
def add_item(self, jid, node=None, name=None):
"""
@@ -138,7 +138,7 @@ class DiscoItem(ElementBase):
name = 'item'
namespace = 'http://jabber.org/protocol/disco#items'
plugin_attrib = name
interfaces = set(('jid', 'node', 'name'))
interfaces = {'jid', 'node', 'name'}
def get_node(self):
"""Return the item's node name or ``None``."""

View File

@@ -22,7 +22,7 @@ class XEP_0033(BasePlugin):
name = 'xep_0033'
description = 'XEP-0033: Extended Stanza Addressing'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -37,9 +37,9 @@ class Address(ElementBase):
name = 'address'
namespace = 'http://jabber.org/protocol/address'
plugin_attrib = 'address'
interfaces = set(['type', 'jid', 'node', 'uri', 'desc', 'delivered'])
interfaces = {'type', 'jid', 'node', 'uri', 'desc', 'delivered'}
address_types = set(('bcc', 'cc', 'noreply', 'replyroom', 'replyto', 'to'))
address_types = {'bcc', 'cc', 'noreply', 'replyroom', 'replyto', 'to'}
def get_jid(self):
return JID(self._get_attr('jid'))

View File

@@ -25,9 +25,9 @@ class MUCPresence(ElementBase):
name = 'x'
namespace = 'http://jabber.org/protocol/muc#user'
plugin_attrib = 'muc'
interfaces = set(('affiliation', 'role', 'jid', 'nick', 'room'))
affiliations = set(('', ))
roles = set(('', ))
interfaces = {'affiliation', 'role', 'jid', 'nick', 'room'}
affiliations = {'', }
roles = {'', }
def get_xml_item(self):
item = self.xml.find('{http://jabber.org/protocol/muc#user}item')
@@ -117,7 +117,7 @@ class XEP_0045(BasePlugin):
name = 'xep_0045'
description = 'XEP-0045: Multi-User Chat'
dependencies = set(['xep_0030', 'xep_0004'])
dependencies = {'xep_0030', 'xep_0004'}
def plugin_init(self):
self.rooms = {}

View File

@@ -18,7 +18,7 @@ class XEP_0047(BasePlugin):
name = 'xep_0047'
description = 'XEP-0047: In-band Bytestreams'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
default_config = {
'block_size': 4096,

View File

@@ -21,7 +21,7 @@ class Open(ElementBase):
name = 'open'
namespace = 'http://jabber.org/protocol/ibb'
plugin_attrib = 'ibb_open'
interfaces = set(('block_size', 'sid', 'stanza'))
interfaces = {'block_size', 'sid', 'stanza'}
def get_block_size(self):
return int(self._get_attr('block-size', '0'))
@@ -37,8 +37,8 @@ class Data(ElementBase):
name = 'data'
namespace = 'http://jabber.org/protocol/ibb'
plugin_attrib = 'ibb_data'
interfaces = set(('seq', 'sid', 'data'))
sub_interfaces = set(['data'])
interfaces = {'seq', 'sid', 'data'}
sub_interfaces = {'data'}
def get_seq(self):
return int(self._get_attr('seq', '0'))
@@ -67,4 +67,4 @@ class Close(ElementBase):
name = 'close'
namespace = 'http://jabber.org/protocol/ibb'
plugin_attrib = 'ibb_close'
interfaces = set(['sid'])
interfaces = {'sid'}

View File

@@ -24,7 +24,7 @@ class XEP_0048(BasePlugin):
name = 'xep_0048'
description = 'XEP-0048: Bookmarks'
dependencies = set(['xep_0045', 'xep_0049', 'xep_0060', 'xep_0163', 'xep_0223'])
dependencies = {'xep_0045', 'xep_0049', 'xep_0060', 'xep_0163', 'xep_0223'}
stanza = stanza
default_config = {
'auto_join': False,

View File

@@ -40,8 +40,8 @@ class Conference(ElementBase):
namespace = 'storage:bookmarks'
plugin_attrib = 'conference'
plugin_multi_attrib = 'conferences'
interfaces = set(['nick', 'password', 'autojoin', 'jid', 'name'])
sub_interfaces = set(['nick', 'password'])
interfaces = {'nick', 'password', 'autojoin', 'jid', 'name'}
sub_interfaces = {'nick', 'password'}
def get_autojoin(self):
value = self._get_attr('autojoin')
@@ -58,7 +58,7 @@ class URL(ElementBase):
namespace = 'storage:bookmarks'
plugin_attrib = 'url'
plugin_multi_attrib = 'urls'
interfaces = set(['url', 'name'])
interfaces = {'url', 'name'}
register_stanza_plugin(Bookmarks, Conference, iterable=True)

View File

@@ -23,7 +23,7 @@ class XEP_0049(BasePlugin):
name = 'xep_0049'
description = 'XEP-0049: Private XML Storage'
dependencies = set([])
dependencies = {}
stanza = stanza
def plugin_init(self):

View File

@@ -74,7 +74,7 @@ class XEP_0050(BasePlugin):
name = 'xep_0050'
description = 'XEP-0050: Ad-Hoc Commands'
dependencies = set(['xep_0030', 'xep_0004'])
dependencies = {'xep_0030', 'xep_0004'}
stanza = stanza
default_config = {
'session_db': None
@@ -225,8 +225,8 @@ class XEP_0050(BasePlugin):
if len(payload) == 1:
payload = payload[0]
interfaces = set([item.plugin_attrib for item in payload])
payload_classes = set([item.__class__ for item in payload])
interfaces = {item.plugin_attrib for item in payload}
payload_classes = {item.__class__ for item in payload}
initial_session = {'id': sessionid,
'from': iq['from'],
@@ -322,8 +322,8 @@ class XEP_0050(BasePlugin):
interfaces = session.get('interfaces', set())
payload_classes = session.get('payload_classes', set())
interfaces.update(set([item.plugin_attrib for item in payload]))
payload_classes.update(set([item.__class__ for item in payload]))
interfaces.update({item.plugin_attrib for item in payload})
payload_classes.update({item.__class__ for item in payload})
session['interfaces'] = interfaces
session['payload_classes'] = payload_classes

View File

@@ -72,11 +72,11 @@ class Command(ElementBase):
name = 'command'
namespace = 'http://jabber.org/protocol/commands'
plugin_attrib = 'command'
interfaces = set(('action', 'sessionid', 'node',
'status', 'actions', 'notes'))
actions = set(('cancel', 'complete', 'execute', 'next', 'prev'))
statuses = set(('canceled', 'completed', 'executing'))
next_actions = set(('prev', 'next', 'complete'))
interfaces = {'action', 'sessionid', 'node',
'status', 'actions', 'notes'}
actions = {'cancel', 'complete', 'execute', 'next', 'prev'}
statuses = {'canceled', 'completed', 'executing'}
next_actions = {'prev', 'next', 'complete'}
def get_action(self):
"""

View File

@@ -10,15 +10,15 @@ class VCardTemp(ElementBase):
name = 'vCard'
namespace = 'vcard-temp'
plugin_attrib = 'vcard_temp'
interfaces = set(['FN', 'VERSION'])
sub_interfaces = set(['FN', 'VERSION'])
interfaces = {'FN', 'VERSION'}
sub_interfaces = {'FN', 'VERSION'}
class Name(ElementBase):
name = 'N'
namespace = 'vcard-temp'
plugin_attrib = name
interfaces = set(['FAMILY', 'GIVEN', 'MIDDLE', 'PREFIX', 'SUFFIX'])
interfaces = {'FAMILY', 'GIVEN', 'MIDDLE', 'PREFIX', 'SUFFIX'}
sub_interfaces = interfaces
def _set_component(self, name, value):
@@ -72,7 +72,7 @@ class Nickname(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'nicknames'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_nickname(self, value):
@@ -95,9 +95,9 @@ class Email(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'emails'
interfaces = set(['HOME', 'WORK', 'INTERNET', 'PREF', 'X400', 'USERID'])
sub_interfaces = set(['USERID'])
bool_interfaces = set(['HOME', 'WORK', 'INTERNET', 'PREF', 'X400'])
interfaces = {'HOME', 'WORK', 'INTERNET', 'PREF', 'X400', 'USERID'}
sub_interfaces = {'USERID'}
bool_interfaces = {'HOME', 'WORK', 'INTERNET', 'PREF', 'X400'}
class Address(ElementBase):
@@ -105,12 +105,12 @@ class Address(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'addresses'
interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INTL',
'PREF', 'POBOX', 'EXTADD', 'STREET', 'LOCALITY',
'REGION', 'PCODE', 'CTRY'])
sub_interfaces = set(['POBOX', 'EXTADD', 'STREET', 'LOCALITY',
'REGION', 'PCODE', 'CTRY'])
bool_interfaces = set(['HOME', 'WORK', 'DOM', 'INTL', 'PREF'])
interfaces = {'HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INTL',
'PREF', 'POBOX', 'EXTADD', 'STREET', 'LOCALITY',
'REGION', 'PCODE', 'CTRY'}
sub_interfaces = {'POBOX', 'EXTADD', 'STREET', 'LOCALITY',
'REGION', 'PCODE', 'CTRY'}
bool_interfaces = {'HOME', 'WORK', 'DOM', 'INTL', 'PREF'}
class Telephone(ElementBase):
@@ -118,13 +118,13 @@ class Telephone(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'telephone_numbers'
interfaces = set(['HOME', 'WORK', 'VOICE', 'FAX', 'PAGER', 'MSG',
'CELL', 'VIDEO', 'BBS', 'MODEM', 'ISDN', 'PCS',
'PREF', 'NUMBER'])
sub_interfaces = set(['NUMBER'])
bool_interfaces = set(['HOME', 'WORK', 'VOICE', 'FAX', 'PAGER',
'MSG', 'CELL', 'VIDEO', 'BBS', 'MODEM',
'ISDN', 'PCS', 'PREF'])
interfaces = {'HOME', 'WORK', 'VOICE', 'FAX', 'PAGER', 'MSG',
'CELL', 'VIDEO', 'BBS', 'MODEM', 'ISDN', 'PCS',
'PREF', 'NUMBER'}
sub_interfaces = {'NUMBER'}
bool_interfaces = {'HOME', 'WORK', 'VOICE', 'FAX', 'PAGER',
'MSG', 'CELL', 'VIDEO', 'BBS', 'MODEM',
'ISDN', 'PCS', 'PREF'}
def setup(self, xml=None):
super().setup(xml=xml)
@@ -143,10 +143,10 @@ class Label(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'labels'
interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INT',
'PREF', 'lines'])
bool_interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM',
'INT', 'PREF'])
interfaces = {'HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INT',
'PREF', 'lines'}
bool_interfaces = {'HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM',
'INT', 'PREF'}
def add_line(self, value):
line = ET.Element('{%s}LINE' % self.namespace)
@@ -177,7 +177,7 @@ class Geo(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'geolocations'
interfaces = set(['LAT', 'LON'])
interfaces = {'LAT', 'LON'}
sub_interfaces = interfaces
@@ -186,8 +186,8 @@ class Org(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'organizations'
interfaces = set(['ORGNAME', 'ORGUNIT', 'orgunits'])
sub_interfaces = set(['ORGNAME', 'ORGUNIT'])
interfaces = {'ORGNAME', 'ORGUNIT', 'orgunits'}
sub_interfaces = {'ORGNAME', 'ORGUNIT'}
def add_orgunit(self, value):
orgunit = ET.Element('{%s}ORGUNIT' % self.namespace)
@@ -218,7 +218,7 @@ class Photo(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'photos'
interfaces = set(['TYPE', 'EXTVAL'])
interfaces = {'TYPE', 'EXTVAL'}
sub_interfaces = interfaces
@@ -227,7 +227,7 @@ class Logo(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'logos'
interfaces = set(['TYPE', 'EXTVAL'])
interfaces = {'TYPE', 'EXTVAL'}
sub_interfaces = interfaces
@@ -236,7 +236,7 @@ class Sound(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'sounds'
interfaces = set(['PHONETC', 'EXTVAL'])
interfaces = {'PHONETC', 'EXTVAL'}
sub_interfaces = interfaces
@@ -244,7 +244,7 @@ class BinVal(ElementBase):
name = 'BINVAL'
namespace = 'vcard-temp'
plugin_attrib = name
interfaces = set(['BINVAL'])
interfaces = {'BINVAL'}
is_extension = True
def setup(self, xml=None):
@@ -275,7 +275,7 @@ class Classification(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'classifications'
interfaces = set(['PUBLIC', 'PRIVATE', 'CONFIDENTIAL'])
interfaces = {'PUBLIC', 'PRIVATE', 'CONFIDENTIAL'}
bool_interfaces = interfaces
@@ -284,7 +284,7 @@ class Categories(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'categories'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_categories(self, values):
@@ -314,7 +314,7 @@ class Birthday(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'birthdays'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_bday(self, value):
@@ -336,7 +336,7 @@ class Rev(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'revision_dates'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_rev(self, value):
@@ -358,7 +358,7 @@ class Title(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'titles'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_title(self, value):
@@ -373,7 +373,7 @@ class Role(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'roles'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_role(self, value):
@@ -388,7 +388,7 @@ class Note(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'notes'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_note(self, value):
@@ -403,7 +403,7 @@ class Desc(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'descriptions'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_desc(self, value):
@@ -418,7 +418,7 @@ class URL(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'urls'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_url(self, value):
@@ -433,7 +433,7 @@ class UID(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'uids'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_uid(self, value):
@@ -448,7 +448,7 @@ class ProdID(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'product_ids'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_prodid(self, value):
@@ -463,7 +463,7 @@ class Mailer(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'mailers'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_mailer(self, value):
@@ -478,7 +478,7 @@ class SortString(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = 'SORT_STRING'
plugin_multi_attrib = 'sort_strings'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_sort_string(self, value):
@@ -493,7 +493,7 @@ class Agent(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'agents'
interfaces = set(['EXTVAL'])
interfaces = {'EXTVAL'}
sub_interfaces = interfaces
@@ -502,7 +502,7 @@ class JabberID(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'jids'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_jabberid(self, value):
@@ -517,7 +517,7 @@ class TimeZone(ElementBase):
namespace = 'vcard-temp'
plugin_attrib = name
plugin_multi_attrib = 'timezones'
interfaces = set([name])
interfaces = {name}
is_extension = True
def set_tz(self, value):

View File

@@ -29,7 +29,7 @@ class XEP_0054(BasePlugin):
name = 'xep_0054'
description = 'XEP-0054: vcard-temp'
dependencies = set(['xep_0030', 'xep_0082'])
dependencies = {'xep_0030', 'xep_0082'}
stanza = stanza
def plugin_init(self):

View File

@@ -111,7 +111,7 @@ class XEP_0059(BasePlugin):
name = 'xep_0059'
description = 'XEP-0059: Result Set Management'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -64,10 +64,10 @@ class Set(ElementBase):
namespace = 'http://jabber.org/protocol/rsm'
name = 'set'
plugin_attrib = 'rsm'
sub_interfaces = set(('first', 'after', 'before', 'count',
'index', 'last', 'max'))
interfaces = set(('first_index', 'first', 'after', 'before',
'count', 'index', 'last', 'max'))
sub_interfaces = {'first', 'after', 'before', 'count',
'index', 'last', 'max'}
interfaces = {'first_index', 'first', 'after', 'before',
'count', 'index', 'last', 'max'}
def set_first_index(self, val):
fi = self.xml.find("{%s}first" % (self.namespace))

View File

@@ -26,7 +26,7 @@ class XEP_0060(BasePlugin):
name = 'xep_0060'
description = 'XEP-0060: Publish-Subscribe'
dependencies = set(['xep_0030', 'xep_0004', 'xep_0082', 'xep_0131'])
dependencies = {'xep_0030', 'xep_0004', 'xep_0082', 'xep_0131'}
stanza = stanza
def plugin_init(self):

View File

@@ -11,7 +11,7 @@ from slixmpp.xmlstream import ET
class OptionalSetting(object):
interfaces = set(('required',))
interfaces = {'required'}
def set_required(self, value):
if value in (True, 'true', 'True', '1'):

View File

@@ -23,14 +23,14 @@ class Affiliations(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'affiliations'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class Affiliation(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'affiliation'
plugin_attrib = name
interfaces = set(('node', 'affiliation', 'jid'))
interfaces = {'node', 'affiliation', 'jid'}
def set_jid(self, value):
self._set_attr('jid', str(value))
@@ -43,7 +43,7 @@ class Subscription(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'subscription'
plugin_attrib = name
interfaces = set(('jid', 'node', 'subscription', 'subid'))
interfaces = {'jid', 'node', 'subscription', 'subid'}
def set_jid(self, value):
self._set_attr('jid', str(value))
@@ -56,21 +56,21 @@ class Subscriptions(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'subscriptions'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class SubscribeOptions(ElementBase, OptionalSetting):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'subscribe-options'
plugin_attrib = 'suboptions'
interfaces = set(('required',))
interfaces = {'required'}
class Item(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'item'
plugin_attrib = name
interfaces = set(('id', 'payload'))
interfaces = {'id', 'payload'}
def set_payload(self, value):
del self['payload']
@@ -95,7 +95,7 @@ class Items(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'items'
plugin_attrib = name
interfaces = set(('node', 'max_items'))
interfaces = {'node', 'max_items'}
def set_max_items(self, value):
self._set_attr('max_items', str(value))
@@ -105,14 +105,14 @@ class Create(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'create'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class Default(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'default'
plugin_attrib = name
interfaces = set(('node', 'type'))
interfaces = {'node', 'type'}
def get_type(self):
t = self._get_attr('type')
@@ -125,14 +125,14 @@ class Publish(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'publish'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class Retract(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'retract'
plugin_attrib = name
interfaces = set(('node', 'notify'))
interfaces = {'node', 'notify'}
def get_notify(self):
notify = self._get_attr('notify')
@@ -156,7 +156,7 @@ class Unsubscribe(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'unsubscribe'
plugin_attrib = name
interfaces = set(('node', 'jid', 'subid'))
interfaces = {'node', 'jid', 'subid'}
def set_jid(self, value):
self._set_attr('jid', str(value))
@@ -169,7 +169,7 @@ class Subscribe(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'subscribe'
plugin_attrib = name
interfaces = set(('node', 'jid'))
interfaces = {'node', 'jid'}
def set_jid(self, value):
self._set_attr('jid', str(value))
@@ -182,7 +182,7 @@ class Configure(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'configure'
plugin_attrib = name
interfaces = set(('node', 'type'))
interfaces = {'node', 'type'}
def getType(self):
t = self._get_attr('type')
@@ -195,7 +195,7 @@ class Options(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'options'
plugin_attrib = name
interfaces = set(('jid', 'node', 'options'))
interfaces = {'jid', 'node', 'options'}
def __init__(self, *args, **kwargs):
ElementBase.__init__(self, *args, **kwargs)
@@ -227,7 +227,7 @@ class PublishOptions(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub'
name = 'publish-options'
plugin_attrib = 'publish_options'
interfaces = set(('publish_options',))
interfaces = {'publish_options'}
is_extension = True
def get_publish_options(self):

View File

@@ -13,18 +13,18 @@ from slixmpp.xmlstream import ElementBase, ET, register_stanza_plugin
class PubsubErrorCondition(ElementBase):
plugin_attrib = 'pubsub'
interfaces = set(('condition', 'unsupported'))
interfaces = {'condition', 'unsupported'}
plugin_attrib_map = {}
plugin_tag_map = {}
conditions = set(('closed-node', 'configuration-required', 'invalid-jid',
'invalid-options', 'invalid-payload', 'invalid-subid',
'item-forbidden', 'item-required', 'jid-required',
'max-items-exceeded', 'max-nodes-exceeded',
'nodeid-required', 'not-in-roster-group',
'not-subscribed', 'payload-too-big',
'payload-required', 'pending-subscription',
'presence-subscription-required', 'subid-required',
'too-many-subscriptions', 'unsupported'))
conditions = {'closed-node', 'configuration-required', 'invalid-jid',
'invalid-options', 'invalid-payload', 'invalid-subid',
'item-forbidden', 'item-required', 'jid-required',
'max-items-exceeded', 'max-nodes-exceeded',
'nodeid-required', 'not-in-roster-group',
'not-subscribed', 'payload-too-big',
'payload-required', 'pending-subscription',
'presence-subscription-required', 'subid-required',
'too-many-subscriptions', 'unsupported'}
condition_ns = 'http://jabber.org/protocol/pubsub#errors'
def setup(self, xml):

View File

@@ -25,7 +25,7 @@ class EventItem(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'item'
plugin_attrib = name
interfaces = set(('id', 'payload', 'node', 'publisher'))
interfaces = {'id', 'payload', 'node', 'publisher'}
def set_payload(self, value):
self.xml.append(value)
@@ -44,56 +44,56 @@ class EventRetract(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'retract'
plugin_attrib = name
interfaces = set(('id',))
interfaces = {'id'}
class EventItems(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'items'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class EventCollection(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'collection'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class EventAssociate(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'associate'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class EventDisassociate(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'disassociate'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class EventConfiguration(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'configuration'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class EventPurge(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'purge'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class EventDelete(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'delete'
plugin_attrib = name
interfaces = set(('node', 'redirect'))
interfaces = {'node', 'redirect'}
def set_redirect(self, uri):
del self['redirect']
@@ -117,7 +117,7 @@ class EventSubscription(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#event'
name = 'subscription'
plugin_attrib = name
interfaces = set(('node', 'expiry', 'jid', 'subid', 'subscription'))
interfaces = {'node', 'expiry', 'jid', 'subid', 'subscription'}
def get_expiry(self):
expiry = self._get_attr('expiry')

View File

@@ -25,7 +25,7 @@ class DefaultConfig(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#owner'
name = 'default'
plugin_attrib = name
interfaces = set(('node', 'config'))
interfaces = {'node', 'config'}
def __init__(self, *args, **kwargs):
ElementBase.__init__(self, *args, **kwargs)
@@ -41,7 +41,7 @@ class DefaultConfig(ElementBase):
class OwnerAffiliations(Affiliations):
namespace = 'http://jabber.org/protocol/pubsub#owner'
interfaces = set(('node',))
interfaces = {'node'}
def append(self, affiliation):
if not isinstance(affiliation, OwnerAffiliation):
@@ -51,40 +51,40 @@ class OwnerAffiliations(Affiliations):
class OwnerAffiliation(Affiliation):
namespace = 'http://jabber.org/protocol/pubsub#owner'
interfaces = set(('affiliation', 'jid'))
interfaces = {'affiliation', 'jid'}
class OwnerConfigure(Configure):
namespace = 'http://jabber.org/protocol/pubsub#owner'
name = 'configure'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class OwnerDefault(OwnerConfigure):
namespace = 'http://jabber.org/protocol/pubsub#owner'
interfaces = set(('node',))
interfaces = {'node'}
class OwnerDelete(ElementBase, OptionalSetting):
namespace = 'http://jabber.org/protocol/pubsub#owner'
name = 'delete'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class OwnerPurge(ElementBase, OptionalSetting):
namespace = 'http://jabber.org/protocol/pubsub#owner'
name = 'purge'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
class OwnerRedirect(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#owner'
name = 'redirect'
plugin_attrib = name
interfaces = set(('node', 'jid'))
interfaces = {'node', 'jid'}
def set_jid(self, value):
self._set_attr('jid', str(value))
@@ -97,7 +97,7 @@ class OwnerSubscriptions(Subscriptions):
name = 'subscriptions'
namespace = 'http://jabber.org/protocol/pubsub#owner'
plugin_attrib = name
interfaces = set(('node',))
interfaces = {'node'}
def append(self, subscription):
if not isinstance(subscription, OwnerSubscription):
@@ -109,7 +109,7 @@ class OwnerSubscription(ElementBase):
namespace = 'http://jabber.org/protocol/pubsub#owner'
name = 'subscription'
plugin_attrib = name
interfaces = set(('jid', 'subscription'))
interfaces = {'jid', 'subscription'}
def set_jid(self, value):
self._set_attr('jid', str(value))

View File

@@ -22,7 +22,7 @@ class XEP_0065(BasePlugin):
name = 'xep_0065'
description = "XEP-0065: SOCKS5 Bytestreams"
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
default_config = {
'auto_accept': False
}

View File

@@ -6,8 +6,8 @@ class Socks5(ElementBase):
name = 'query'
namespace = 'http://jabber.org/protocol/bytestreams'
plugin_attrib = 'socks'
interfaces = set(['sid', 'activate'])
sub_interfaces = set(['activate'])
interfaces = {'sid', 'activate'}
sub_interfaces = {'activate'}
def add_streamhost(self, jid, host, port):
sh = StreamHost(parent=self)
@@ -21,7 +21,7 @@ class StreamHost(ElementBase):
namespace = 'http://jabber.org/protocol/bytestreams'
plugin_attrib = 'streamhost'
plugin_multi_attrib = 'streamhosts'
interfaces = set(['host', 'jid', 'port'])
interfaces = {'host', 'jid', 'port'}
def set_jid(self, value):
return self._set_attr('jid', str(value))
@@ -34,7 +34,7 @@ class StreamHostUsed(ElementBase):
name = 'streamhost-used'
namespace = 'http://jabber.org/protocol/bytestreams'
plugin_attrib = 'streamhost_used'
interfaces = set(['jid'])
interfaces = {'jid'}
def set_jid(self, value):
return self._set_attr('jid', str(value))

View File

@@ -44,7 +44,7 @@ class XEP_0066(BasePlugin):
name = 'xep_0066'
description = 'XEP-0066: Out of Band Data'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -17,8 +17,8 @@ class OOBTransfer(ElementBase):
name = 'query'
namespace = 'jabber:iq:oob'
plugin_attrib = 'oob_transfer'
interfaces = set(('url', 'desc', 'sid'))
sub_interfaces = set(('url', 'desc'))
interfaces = {'url', 'desc', 'sid'}
sub_interfaces = {'url', 'desc'}
class OOB(ElementBase):
@@ -29,5 +29,5 @@ class OOB(ElementBase):
name = 'x'
namespace = 'jabber:x:oob'
plugin_attrib = 'oob'
interfaces = set(('url', 'desc'))
interfaces = {'url', 'desc'}
sub_interfaces = interfaces

View File

@@ -19,8 +19,8 @@ class XHTML_IM(ElementBase):
namespace = 'http://jabber.org/protocol/xhtml-im'
name = 'html'
interfaces = set(['body'])
lang_interfaces = set(['body'])
interfaces = {'body'}
lang_interfaces = {'body'}
plugin_attrib = name
def set_body(self, content, lang=None):

View File

@@ -17,7 +17,7 @@ class XEP_0071(BasePlugin):
name = 'xep_0071'
description = 'XEP-0071: XHTML-IM'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -26,7 +26,7 @@ class XEP_0077(BasePlugin):
name = 'xep_0077'
description = 'XEP-0077: In-Band Registration'
dependencies = set(['xep_0004', 'xep_0066'])
dependencies = {'xep_0004', 'xep_0066'}
stanza = stanza
default_config = {
'create_account': True,

View File

@@ -16,14 +16,14 @@ class Register(ElementBase):
namespace = 'jabber:iq:register'
name = 'query'
plugin_attrib = 'register'
interfaces = set(('username', 'password', 'email', 'nick', 'name',
'first', 'last', 'address', 'city', 'state', 'zip',
'phone', 'url', 'date', 'misc', 'text', 'key',
'registered', 'remove', 'instructions', 'fields'))
interfaces = {'username', 'password', 'email', 'nick', 'name',
'first', 'last', 'address', 'city', 'state', 'zip',
'phone', 'url', 'date', 'misc', 'text', 'key',
'registered', 'remove', 'instructions', 'fields'}
sub_interfaces = interfaces
form_fields = set(('username', 'password', 'email', 'nick', 'name',
'first', 'last', 'address', 'city', 'state', 'zip',
'phone', 'url', 'date', 'misc', 'text', 'key'))
form_fields = {'username', 'password', 'email', 'nick', 'name',
'first', 'last', 'address', 'city', 'state', 'zip',
'phone', 'url', 'date', 'misc', 'text', 'key'}
def get_registered(self):
present = self.xml.find('{%s}registered' % self.namespace)

View File

@@ -13,8 +13,8 @@ class IqAuth(ElementBase):
namespace = 'jabber:iq:auth'
name = 'query'
plugin_attrib = 'auth'
interfaces = set(('fields', 'username', 'password', 'resource', 'digest'))
sub_interfaces = set(('username', 'password', 'resource', 'digest'))
interfaces = {'fields', 'username', 'password', 'resource', 'digest'}
sub_interfaces = {'username', 'password', 'resource', 'digest'}
plugin_tag_map = {}
plugin_attrib_map = {}

View File

@@ -27,7 +27,7 @@ class XEP_0079(BasePlugin):
name = 'xep_0079'
description = 'XEP-0079: Advanced Message Processing'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -8,6 +8,7 @@
from __future__ import unicode_literals
from slixmpp import JID
from slixmpp.xmlstream import ElementBase, register_stanza_plugin
@@ -15,7 +16,7 @@ class AMP(ElementBase):
namespace = 'http://jabber.org/protocol/amp'
name = 'amp'
plugin_attrib = 'amp'
interfaces = set(['from', 'to', 'status', 'per_hop'])
interfaces = {'from', 'to', 'status', 'per_hop'}
def get_from(self):
return JID(self._get_attr('from'))
@@ -53,7 +54,7 @@ class Rule(ElementBase):
name = 'rule'
plugin_attrib = name
plugin_multi_attrib = 'rules'
interfaces = set(['action', 'condition', 'value'])
interfaces = {'action', 'condition', 'value'}
class InvalidRules(ElementBase):

View File

@@ -25,7 +25,7 @@ class XEP_0080(BasePlugin):
name = 'xep_0080'
description = 'XEP-0080: User Location'
dependencies = set(['xep_0163'])
dependencies = {'xep_0163'}
stanza = stanza
def plugin_end(self):

View File

@@ -65,11 +65,11 @@ class Geoloc(ElementBase):
namespace = 'http://jabber.org/protocol/geoloc'
name = 'geoloc'
interfaces = set(('accuracy', 'alt', 'area', 'bearing', 'building',
'country', 'countrycode', 'datum', 'dscription',
'error', 'floor', 'lat', 'locality', 'lon',
'postalcode', 'region', 'room', 'speed', 'street',
'text', 'timestamp', 'uri'))
interfaces = {'accuracy', 'alt', 'area', 'bearing', 'building',
'country', 'countrycode', 'datum', 'dscription',
'error', 'floor', 'lat', 'locality', 'lon',
'postalcode', 'region', 'room', 'speed', 'street',
'text', 'timestamp', 'uri'}
sub_interfaces = interfaces
plugin_attrib = name

View File

@@ -24,7 +24,7 @@ class XEP_0084(BasePlugin):
name = 'xep_0084'
description = 'XEP-0084: User Avatar'
dependencies = set(['xep_0163', 'xep_0060'])
dependencies = {'xep_0163', 'xep_0060'}
stanza = stanza
def plugin_init(self):

View File

@@ -16,7 +16,7 @@ class Data(ElementBase):
name = 'data'
namespace = 'urn:xmpp:avatar:data'
plugin_attrib = 'avatar_data'
interfaces = set(['value'])
interfaces = {'value'}
def get_value(self):
if self.xml.text:
@@ -63,7 +63,7 @@ class Info(ElementBase):
namespace = 'urn:xmpp:avatar:metadata'
plugin_attrib = 'info'
plugin_multi_attrib = 'items'
interfaces = set(['bytes', 'height', 'id', 'type', 'url', 'width'])
interfaces = {'bytes', 'height', 'id', 'type', 'url', 'width'}
class Pointer(ElementBase):

View File

@@ -28,7 +28,7 @@ class XEP_0085(BasePlugin):
name = 'xep_0085'
description = 'XEP-0085: Chat State Notifications'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):

View File

@@ -37,11 +37,11 @@ class ChatState(ElementBase):
name = ''
namespace = 'http://jabber.org/protocol/chatstates'
plugin_attrib = 'chat_state'
interfaces = set(('chat_state',))
interfaces = {'chat_state'}
sub_interfaces = interfaces
is_extension = True
states = set(('active', 'composing', 'gone', 'inactive', 'paused'))
states = {'active', 'composing', 'gone', 'inactive', 'paused'}
def setup(self, xml=None):
self.xml = ET.Element('')

View File

@@ -44,7 +44,7 @@ class LegacyError(ElementBase):
name = 'legacy'
namespace = Error.namespace
plugin_attrib = name
interfaces = set(('condition',))
interfaces = {'condition'}
overrides = ['set_condition']
error_map = {'bad-request': ('modify', '400'),

View File

@@ -18,7 +18,7 @@ class LegacyDelay(ElementBase):
name = 'x'
namespace = 'jabber:x:delay'
plugin_attrib = 'legacy_delay'
interfaces = set(('from', 'stamp', 'text'))
interfaces = {'from', 'stamp', 'text'}
def get_from(self):
from_ = self._get_attr('from')

View File

@@ -38,5 +38,5 @@ class Version(ElementBase):
name = 'query'
namespace = 'jabber:iq:version'
plugin_attrib = 'software_version'
interfaces = set(('name', 'version', 'os'))
interfaces = {'name', 'version', 'os'}
sub_interfaces = interfaces

View File

@@ -28,7 +28,7 @@ class XEP_0092(BasePlugin):
name = 'xep_0092'
description = 'XEP-0092: Software Version'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
default_config = {
'software_name': 'Slixmpp',

View File

@@ -13,7 +13,7 @@ class SI(ElementBase):
name = 'si'
namespace = 'http://jabber.org/protocol/si'
plugin_attrib = 'si'
interfaces = set(['id', 'mime_type', 'profile'])
interfaces = {'id', 'mime_type', 'profile'}
def get_mime_type(self):
return self._get_attr('mime-type', 'application/octet-stream')

View File

@@ -31,7 +31,7 @@ class XEP_0095(BasePlugin):
name = 'xep_0095'
description = 'XEP-0095: Stream Initiation'
dependencies = set(['xep_0020', 'xep_0030', 'xep_0047', 'xep_0065'])
dependencies = {'xep_0020', 'xep_0030', 'xep_0047', 'xep_0065'}
stanza = stanza
def plugin_init(self):

View File

@@ -23,7 +23,7 @@ class XEP_0096(BasePlugin):
name = 'xep_0096'
description = 'XEP-0096: SI File Transfer'
dependencies = set(['xep_0095'])
dependencies = {'xep_0095'}
stanza = stanza
def plugin_init(self):

View File

@@ -16,8 +16,8 @@ class File(ElementBase):
name = 'file'
namespace = 'http://jabber.org/protocol/si/profile/file-transfer'
plugin_attrib = 'file'
interfaces = set(['name', 'size', 'date', 'hash', 'desc'])
sub_interfaces = set(['desc'])
interfaces = {'name', 'size', 'date', 'hash', 'desc'}
sub_interfaces = {'desc'}
def set_size(self, value):
self._set_attr('size', str(value))
@@ -36,7 +36,7 @@ class Range(ElementBase):
name = 'range'
namespace = 'http://jabber.org/protocol/si/profile/file-transfer'
plugin_attrib = 'range'
interfaces = set(['length', 'offset'])
interfaces = {'length', 'offset'}
def set_length(self, value):
self._set_attr('length', str(value))

View File

@@ -14,7 +14,7 @@ class XEP_0106(BasePlugin):
name = 'xep_0106'
description = 'XEP-0106: JID Escaping'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
def session_bind(self, jid):
self.xmpp['xep_0030'].add_feature(feature='jid\\20escaping')

View File

@@ -14,25 +14,25 @@ class UserMood(ElementBase):
name = 'mood'
namespace = 'http://jabber.org/protocol/mood'
plugin_attrib = 'mood'
interfaces = set(['value', 'text'])
sub_interfaces = set(['text'])
moods = set(['afraid', 'amazed', 'amorous', 'angry', 'annoyed', 'anxious',
'aroused', 'ashamed', 'bored', 'brave', 'calm', 'cautious',
'cold', 'confident', 'confused', 'contemplative', 'contented',
'cranky', 'crazy', 'creative', 'curious', 'dejected',
'depressed', 'disappointed', 'disgusted', 'dismayed',
'distracted', 'embarrassed', 'envious', 'excited',
'flirtatious', 'frustrated', 'grateful', 'grieving', 'grumpy',
'guilty', 'happy', 'hopeful', 'hot', 'humbled', 'humiliated',
'hungry', 'hurt', 'impressed', 'in_awe', 'in_love',
'indignant', 'interested', 'intoxicated', 'invincible',
'jealous', 'lonely', 'lost', 'lucky', 'mean', 'moody',
'nervous', 'neutral', 'offended', 'outraged', 'playful',
'proud', 'relaxed', 'relieved', 'remorseful', 'restless',
'sad', 'sarcastic', 'satisfied', 'serious', 'shocked',
'shy', 'sick', 'sleepy', 'spontaneous', 'stressed', 'strong',
'surprised', 'thankful', 'thirsty', 'tired', 'undefined',
'weak', 'worried'])
interfaces = {'value', 'text'}
sub_interfaces = {'text'}
moods = {'afraid', 'amazed', 'amorous', 'angry', 'annoyed', 'anxious',
'aroused', 'ashamed', 'bored', 'brave', 'calm', 'cautious',
'cold', 'confident', 'confused', 'contemplative', 'contented',
'cranky', 'crazy', 'creative', 'curious', 'dejected',
'depressed', 'disappointed', 'disgusted', 'dismayed',
'distracted', 'embarrassed', 'envious', 'excited',
'flirtatious', 'frustrated', 'grateful', 'grieving', 'grumpy',
'guilty', 'happy', 'hopeful', 'hot', 'humbled', 'humiliated',
'hungry', 'hurt', 'impressed', 'in_awe', 'in_love',
'indignant', 'interested', 'intoxicated', 'invincible',
'jealous', 'lonely', 'lost', 'lucky', 'mean', 'moody',
'nervous', 'neutral', 'offended', 'outraged', 'playful',
'proud', 'relaxed', 'relieved', 'remorseful', 'restless',
'sad', 'sarcastic', 'satisfied', 'serious', 'shocked',
'shy', 'sick', 'sleepy', 'spontaneous', 'stressed', 'strong',
'surprised', 'thankful', 'thirsty', 'tired', 'undefined',
'weak', 'worried'}
def set_value(self, value):
self.del_value()

View File

@@ -27,7 +27,7 @@ class XEP_0107(BasePlugin):
name = 'xep_0107'
description = 'XEP-0107: User Mood'
dependencies = set(['xep_0163'])
dependencies = {'xep_0163'}
stanza = stanza
def plugin_init(self):

View File

@@ -14,30 +14,30 @@ class UserActivity(ElementBase):
name = 'activity'
namespace = 'http://jabber.org/protocol/activity'
plugin_attrib = 'activity'
interfaces = set(['value', 'text'])
sub_interfaces = set(['text'])
general = set(['doing_chores', 'drinking', 'eating', 'exercising',
'grooming', 'having_appointment', 'inactive', 'relaxing',
'talking', 'traveling', 'undefined', 'working'])
specific = set(['at_the_spa', 'brushing_teeth', 'buying_groceries',
'cleaning', 'coding', 'commuting', 'cooking', 'cycling',
'dancing', 'day_off', 'doing_maintenance',
'doing_the_dishes', 'doing_the_laundry', 'driving',
'fishing', 'gaming', 'gardening', 'getting_a_haircut',
'going_out', 'hanging_out', 'having_a_beer',
'having_a_snack', 'having_breakfast', 'having_coffee',
'having_dinner', 'having_lunch', 'having_tea', 'hiding',
'hiking', 'in_a_car', 'in_a_meeting', 'in_real_life',
'jogging', 'on_a_bus', 'on_a_plane', 'on_a_train',
'on_a_trip', 'on_the_phone', 'on_vacation',
'on_video_phone', 'other', 'partying', 'playing_sports',
'praying', 'reading', 'rehearsing', 'running',
'running_an_errand', 'scheduled_holiday', 'shaving',
'shopping', 'skiing', 'sleeping', 'smoking',
'socializing', 'studying', 'sunbathing', 'swimming',
'taking_a_bath', 'taking_a_shower', 'thinking',
'walking', 'walking_the_dog', 'watching_a_movie',
'watching_tv', 'working_out', 'writing'])
interfaces = {'value', 'text'}
sub_interfaces = {'text'}
general = {'doing_chores', 'drinking', 'eating', 'exercising',
'grooming', 'having_appointment', 'inactive', 'relaxing',
'talking', 'traveling', 'undefined', 'working'}
specific = {'at_the_spa', 'brushing_teeth', 'buying_groceries',
'cleaning', 'coding', 'commuting', 'cooking', 'cycling',
'dancing', 'day_off', 'doing_maintenance',
'doing_the_dishes', 'doing_the_laundry', 'driving',
'fishing', 'gaming', 'gardening', 'getting_a_haircut',
'going_out', 'hanging_out', 'having_a_beer',
'having_a_snack', 'having_breakfast', 'having_coffee',
'having_dinner', 'having_lunch', 'having_tea', 'hiding',
'hiking', 'in_a_car', 'in_a_meeting', 'in_real_life',
'jogging', 'on_a_bus', 'on_a_plane', 'on_a_train',
'on_a_trip', 'on_the_phone', 'on_vacation',
'on_video_phone', 'other', 'partying', 'playing_sports',
'praying', 'reading', 'rehearsing', 'running',
'running_an_errand', 'scheduled_holiday', 'shaving',
'shopping', 'skiing', 'sleeping', 'smoking',
'socializing', 'studying', 'sunbathing', 'swimming',
'taking_a_bath', 'taking_a_shower', 'thinking',
'walking', 'walking_the_dog', 'watching_a_movie',
'watching_tv', 'working_out', 'writing'}
def set_value(self, value):
self.del_value()

View File

@@ -23,7 +23,7 @@ class XEP_0108(BasePlugin):
name = 'xep_0108'
description = 'XEP-0108: User Activity'
dependencies = set(['xep_0163'])
dependencies = {'xep_0163'}
stanza = stanza
def plugin_end(self):

View File

@@ -32,7 +32,7 @@ class XEP_0115(BasePlugin):
name = 'xep_0115'
description = 'XEP-0115: Entity Capabilities'
dependencies = set(['xep_0030', 'xep_0128', 'xep_0004'])
dependencies = {'xep_0030', 'xep_0128', 'xep_0004'}
stanza = stanza
default_config = {
'hash': 'sha-1',

View File

@@ -16,4 +16,4 @@ class Capabilities(ElementBase):
namespace = 'http://jabber.org/protocol/caps'
name = 'c'
plugin_attrib = 'caps'
interfaces = set(('hash', 'node', 'ver', 'ext'))
interfaces = {'hash', 'node', 'ver', 'ext'}

View File

@@ -14,8 +14,8 @@ class UserTune(ElementBase):
name = 'tune'
namespace = 'http://jabber.org/protocol/tune'
plugin_attrib = 'tune'
interfaces = set(['artist', 'length', 'rating', 'source',
'title', 'track', 'uri'])
interfaces = {'artist', 'length', 'rating', 'source',
'title', 'track', 'uri'}
sub_interfaces = interfaces
def set_length(self, value):

View File

@@ -23,7 +23,7 @@ class XEP_0118(BasePlugin):
name = 'xep_0118'
description = 'XEP-0118: User Tune'
dependencies = set(['xep_0163'])
dependencies = {'xep_0163'}
stanza = stanza
def plugin_end(self):

View File

@@ -12,7 +12,7 @@ class XEP_0122(BasePlugin):
name = 'xep_0122'
description = 'XEP-0122: Data Forms Validation'
dependencies = set(['xep_0004'])
dependencies = {'xep_0004'}
stanza = stanza
def plugin_init(self):

View File

@@ -41,7 +41,7 @@ class XEP_0128(BasePlugin):
name = 'xep_0128'
description = 'XEP-0128: Service Discovery Extensions'
dependencies = set(['xep_0030', 'xep_0004'])
dependencies = {'xep_0030', 'xep_0004'}
def plugin_init(self):
"""Start the XEP-0128 plugin."""

View File

@@ -17,7 +17,7 @@ class XEP_0131(BasePlugin):
name = 'xep_0131'
description = 'XEP-0131: Stanza Headers and Internet Metadata'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
default_config = {
'supported_headers': set()

View File

@@ -14,7 +14,7 @@ class Headers(ElementBase):
name = 'headers'
namespace = 'http://jabber.org/protocol/shim'
plugin_attrib = 'headers'
interfaces = set(['headers'])
interfaces = {'headers'}
is_extension = True
def get_headers(self):

View File

@@ -14,19 +14,19 @@ class XEP_0133(BasePlugin):
name = 'xep_0133'
description = 'XEP-0133: Service Administration'
dependencies = set(['xep_0030', 'xep_0004', 'xep_0050'])
commands = set(['add-user', 'delete-user', 'disable-user',
'reenable-user', 'end-user-session', 'get-user-password',
'change-user-password', 'get-user-roster',
'get-user-lastlogin', 'user-stats', 'edit-blacklist',
'edit-whitelist', 'get-registered-users-num',
'get-disabled-users-num', 'get-online-users-num',
'get-active-users-num', 'get-idle-users-num',
'get-registered-users-list', 'get-disabled-users-list',
'get-online-users-list', 'get-online-users',
'get-active-users', 'get-idle-userslist', 'announce',
'set-motd', 'edit-motd', 'delete-motd', 'set-welcome',
'delete-welcome', 'edit-admin', 'restart', 'shutdown'])
dependencies = {'xep_0030', 'xep_0004', 'xep_0050'}
commands = {'add-user', 'delete-user', 'disable-user',
'reenable-user', 'end-user-session', 'get-user-password',
'change-user-password', 'get-user-roster',
'get-user-lastlogin', 'user-stats', 'edit-blacklist',
'edit-whitelist', 'get-registered-users-num',
'get-disabled-users-num', 'get-online-users-num',
'get-active-users-num', 'get-idle-users-num',
'get-registered-users-list', 'get-disabled-users-list',
'get-online-users-list', 'get-online-users',
'get-active-users', 'get-idle-userslist', 'announce',
'set-motd', 'edit-motd', 'delete-motd', 'set-welcome',
'delete-welcome', 'edit-admin', 'restart', 'shutdown'}
def get_commands(self, jid=None, **kwargs):
if jid is None:

View File

@@ -22,7 +22,7 @@ log = logging.getLogger(__name__)
class Compression(ElementBase):
name = 'compression'
namespace = 'http://jabber.org/features/compress'
interfaces = set(('methods',))
interfaces = {'methods'}
plugin_attrib = 'compression'
plugin_tag_map = {}
plugin_attrib_map = {}
@@ -37,7 +37,7 @@ class Compression(ElementBase):
class Compress(StanzaBase):
name = 'compress'
namespace = 'http://jabber.org/protocol/compress'
interfaces = set(('method',))
interfaces = {'method'}
sub_interfaces = interfaces
plugin_attrib = 'compress'
plugin_tag_map = {}
@@ -95,7 +95,7 @@ class XEP_0138(BasePlugin):
"""
name = "xep_0138"
description = "XEP-0138: Compression"
dependencies = set(["xep_0030"])
dependencies = {"xep_0030"}
def plugin_init(self):
self.xep = '0138'

View File

@@ -23,7 +23,7 @@ class XEP_0152(BasePlugin):
name = 'xep_0152'
description = 'XEP-0152: Reachability Addresses'
dependencies = set(['xep_0163'])
dependencies = {'xep_0163'}
stanza = stanza
def plugin_end(self):

View File

@@ -21,9 +21,9 @@ class Address(ElementBase):
namespace = 'urn:xmpp:reach:0'
plugin_attrib = 'address'
plugin_multi_attrib = 'addresses'
interfaces = set(['uri', 'desc'])
lang_interfaces = set(['desc'])
sub_interfaces = set(['desc'])
interfaces = {'uri', 'desc'}
lang_interfaces = {'desc'}
sub_interfaces = {'desc'}
register_stanza_plugin(Reachability, Address, iterable=True)

View File

@@ -13,7 +13,7 @@ class VCardTempUpdate(ElementBase):
name = 'x'
namespace = 'vcard-temp:x:update'
plugin_attrib = 'vcard_temp_update'
interfaces = set(['photo'])
interfaces = {'photo'}
sub_interfaces = interfaces
def set_photo(self, value):

View File

@@ -24,7 +24,7 @@ class XEP_0153(BasePlugin):
name = 'xep_0153'
description = 'XEP-0153: vCard-Based Avatars'
dependencies = set(['xep_0054'])
dependencies = {'xep_0054'}
stanza = stanza
def plugin_init(self):

View File

@@ -24,7 +24,7 @@ class XEP_0163(BasePlugin):
name = 'xep_0163'
description = 'XEP-0163: Personal Eventing Protocol (PEP)'
dependencies = set(['xep_0030', 'xep_0060', 'xep_0115'])
dependencies = {'xep_0030', 'xep_0060', 'xep_0115'}
def register_pep(self, name, stanza):
"""

View File

@@ -46,7 +46,7 @@ class UserNick(ElementBase):
namespace = 'http://jabber.org/protocol/nick'
name = 'nick'
plugin_attrib = name
interfaces = set(('nick',))
interfaces = {'nick'}
def set_nick(self, nick):
"""

View File

@@ -28,7 +28,7 @@ class XEP_0172(BasePlugin):
name = 'xep_0172'
description = 'XEP-0172: User Nickname'
dependencies = set(['xep_0163'])
dependencies = {'xep_0163'}
stanza = stanza
def plugin_init(self):

View File

@@ -24,7 +24,7 @@ class XEP_0184(BasePlugin):
name = 'xep_0184'
description = 'XEP-0184: Message Delivery Receipts'
dependencies = set(['xep_0030'])
dependencies = {'xep_0030'}
stanza = stanza
default_config = {
'auto_ack': True,

Some files were not shown because too many files have changed in this diff Show More