summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml8
-rw-r--r--README.rst2
-rw-r--r--docs/create_plugin.rst10
-rw-r--r--docs/getting_started/muc.rst2
-rwxr-xr-xexamples/custom_stanzas/custom_stanza_provider.py19
-rwxr-xr-xexamples/custom_stanzas/custom_stanza_user.py12
-rw-r--r--examples/custom_stanzas/stanza.py2
-rwxr-xr-xexamples/gtalk_custom_domain.py4
-rw-r--r--examples/http_over_xmpp.py30
-rwxr-xr-xsetup.py26
-rw-r--r--slixmpp/clientxmpp.py16
-rw-r--r--slixmpp/features/feature_bind/stanza.py2
-rw-r--r--slixmpp/features/feature_mechanisms/mechanisms.py2
-rw-r--r--slixmpp/features/feature_mechanisms/stanza/auth.py4
-rw-r--r--slixmpp/features/feature_mechanisms/stanza/challenge.py2
-rw-r--r--slixmpp/features/feature_mechanisms/stanza/failure.py13
-rw-r--r--slixmpp/features/feature_mechanisms/stanza/mechanisms.py2
-rw-r--r--slixmpp/features/feature_mechanisms/stanza/response.py2
-rw-r--r--slixmpp/features/feature_mechanisms/stanza/success.py2
-rw-r--r--slixmpp/features/feature_starttls/stanza.py2
-rw-r--r--slixmpp/plugins/gmail_notify.py14
-rw-r--r--slixmpp/plugins/google/__init__.py47
-rw-r--r--slixmpp/plugins/google/auth/__init__.py10
-rw-r--r--slixmpp/plugins/google/auth/auth.py47
-rw-r--r--slixmpp/plugins/google/auth/stanza.py2
-rw-r--r--slixmpp/plugins/google/gmail/__init__.py10
-rw-r--r--slixmpp/plugins/google/gmail/stanza.py101
-rw-r--r--slixmpp/plugins/google/nosave/__init__.py10
-rw-r--r--slixmpp/plugins/google/nosave/nosave.py78
-rw-r--r--slixmpp/plugins/google/nosave/stanza.py4
-rw-r--r--slixmpp/plugins/google/settings/__init__.py10
-rw-r--r--slixmpp/plugins/google/settings/stanza.py110
-rw-r--r--slixmpp/plugins/xep_0004/dataforms.py2
-rw-r--r--slixmpp/plugins/xep_0004/stanza/field.py26
-rw-r--r--slixmpp/plugins/xep_0004/stanza/form.py4
-rw-r--r--slixmpp/plugins/xep_0009/rpc.py4
-rw-r--r--slixmpp/plugins/xep_0009/stanza/RPC.py12
-rw-r--r--slixmpp/plugins/xep_0012/last_activity.py2
-rw-r--r--slixmpp/plugins/xep_0012/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0013/offline.py2
-rw-r--r--slixmpp/plugins/xep_0013/stanza.py6
-rw-r--r--slixmpp/plugins/xep_0016/privacy.py2
-rw-r--r--slixmpp/plugins/xep_0016/stanza.py12
-rw-r--r--slixmpp/plugins/xep_0020/feature_negotiation.py2
-rw-r--r--slixmpp/plugins/xep_0027/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0030/stanza/info.py6
-rw-r--r--slixmpp/plugins/xep_0030/stanza/items.py6
-rw-r--r--slixmpp/plugins/xep_0033/addresses.py2
-rw-r--r--slixmpp/plugins/xep_0033/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0045.py8
-rw-r--r--slixmpp/plugins/xep_0047/ibb.py2
-rw-r--r--slixmpp/plugins/xep_0047/stanza.py8
-rw-r--r--slixmpp/plugins/xep_0048/bookmarks.py2
-rw-r--r--slixmpp/plugins/xep_0048/stanza.py6
-rw-r--r--slixmpp/plugins/xep_0049/private_storage.py2
-rw-r--r--slixmpp/plugins/xep_0050/adhoc.py10
-rw-r--r--slixmpp/plugins/xep_0050/stanza.py10
-rw-r--r--slixmpp/plugins/xep_0054/stanza.py94
-rw-r--r--slixmpp/plugins/xep_0054/vcard_temp.py2
-rw-r--r--slixmpp/plugins/xep_0059/rsm.py2
-rw-r--r--slixmpp/plugins/xep_0059/stanza.py8
-rw-r--r--slixmpp/plugins/xep_0060/pubsub.py2
-rw-r--r--slixmpp/plugins/xep_0060/stanza/base.py2
-rw-r--r--slixmpp/plugins/xep_0060/stanza/pubsub.py32
-rw-r--r--slixmpp/plugins/xep_0060/stanza/pubsub_errors.py20
-rw-r--r--slixmpp/plugins/xep_0060/stanza/pubsub_event.py20
-rw-r--r--slixmpp/plugins/xep_0060/stanza/pubsub_owner.py20
-rw-r--r--slixmpp/plugins/xep_0065/proxy.py4
-rw-r--r--slixmpp/plugins/xep_0065/stanza.py8
-rw-r--r--slixmpp/plugins/xep_0066/oob.py2
-rw-r--r--slixmpp/plugins/xep_0066/stanza.py6
-rw-r--r--slixmpp/plugins/xep_0071/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0071/xhtml_im.py2
-rw-r--r--slixmpp/plugins/xep_0077/register.py2
-rw-r--r--slixmpp/plugins/xep_0077/stanza.py14
-rw-r--r--slixmpp/plugins/xep_0078/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0079/amp.py2
-rw-r--r--slixmpp/plugins/xep_0079/stanza.py5
-rw-r--r--slixmpp/plugins/xep_0080/geoloc.py2
-rw-r--r--slixmpp/plugins/xep_0080/stanza.py10
-rw-r--r--slixmpp/plugins/xep_0084/avatar.py2
-rw-r--r--slixmpp/plugins/xep_0084/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0085/chat_states.py2
-rw-r--r--slixmpp/plugins/xep_0085/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0086/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0091/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0092/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0092/version.py2
-rw-r--r--slixmpp/plugins/xep_0095/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0095/stream_initiation.py2
-rw-r--r--slixmpp/plugins/xep_0096/file_transfer.py2
-rw-r--r--slixmpp/plugins/xep_0096/stanza.py6
-rw-r--r--slixmpp/plugins/xep_0106.py2
-rw-r--r--slixmpp/plugins/xep_0107/stanza.py38
-rw-r--r--slixmpp/plugins/xep_0107/user_mood.py2
-rw-r--r--slixmpp/plugins/xep_0108/stanza.py48
-rw-r--r--slixmpp/plugins/xep_0108/user_activity.py2
-rw-r--r--slixmpp/plugins/xep_0115/caps.py2
-rw-r--r--slixmpp/plugins/xep_0115/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0118/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0118/user_tune.py2
-rw-r--r--slixmpp/plugins/xep_0122/data_validation.py2
-rw-r--r--slixmpp/plugins/xep_0128/extended_disco.py2
-rw-r--r--slixmpp/plugins/xep_0131/headers.py2
-rw-r--r--slixmpp/plugins/xep_0131/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0133.py26
-rw-r--r--slixmpp/plugins/xep_0138.py6
-rw-r--r--slixmpp/plugins/xep_0152/reachability.py2
-rw-r--r--slixmpp/plugins/xep_0152/stanza.py6
-rw-r--r--slixmpp/plugins/xep_0153/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0153/vcard_avatar.py2
-rw-r--r--slixmpp/plugins/xep_0163.py2
-rw-r--r--slixmpp/plugins/xep_0172/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0172/user_nick.py2
-rw-r--r--slixmpp/plugins/xep_0184/receipt.py2
-rw-r--r--slixmpp/plugins/xep_0184/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0186/invisible_command.py2
-rw-r--r--slixmpp/plugins/xep_0191/blocking.py2
-rw-r--r--slixmpp/plugins/xep_0191/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0196/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0196/user_gaming.py2
-rw-r--r--slixmpp/plugins/xep_0198/stanza.py12
-rw-r--r--slixmpp/plugins/xep_0199/ping.py2
-rw-r--r--slixmpp/plugins/xep_0202/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0202/time.py2
-rw-r--r--slixmpp/plugins/xep_0203/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0221/media.py2
-rw-r--r--slixmpp/plugins/xep_0221/stanza.py6
-rw-r--r--slixmpp/plugins/xep_0222.py4
-rw-r--r--slixmpp/plugins/xep_0223.py4
-rw-r--r--slixmpp/plugins/xep_0224/attention.py2
-rw-r--r--slixmpp/plugins/xep_0224/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0231/bob.py2
-rw-r--r--slixmpp/plugins/xep_0231/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0235/oauth.py2
-rw-r--r--slixmpp/plugins/xep_0235/stanza.py6
-rw-r--r--slixmpp/plugins/xep_0242.py6
-rw-r--r--slixmpp/plugins/xep_0249/invite.py2
-rw-r--r--slixmpp/plugins/xep_0256.py2
-rw-r--r--slixmpp/plugins/xep_0256/last_activity_presence.py2
-rw-r--r--slixmpp/plugins/xep_0257/client_cert_management.py2
-rw-r--r--slixmpp/plugins/xep_0257/stanza.py14
-rw-r--r--slixmpp/plugins/xep_0258/security_labels.py2
-rw-r--r--slixmpp/plugins/xep_0258/stanza.py9
-rw-r--r--slixmpp/plugins/xep_0270.py4
-rw-r--r--slixmpp/plugins/xep_0279/ipcheck.py2
-rw-r--r--slixmpp/plugins/xep_0279/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0280/carbons.py8
-rw-r--r--slixmpp/plugins/xep_0280/stanza.py4
-rw-r--r--slixmpp/plugins/xep_0297/forwarded.py2
-rw-r--r--slixmpp/plugins/xep_0297/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0300/__init__.py16
-rw-r--r--slixmpp/plugins/xep_0300/hash.py87
-rw-r--r--slixmpp/plugins/xep_0300/stanza.py35
-rw-r--r--slixmpp/plugins/xep_0302.py6
-rw-r--r--slixmpp/plugins/xep_0308/correction.py2
-rw-r--r--slixmpp/plugins/xep_0308/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0313/mam.py2
-rw-r--r--slixmpp/plugins/xep_0313/stanza.py14
-rw-r--r--slixmpp/plugins/xep_0319/idle.py2
-rw-r--r--slixmpp/plugins/xep_0319/stanza.py2
-rw-r--r--slixmpp/plugins/xep_0323/sensordata.py2
-rw-r--r--slixmpp/plugins/xep_0323/stanza/sensordata.py72
-rw-r--r--slixmpp/plugins/xep_0325/control.py2
-rw-r--r--slixmpp/plugins/xep_0325/stanza/control.py20
-rw-r--r--slixmpp/plugins/xep_0332/http.py6
-rw-r--r--slixmpp/plugins/xep_0332/stanza/data.py2
-rw-r--r--slixmpp/plugins/xep_0332/stanza/request.py2
-rw-r--r--slixmpp/plugins/xep_0332/stanza/response.py2
-rw-r--r--slixmpp/plugins/xep_0333/hints.py2
-rw-r--r--slixmpp/plugins/xep_0380/__init__.py15
-rw-r--r--slixmpp/plugins/xep_0380/eme.py69
-rw-r--r--slixmpp/plugins/xep_0380/stanza.py16
-rw-r--r--slixmpp/stanza/atom.py9
-rw-r--r--slixmpp/stanza/error.py26
-rw-r--r--slixmpp/stanza/iq.py4
-rw-r--r--slixmpp/stanza/message.py8
-rw-r--r--slixmpp/stanza/presence.py15
-rw-r--r--slixmpp/stanza/roster.py5
-rw-r--r--slixmpp/stanza/stream_error.py6
-rw-r--r--slixmpp/stanza/stream_features.py2
-rw-r--r--slixmpp/util/sasl/client.py2
-rw-r--r--slixmpp/util/sasl/mechanisms.py41
-rw-r--r--slixmpp/util/stringprep_profiles.py3
-rw-r--r--slixmpp/version.py4
-rw-r--r--slixmpp/xmlstream/cert.py2
-rw-r--r--slixmpp/xmlstream/stanzabase.py16
-rw-r--r--slixmpp/xmlstream/xmlstream.py77
-rw-r--r--tests/test_plugins.py8
-rw-r--r--tests/test_stanza_element.py90
-rw-r--r--tests/test_stanza_xep_0030.py18
-rw-r--r--tests/test_stanza_xep_0050.py2
-rw-r--r--tests/test_stanza_xep_0300.py57
-rw-r--r--tests/test_stanza_xep_0380.py37
-rw-r--r--tests/test_stream_presence.py8
-rw-r--r--tests/test_stream_xep_0030.py8
-rw-r--r--tests/test_stream_xep_0047.py2
-rw-r--r--tests/test_stream_xep_0050.py2
198 files changed, 1498 insertions, 675 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 00000000..a6120a12
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,8 @@
+test:
+ tags:
+ - docker
+ image: ubuntu:latest
+ script:
+ - apt update
+ - apt install -y python3 cython3
+ - ./run_tests.py
diff --git a/README.rst b/README.rst
index 1fac8dd9..96bce48c 100644
--- a/README.rst
+++ b/README.rst
@@ -36,7 +36,7 @@ The Slixmpp Boilerplate
-------------------------
Projects using Slixmpp tend to follow a basic pattern for setting up client/component
connections and configuration. Here is the gist of the boilerplate needed for a Slixmpp
-based project. See the documetation or examples directory for more detailed archetypes for
+based project. See the documentation or examples directory for more detailed archetypes for
Slixmpp projects::
import logging
diff --git a/docs/create_plugin.rst b/docs/create_plugin.rst
index 9bfb053f..437374c7 100644
--- a/docs/create_plugin.rst
+++ b/docs/create_plugin.rst
@@ -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):
diff --git a/docs/getting_started/muc.rst b/docs/getting_started/muc.rst
index 0a641b8b..5bbc382a 100644
--- a/docs/getting_started/muc.rst
+++ b/docs/getting_started/muc.rst
@@ -1,7 +1,7 @@
.. _mucbot:
=========================
-Mulit-User Chat (MUC) Bot
+Multi-User Chat (MUC) Bot
=========================
.. note::
diff --git a/examples/custom_stanzas/custom_stanza_provider.py b/examples/custom_stanzas/custom_stanza_provider.py
index 9927c449..bca4a904 100755
--- a/examples/custom_stanzas/custom_stanza_provider.py
+++ b/examples/custom_stanzas/custom_stanza_provider.py
@@ -50,7 +50,7 @@ class ActionBot(slixmpp.ClientXMPP):
register_stanza_plugin(Iq, Action)
- def start(self, event):
+ async def start(self, event):
"""
Process the session_start event.
@@ -73,7 +73,7 @@ class ActionBot(slixmpp.ClientXMPP):
"""
self.event('custom_action', iq)
- def _handle_action_event(self, iq):
+ async def _handle_action_event(self, iq):
"""
Respond to the custom action event.
"""
@@ -82,17 +82,20 @@ class ActionBot(slixmpp.ClientXMPP):
if method == 'is_prime' and param == '2':
print("got message: %s" % iq)
- iq.reply()
- iq['action']['status'] = 'done'
- iq.send()
+ rep = iq.reply()
+ rep['action']['status'] = 'done'
+ await rep.send()
elif method == 'bye':
print("got message: %s" % iq)
+ rep = iq.reply()
+ rep['action']['status'] = 'done'
+ await rep.send()
self.disconnect()
else:
print("got message: %s" % iq)
- iq.reply()
- iq['action']['status'] = 'error'
- iq.send()
+ rep = iq.reply()
+ rep['action']['status'] = 'error'
+ await rep.send()
if __name__ == '__main__':
# Setup the command line arguments.
diff --git a/examples/custom_stanzas/custom_stanza_user.py b/examples/custom_stanzas/custom_stanza_user.py
index c5630584..4119aa97 100755
--- a/examples/custom_stanzas/custom_stanza_user.py
+++ b/examples/custom_stanzas/custom_stanza_user.py
@@ -43,7 +43,7 @@ class ActionUserBot(slixmpp.ClientXMPP):
register_stanza_plugin(Iq, Action)
- def start(self, event):
+ async def start(self, event):
"""
Process the session_start event.
@@ -57,11 +57,11 @@ class ActionUserBot(slixmpp.ClientXMPP):
data.
"""
self.send_presence()
- self.get_roster()
+ await self.get_roster()
- self.send_custom_iq()
+ await self.send_custom_iq()
- def send_custom_iq(self):
+ async def send_custom_iq(self):
"""Create and send two custom actions.
If the first action was successful, then send
@@ -74,14 +74,14 @@ class ActionUserBot(slixmpp.ClientXMPP):
iq['action']['param'] = '2'
try:
- resp = iq.send()
+ resp = await iq.send()
if resp['action']['status'] == 'done':
#sending bye
iq2 = self.Iq()
iq2['to'] = self.action_provider
iq2['type'] = 'set'
iq2['action']['method'] = 'bye'
- iq2.send(block=False)
+ await iq2.send()
self.disconnect()
except XMPPError:
diff --git a/examples/custom_stanzas/stanza.py b/examples/custom_stanzas/stanza.py
index b2c6f766..17b7c7de 100644
--- a/examples/custom_stanzas/stanza.py
+++ b/examples/custom_stanzas/stanza.py
@@ -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
diff --git a/examples/gtalk_custom_domain.py b/examples/gtalk_custom_domain.py
index d25a5786..f055159b 100755
--- a/examples/gtalk_custom_domain.py
+++ b/examples/gtalk_custom_domain.py
@@ -55,8 +55,8 @@ class GTalkBot(slixmpp.ClientXMPP):
cert.verify('talk.google.com', der_cert)
logging.debug("CERT: Found GTalk certificate")
except cert.CertificateError as err:
- log.error(err.message)
- self.disconnect(send_close=False)
+ logging.error(err.message)
+ self.disconnect()
def start(self, event):
"""
diff --git a/examples/http_over_xmpp.py b/examples/http_over_xmpp.py
index 73e4a612..013f301b 100644
--- a/examples/http_over_xmpp.py
+++ b/examples/http_over_xmpp.py
@@ -13,7 +13,7 @@
from slixmpp import ClientXMPP
-from optparse import OptionParser
+from argparse import ArgumentParser
import logging
import getpass
@@ -23,7 +23,7 @@ class HTTPOverXMPPClient(ClientXMPP):
ClientXMPP.__init__(self, jid, password)
self.register_plugin('xep_0332') # HTTP over XMPP Transport
self.add_event_handler(
- 'session_start', self.session_start, threaded=True
+ 'session_start', self.session_start
)
self.add_event_handler('http_request', self.http_request_received)
self.add_event_handler('http_response', self.http_response_received)
@@ -58,40 +58,40 @@ if __name__ == '__main__':
# ./http_over_xmpp.py -J <jid> -P <pwd> -i <ip> -p <port> [-v]
#
- parser = OptionParser()
+ parser = ArgumentParser()
# Output verbosity options.
- parser.add_option(
+ parser.add_argument(
'-v', '--verbose', help='set logging to DEBUG', action='store_const',
dest='loglevel', const=logging.DEBUG, default=logging.ERROR
)
# JID and password options.
- parser.add_option('-J', '--jid', dest='jid', help='JID')
- parser.add_option('-P', '--password', dest='password', help='Password')
+ parser.add_argument('-J', '--jid', dest='jid', help='JID')
+ parser.add_argument('-P', '--password', dest='password', help='Password')
# XMPP server ip and port options.
- parser.add_option(
+ parser.add_argument(
'-i', '--ipaddr', dest='ipaddr',
help='IP Address of the XMPP server', default=None
)
- parser.add_option(
+ parser.add_argument(
'-p', '--port', dest='port',
help='Port of the XMPP server', default=None
)
- opts, args = parser.parse_args()
+ args = parser.parse_args()
# Setup logging.
- logging.basicConfig(level=opts.loglevel,
+ logging.basicConfig(level=args.loglevel,
format='%(levelname)-8s %(message)s')
- if opts.jid is None:
- opts.jid = input('Username: ')
- if opts.password is None:
- opts.password = getpass.getpass('Password: ')
+ if args.jid is None:
+ args.jid = input('Username: ')
+ if args.password is None:
+ args.password = getpass.getpass('Password: ')
- xmpp = HTTPOverXMPPClient(opts.jid, opts.password)
+ xmpp = HTTPOverXMPPClient(args.jid, args.password)
xmpp.connect()
xmpp.process()
diff --git a/setup.py b/setup.py
index 47bba942..3b3e5296 100755
--- a/setup.py
+++ b/setup.py
@@ -9,7 +9,7 @@
import os
from pathlib import Path
-from subprocess import call, DEVNULL
+from subprocess import call, DEVNULL, check_output, CalledProcessError
from tempfile import TemporaryFile
try:
from setuptools import setup
@@ -30,23 +30,39 @@ CLASSIFIERS = [
'License :: OSI Approved :: MIT License',
'Programming Language :: Python',
'Programming Language :: Python :: 3.4',
+ 'Programming Language :: Python :: 3.5',
+ 'Programming Language :: Python :: 3.6',
+ 'Topic :: Internet :: XMPP',
'Topic :: Software Development :: Libraries :: Python Modules',
]
packages = [str(mod.parent) for mod in Path('slixmpp').rglob('__init__.py')]
-def check_include(header):
- command = [os.environ.get('CC', 'cc'), '-E', '-']
+def check_include(library_name, header):
+ command = [os.environ.get('PKG_CONFIG', 'pkg-config'), '--cflags', library_name]
+ try:
+ cflags = check_output(command).decode('utf-8').split()
+ except FileNotFoundError:
+ print('pkg-config not found.')
+ return False
+ except CalledProcessError:
+ # pkg-config already prints the missing libraries on stderr.
+ return False
+ command = [os.environ.get('CC', 'cc')] + cflags + ['-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:
+ print('%s headers not found.' % library_name)
return False
+HAS_PYTHON_HEADERS = check_include('python3', 'Python.h')
+HAS_STRINGPREP_HEADERS = check_include('libidn', 'stringprep.h')
+
ext_modules = None
-if check_include('stringprep.h'):
+if HAS_PYTHON_HEADERS and HAS_STRINGPREP_HEADERS:
try:
from Cython.Build import cythonize
except ImportError:
@@ -54,7 +70,7 @@ if check_include('stringprep.h'):
else:
ext_modules = cythonize('slixmpp/stringprep.pyx')
else:
- print('libidn-dev not found, falling back to the slow stringprep module.')
+ print('Falling back to the slow stringprep module.')
setup(
name="slixmpp",
diff --git a/slixmpp/clientxmpp.py b/slixmpp/clientxmpp.py
index a4bb9a60..891a9fb6 100644
--- a/slixmpp/clientxmpp.py
+++ b/slixmpp/clientxmpp.py
@@ -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')
@@ -243,7 +255,7 @@ class ClientXMPP(BaseXMPP):
orig_cb(resp)
callback = wrapped
- iq.send(callback, timeout, timeout_callback)
+ return iq.send(callback, timeout, timeout_callback)
def _reset_connection_state(self, event=None):
#TODO: Use stream state here
diff --git a/slixmpp/features/feature_bind/stanza.py b/slixmpp/features/feature_bind/stanza.py
index b9ecd97c..96c3e757 100644
--- a/slixmpp/features/feature_bind/stanza.py
+++ b/slixmpp/features/feature_bind/stanza.py
@@ -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'
diff --git a/slixmpp/features/feature_mechanisms/mechanisms.py b/slixmpp/features/feature_mechanisms/mechanisms.py
index 8e507afc..33bdaff5 100644
--- a/slixmpp/features/feature_mechanisms/mechanisms.py
+++ b/slixmpp/features/feature_mechanisms/mechanisms.py
@@ -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'
diff --git a/slixmpp/features/feature_mechanisms/stanza/auth.py b/slixmpp/features/feature_mechanisms/stanza/auth.py
index c32069ec..48f0cf81 100644
--- a/slixmpp/features/feature_mechanisms/stanza/auth.py
+++ b/slixmpp/features/feature_mechanisms/stanza/auth.py
@@ -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)
diff --git a/slixmpp/features/feature_mechanisms/stanza/challenge.py b/slixmpp/features/feature_mechanisms/stanza/challenge.py
index 21a061ee..7fa76e18 100644
--- a/slixmpp/features/feature_mechanisms/stanza/challenge.py
+++ b/slixmpp/features/feature_mechanisms/stanza/challenge.py
@@ -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):
diff --git a/slixmpp/features/feature_mechanisms/stanza/failure.py b/slixmpp/features/feature_mechanisms/stanza/failure.py
index cc0ac877..adc686b7 100644
--- a/slixmpp/features/feature_mechanisms/stanza/failure.py
+++ b/slixmpp/features/feature_mechanisms/stanza/failure.py
@@ -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):
"""
diff --git a/slixmpp/features/feature_mechanisms/stanza/mechanisms.py b/slixmpp/features/feature_mechanisms/stanza/mechanisms.py
index 064b8d1f..4ff15678 100644
--- a/slixmpp/features/feature_mechanisms/stanza/mechanisms.py
+++ b/slixmpp/features/feature_mechanisms/stanza/mechanisms.py
@@ -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
diff --git a/slixmpp/features/feature_mechanisms/stanza/response.py b/slixmpp/features/feature_mechanisms/stanza/response.py
index 8da236ba..b25a0592 100644
--- a/slixmpp/features/feature_mechanisms/stanza/response.py
+++ b/slixmpp/features/feature_mechanisms/stanza/response.py
@@ -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):
diff --git a/slixmpp/features/feature_mechanisms/stanza/success.py b/slixmpp/features/feature_mechanisms/stanza/success.py
index f7cde0f8..70be1780 100644
--- a/slixmpp/features/feature_mechanisms/stanza/success.py
+++ b/slixmpp/features/feature_mechanisms/stanza/success.py
@@ -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):
diff --git a/slixmpp/features/feature_starttls/stanza.py b/slixmpp/features/feature_starttls/stanza.py
index df50897e..ba58d93e 100644
--- a/slixmpp/features/feature_starttls/stanza.py
+++ b/slixmpp/features/feature_starttls/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/gmail_notify.py b/slixmpp/plugins/gmail_notify.py
index f4cf188c..a56ca699 100644
--- a/slixmpp/plugins/gmail_notify.py
+++ b/slixmpp/plugins/gmail_notify.py
@@ -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'
diff --git a/slixmpp/plugins/google/__init__.py b/slixmpp/plugins/google/__init__.py
new file mode 100644
index 00000000..657f90b0
--- /dev/null
+++ b/slixmpp/plugins/google/__init__.py
@@ -0,0 +1,47 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.plugins.base import register_plugin, BasePlugin
+
+from slixmpp.plugins.google.gmail import Gmail
+from slixmpp.plugins.google.auth import GoogleAuth
+from slixmpp.plugins.google.settings import GoogleSettings
+from slixmpp.plugins.google.nosave import GoogleNoSave
+
+
+class Google(BasePlugin):
+
+ """
+ Google: Custom GTalk Features
+
+ Also see: <https://developers.google.com/talk/jep_extensions/extensions>
+ """
+
+ name = 'google'
+ description = 'Google: Custom GTalk Features'
+ dependencies = set([
+ 'gmail',
+ 'google_settings',
+ 'google_nosave',
+ 'google_auth'
+ ])
+
+ def __getitem__(self, attr):
+ if attr in ('settings', 'nosave', 'auth'):
+ return self.xmpp['google_%s' % attr]
+ elif attr == 'gmail':
+ return self.xmpp['gmail']
+ else:
+ raise KeyError(attr)
+
+
+register_plugin(Gmail)
+register_plugin(GoogleAuth)
+register_plugin(GoogleSettings)
+register_plugin(GoogleNoSave)
+register_plugin(Google)
diff --git a/slixmpp/plugins/google/auth/__init__.py b/slixmpp/plugins/google/auth/__init__.py
new file mode 100644
index 00000000..624ffc48
--- /dev/null
+++ b/slixmpp/plugins/google/auth/__init__.py
@@ -0,0 +1,10 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.plugins.google.auth import stanza
+from slixmpp.plugins.google.auth.auth import GoogleAuth
diff --git a/slixmpp/plugins/google/auth/auth.py b/slixmpp/plugins/google/auth/auth.py
new file mode 100644
index 00000000..71a25ae4
--- /dev/null
+++ b/slixmpp/plugins/google/auth/auth.py
@@ -0,0 +1,47 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.xmlstream import register_stanza_plugin
+from slixmpp.plugins import BasePlugin
+from slixmpp.plugins.google.auth import stanza
+
+
+class GoogleAuth(BasePlugin):
+
+ """
+ Google: Auth Extensions (JID Domain Discovery, OAuth2)
+
+ Also see:
+ <https://developers.google.com/talk/jep_extensions/jid_domain_change>
+ <https://developers.google.com/talk/jep_extensions/oauth>
+ """
+
+ name = 'google_auth'
+ description = 'Google: Auth Extensions (JID Domain Discovery, OAuth2)'
+ dependencies = set(['feature_mechanisms'])
+ stanza = stanza
+
+ def plugin_init(self):
+ self.xmpp.namespace_map['http://www.google.com/talk/protocol/auth'] = 'ga'
+
+ register_stanza_plugin(self.xmpp['feature_mechanisms'].stanza.Auth,
+ stanza.GoogleAuth)
+
+ self.xmpp.add_filter('out', self._auth)
+
+ def plugin_end(self):
+ self.xmpp.del_filter('out', self._auth)
+
+ def _auth(self, stanza):
+ if isinstance(stanza, self.xmpp['feature_mechanisms'].stanza.Auth):
+ stanza.stream = self.xmpp
+ stanza['google']['client_uses_full_bind_result'] = True
+ if stanza['mechanism'] == 'X-OAUTH2':
+ stanza['google']['service'] = 'oauth2'
+ print(stanza)
+ return stanza
diff --git a/slixmpp/plugins/google/auth/stanza.py b/slixmpp/plugins/google/auth/stanza.py
index c5c693ee..5b1b7862 100644
--- a/slixmpp/plugins/google/auth/stanza.py
+++ b/slixmpp/plugins/google/auth/stanza.py
@@ -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
diff --git a/slixmpp/plugins/google/gmail/__init__.py b/slixmpp/plugins/google/gmail/__init__.py
new file mode 100644
index 00000000..ad575a3c
--- /dev/null
+++ b/slixmpp/plugins/google/gmail/__init__.py
@@ -0,0 +1,10 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.plugins.google.gmail import stanza
+from slixmpp.plugins.google.gmail.notifications import Gmail
diff --git a/slixmpp/plugins/google/gmail/stanza.py b/slixmpp/plugins/google/gmail/stanza.py
new file mode 100644
index 00000000..e4086551
--- /dev/null
+++ b/slixmpp/plugins/google/gmail/stanza.py
@@ -0,0 +1,101 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.xmlstream import ElementBase, register_stanza_plugin
+
+
+class GmailQuery(ElementBase):
+ namespace = 'google:mail:notify'
+ name = 'query'
+ plugin_attrib = 'gmail'
+ interfaces = set(['newer_than_time', 'newer_than_tid', 'search'])
+
+ def get_search(self):
+ return self._get_attr('q', '')
+
+ def set_search(self, search):
+ self._set_attr('q', search)
+
+ def del_search(self):
+ self._del_attr('q')
+
+ def get_newer_than_time(self):
+ return self._get_attr('newer-than-time', '')
+
+ def set_newer_than_time(self, value):
+ self._set_attr('newer-than-time', value)
+
+ def del_newer_than_time(self):
+ self._del_attr('newer-than-time')
+
+ def get_newer_than_tid(self):
+ return self._get_attr('newer-than-tid', '')
+
+ def set_newer_than_tid(self, value):
+ self._set_attr('newer-than-tid', value)
+
+ def del_newer_than_tid(self):
+ self._del_attr('newer-than-tid')
+
+
+class MailBox(ElementBase):
+ namespace = 'google:mail:notify'
+ name = 'mailbox'
+ plugin_attrib = 'gmail_messages'
+ interfaces = set(['result_time', 'url', 'matched', 'estimate'])
+
+ def get_matched(self):
+ return self._get_attr('total-matched', '')
+
+ def get_estimate(self):
+ return self._get_attr('total-estimate', '') == '1'
+
+ def get_result_time(self):
+ return self._get_attr('result-time', '')
+
+
+class MailThread(ElementBase):
+ namespace = 'google:mail:notify'
+ name = 'mail-thread-info'
+ plugin_attrib = 'thread'
+ plugin_multi_attrib = 'threads'
+ interfaces = set(['tid', 'participation', 'messages', 'date',
+ 'senders', 'url', 'labels', 'subject', 'snippet'])
+ sub_interfaces = set(['labels', 'subject', 'snippet'])
+
+ def get_senders(self):
+ result = []
+ senders = self.xml.findall('{%s}senders/{%s}sender' % (
+ self.namespace, self.namespace))
+
+ for sender in senders:
+ result.append(MailSender(xml=sender))
+
+ return result
+
+
+class MailSender(ElementBase):
+ namespace = 'google:mail:notify'
+ name = 'sender'
+ plugin_attrib = name
+ interfaces = set(['address', 'name', 'originator', 'unread'])
+
+ def get_originator(self):
+ return self.xml.attrib.get('originator', '0') == '1'
+
+ def get_unread(self):
+ return self.xml.attrib.get('unread', '0') == '1'
+
+
+class NewMail(ElementBase):
+ namespace = 'google:mail:notify'
+ name = 'new-mail'
+ plugin_attrib = 'gmail_notification'
+
+
+register_stanza_plugin(MailBox, MailThread, iterable=True)
diff --git a/slixmpp/plugins/google/nosave/__init__.py b/slixmpp/plugins/google/nosave/__init__.py
new file mode 100644
index 00000000..467e980a
--- /dev/null
+++ b/slixmpp/plugins/google/nosave/__init__.py
@@ -0,0 +1,10 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.plugins.google.nosave import stanza
+from slixmpp.plugins.google.nosave.nosave import GoogleNoSave
diff --git a/slixmpp/plugins/google/nosave/nosave.py b/slixmpp/plugins/google/nosave/nosave.py
new file mode 100644
index 00000000..7387f4df
--- /dev/null
+++ b/slixmpp/plugins/google/nosave/nosave.py
@@ -0,0 +1,78 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.stanza import Iq, Message
+from slixmpp.xmlstream.handler import Callback
+from slixmpp.xmlstream.matcher import StanzaPath
+from slixmpp.xmlstream import register_stanza_plugin
+from slixmpp.plugins import BasePlugin
+from slixmpp.plugins.google.nosave import stanza
+
+
+class GoogleNoSave(BasePlugin):
+
+ """
+ Google: Off the Record Chats
+
+ NOTE: This is NOT an encryption method.
+
+ Also see <https://developers.google.com/talk/jep_extensions/otr>.
+ """
+
+ name = 'google_nosave'
+ description = 'Google: Off the Record Chats'
+ dependencies = set(['google_settings'])
+ stanza = stanza
+
+ def plugin_init(self):
+ register_stanza_plugin(Message, stanza.NoSave)
+ register_stanza_plugin(Iq, stanza.NoSaveQuery)
+
+ self.xmpp.register_handler(
+ Callback('Google Nosave',
+ StanzaPath('iq@type=set/google_nosave'),
+ self._handle_nosave_change))
+
+ def plugin_end(self):
+ self.xmpp.remove_handler('Google Nosave')
+
+ def enable(self, jid=None, timeout=None, callback=None):
+ if jid is None:
+ self.xmpp['google_settings'].update({'archiving_enabled': False},
+ timeout=timeout, callback=callback)
+ else:
+ iq = self.xmpp.Iq()
+ iq['type'] = 'set'
+ iq['google_nosave']['item']['jid'] = jid
+ iq['google_nosave']['item']['value'] = True
+ return iq.send(timeout=timeout, callback=callback)
+
+ def disable(self, jid=None, timeout=None, callback=None):
+ if jid is None:
+ self.xmpp['google_settings'].update({'archiving_enabled': True},
+ timeout=timeout, callback=callback)
+ else:
+ iq = self.xmpp.Iq()
+ iq['type'] = 'set'
+ iq['google_nosave']['item']['jid'] = jid
+ iq['google_nosave']['item']['value'] = False
+ return iq.send(timeout=timeout, callback=callback)
+
+ def get(self, timeout=None, callback=None):
+ iq = self.xmpp.Iq()
+ iq['type'] = 'get'
+ iq.enable('google_nosave')
+ return iq.send(timeout=timeout, callback=callback)
+
+ def _handle_nosave_change(self, iq):
+ reply = self.xmpp.Iq()
+ reply['type'] = 'result'
+ reply['id'] = iq['id']
+ reply['to'] = iq['from']
+ reply.send()
+ self.xmpp.event('google_nosave_change', iq)
diff --git a/slixmpp/plugins/google/nosave/stanza.py b/slixmpp/plugins/google/nosave/stanza.py
index b060a486..2281c91e 100644
--- a/slixmpp/plugins/google/nosave/stanza.py
+++ b/slixmpp/plugins/google/nosave/stanza.py
@@ -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'
diff --git a/slixmpp/plugins/google/settings/__init__.py b/slixmpp/plugins/google/settings/__init__.py
new file mode 100644
index 00000000..6cefdae9
--- /dev/null
+++ b/slixmpp/plugins/google/settings/__init__.py
@@ -0,0 +1,10 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.plugins.google.settings import stanza
+from slixmpp.plugins.google.settings.settings import GoogleSettings
diff --git a/slixmpp/plugins/google/settings/stanza.py b/slixmpp/plugins/google/settings/stanza.py
new file mode 100644
index 00000000..de66ade4
--- /dev/null
+++ b/slixmpp/plugins/google/settings/stanza.py
@@ -0,0 +1,110 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2013 Nathanael C. Fritz, Lance J.T. Stout
+ This file is part of slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.xmlstream import ET, ElementBase
+
+
+class UserSettings(ElementBase):
+ name = 'usersetting'
+ namespace = 'google:setting'
+ plugin_attrib = 'google_settings'
+ interfaces = set(['auto_accept_suggestions',
+ 'mail_notifications',
+ 'archiving_enabled',
+ 'gmail',
+ 'email_verified',
+ 'domain_privacy_notice',
+ 'display_name'])
+
+ def _get_setting(self, setting):
+ xml = self.xml.find('{%s}%s' % (self.namespace, setting))
+ if xml is not None:
+ return xml.attrib.get('value', '') == 'true'
+ return False
+
+ def _set_setting(self, setting, value):
+ self._del_setting(setting)
+ if value in (True, False):
+ xml = ET.Element('{%s}%s' % (self.namespace, setting))
+ xml.attrib['value'] = 'true' if value else 'false'
+ self.xml.append(xml)
+
+ def _del_setting(self, setting):
+ xml = self.xml.find('{%s}%s' % (self.namespace, setting))
+ if xml is not None:
+ self.xml.remove(xml)
+
+ def get_display_name(self):
+ xml = self.xml.find('{%s}%s' % (self.namespace, 'displayname'))
+ if xml is not None:
+ return xml.attrib.get('value', '')
+ return ''
+
+ def set_display_name(self, value):
+ self._del_setting(setting)
+ if value:
+ xml = ET.Element('{%s}%s' % (self.namespace, 'displayname'))
+ xml.attrib['value'] = value
+ self.xml.append(xml)
+
+ def del_display_name(self):
+ self._del_setting('displayname')
+
+ def get_auto_accept_suggestions(self):
+ return self._get_setting('autoacceptsuggestions')
+
+ def get_mail_notifications(self):
+ return self._get_setting('mailnotifications')
+
+ def get_archiving_enabled(self):
+ return self._get_setting('archivingenabled')
+
+ def get_gmail(self):
+ return self._get_setting('gmail')
+
+ def get_email_verified(self):
+ return self._get_setting('emailverified')
+
+ def get_domain_privacy_notice(self):
+ return self._get_setting('domainprivacynotice')
+
+ def set_auto_accept_suggestions(self, value):
+ self._set_setting('autoacceptsuggestions', value)
+
+ def set_mail_notifications(self, value):
+ self._set_setting('mailnotifications', value)
+
+ def set_archiving_enabled(self, value):
+ self._set_setting('archivingenabled', value)
+
+ def set_gmail(self, value):
+ self._set_setting('gmail', value)
+
+ def set_email_verified(self, value):
+ self._set_setting('emailverified', value)
+
+ def set_domain_privacy_notice(self, value):
+ self._set_setting('domainprivacynotice', value)
+
+ def del_auto_accept_suggestions(self):
+ self._del_setting('autoacceptsuggestions')
+
+ def del_mail_notifications(self):
+ self._del_setting('mailnotifications')
+
+ def del_archiving_enabled(self):
+ self._del_setting('archivingenabled')
+
+ def del_gmail(self):
+ self._del_setting('gmail')
+
+ def del_email_verified(self):
+ self._del_setting('emailverified')
+
+ def del_domain_privacy_notice(self):
+ self._del_setting('domainprivacynotice')
diff --git a/slixmpp/plugins/xep_0004/dataforms.py b/slixmpp/plugins/xep_0004/dataforms.py
index 90a87774..857bbd1c 100644
--- a/slixmpp/plugins/xep_0004/dataforms.py
+++ b/slixmpp/plugins/xep_0004/dataforms.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0004/stanza/field.py b/slixmpp/plugins/xep_0004/stanza/field.py
index 42f1210b..c186157d 100644
--- a/slixmpp/plugins/xep_0004/stanza/field.py
+++ b/slixmpp/plugins/xep_0004/stanza/field.py
@@ -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'
diff --git a/slixmpp/plugins/xep_0004/stanza/form.py b/slixmpp/plugins/xep_0004/stanza/form.py
index 32bfc0e3..0ae22098 100644
--- a/slixmpp/plugins/xep_0004/stanza/form.py
+++ b/slixmpp/plugins/xep_0004/stanza/form.py
@@ -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
diff --git a/slixmpp/plugins/xep_0009/rpc.py b/slixmpp/plugins/xep_0009/rpc.py
index 3ce156cf..f92844ec 100644
--- a/slixmpp/plugins/xep_0009/rpc.py
+++ b/slixmpp/plugins/xep_0009/rpc.py
@@ -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'
diff --git a/slixmpp/plugins/xep_0009/stanza/RPC.py b/slixmpp/plugins/xep_0009/stanza/RPC.py
index 3abab8fc..f8cec481 100644
--- a/slixmpp/plugins/xep_0009/stanza/RPC.py
+++ b/slixmpp/plugins/xep_0009/stanza/RPC.py
@@ -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 = {}
diff --git a/slixmpp/plugins/xep_0012/last_activity.py b/slixmpp/plugins/xep_0012/last_activity.py
index 6367e393..807c0e05 100644
--- a/slixmpp/plugins/xep_0012/last_activity.py
+++ b/slixmpp/plugins/xep_0012/last_activity.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0012/stanza.py b/slixmpp/plugins/xep_0012/stanza.py
index bd539a2d..16ca6fcf 100644
--- a/slixmpp/plugins/xep_0012/stanza.py
+++ b/slixmpp/plugins/xep_0012/stanza.py
@@ -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'))
diff --git a/slixmpp/plugins/xep_0013/offline.py b/slixmpp/plugins/xep_0013/offline.py
index 51840e7b..7303b0d3 100644
--- a/slixmpp/plugins/xep_0013/offline.py
+++ b/slixmpp/plugins/xep_0013/offline.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0013/stanza.py b/slixmpp/plugins/xep_0013/stanza.py
index cf9c385b..780d1f74 100644
--- a/slixmpp/plugins/xep_0013/stanza.py
+++ b/slixmpp/plugins/xep_0013/stanza.py
@@ -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'))
diff --git a/slixmpp/plugins/xep_0016/privacy.py b/slixmpp/plugins/xep_0016/privacy.py
index 38444b2b..2b8d623d 100644
--- a/slixmpp/plugins/xep_0016/privacy.py
+++ b/slixmpp/plugins/xep_0016/privacy.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0016/stanza.py b/slixmpp/plugins/xep_0016/stanza.py
index 58c9fdb3..2fb3d03a 100644
--- a/slixmpp/plugins/xep_0016/stanza.py
+++ b/slixmpp/plugins/xep_0016/stanza.py
@@ -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')
diff --git a/slixmpp/plugins/xep_0020/feature_negotiation.py b/slixmpp/plugins/xep_0020/feature_negotiation.py
index 2f4e8c15..b024bf0d 100644
--- a/slixmpp/plugins/xep_0020/feature_negotiation.py
+++ b/slixmpp/plugins/xep_0020/feature_negotiation.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0027/stanza.py b/slixmpp/plugins/xep_0027/stanza.py
index fd41cace..b1fb50be 100644
--- a/slixmpp/plugins/xep_0027/stanza.py
+++ b/slixmpp/plugins/xep_0027/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0030/stanza/info.py b/slixmpp/plugins/xep_0030/stanza/info.py
index 614b68de..b23af0cc 100644
--- a/slixmpp/plugins/xep_0030/stanza/info.py
+++ b/slixmpp/plugins/xep_0030/stanza/info.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0030/stanza/items.py b/slixmpp/plugins/xep_0030/stanza/items.py
index 314ab9b3..b0fd0bf1 100644
--- a/slixmpp/plugins/xep_0030/stanza/items.py
+++ b/slixmpp/plugins/xep_0030/stanza/items.py
@@ -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``."""
diff --git a/slixmpp/plugins/xep_0033/addresses.py b/slixmpp/plugins/xep_0033/addresses.py
index 7b3c2d17..5fadd44d 100644
--- a/slixmpp/plugins/xep_0033/addresses.py
+++ b/slixmpp/plugins/xep_0033/addresses.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0033/stanza.py b/slixmpp/plugins/xep_0033/stanza.py
index 50c7b6db..c3a58037 100644
--- a/slixmpp/plugins/xep_0033/stanza.py
+++ b/slixmpp/plugins/xep_0033/stanza.py
@@ -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'))
diff --git a/slixmpp/plugins/xep_0045.py b/slixmpp/plugins/xep_0045.py
index 942ba22a..3d910316 100644
--- a/slixmpp/plugins/xep_0045.py
+++ b/slixmpp/plugins/xep_0045.py
@@ -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 = {}
diff --git a/slixmpp/plugins/xep_0047/ibb.py b/slixmpp/plugins/xep_0047/ibb.py
index 52d7fbe5..bd96eca2 100644
--- a/slixmpp/plugins/xep_0047/ibb.py
+++ b/slixmpp/plugins/xep_0047/ibb.py
@@ -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,
diff --git a/slixmpp/plugins/xep_0047/stanza.py b/slixmpp/plugins/xep_0047/stanza.py
index 7f8ff0ba..5c47508a 100644
--- a/slixmpp/plugins/xep_0047/stanza.py
+++ b/slixmpp/plugins/xep_0047/stanza.py
@@ -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'}
diff --git a/slixmpp/plugins/xep_0048/bookmarks.py b/slixmpp/plugins/xep_0048/bookmarks.py
index 10c0909e..bde7ef98 100644
--- a/slixmpp/plugins/xep_0048/bookmarks.py
+++ b/slixmpp/plugins/xep_0048/bookmarks.py
@@ -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,
diff --git a/slixmpp/plugins/xep_0048/stanza.py b/slixmpp/plugins/xep_0048/stanza.py
index c158535a..ddcc8841 100644
--- a/slixmpp/plugins/xep_0048/stanza.py
+++ b/slixmpp/plugins/xep_0048/stanza.py
@@ -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)
diff --git a/slixmpp/plugins/xep_0049/private_storage.py b/slixmpp/plugins/xep_0049/private_storage.py
index a66c05d1..cb92db51 100644
--- a/slixmpp/plugins/xep_0049/private_storage.py
+++ b/slixmpp/plugins/xep_0049/private_storage.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0050/adhoc.py b/slixmpp/plugins/xep_0050/adhoc.py
index fa6017d5..4cff6b46 100644
--- a/slixmpp/plugins/xep_0050/adhoc.py
+++ b/slixmpp/plugins/xep_0050/adhoc.py
@@ -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
diff --git a/slixmpp/plugins/xep_0050/stanza.py b/slixmpp/plugins/xep_0050/stanza.py
index 107135f4..ef3eac9f 100644
--- a/slixmpp/plugins/xep_0050/stanza.py
+++ b/slixmpp/plugins/xep_0050/stanza.py
@@ -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):
"""
diff --git a/slixmpp/plugins/xep_0054/stanza.py b/slixmpp/plugins/xep_0054/stanza.py
index e7647184..9bdcb448 100644
--- a/slixmpp/plugins/xep_0054/stanza.py
+++ b/slixmpp/plugins/xep_0054/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0054/vcard_temp.py b/slixmpp/plugins/xep_0054/vcard_temp.py
index f0173386..098b0e34 100644
--- a/slixmpp/plugins/xep_0054/vcard_temp.py
+++ b/slixmpp/plugins/xep_0054/vcard_temp.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0059/rsm.py b/slixmpp/plugins/xep_0059/rsm.py
index 5876a9aa..a02d94e0 100644
--- a/slixmpp/plugins/xep_0059/rsm.py
+++ b/slixmpp/plugins/xep_0059/rsm.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0059/stanza.py b/slixmpp/plugins/xep_0059/stanza.py
index 3843bc85..38ac08b8 100644
--- a/slixmpp/plugins/xep_0059/stanza.py
+++ b/slixmpp/plugins/xep_0059/stanza.py
@@ -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))
diff --git a/slixmpp/plugins/xep_0060/pubsub.py b/slixmpp/plugins/xep_0060/pubsub.py
index 8e12ae92..8d6a2877 100644
--- a/slixmpp/plugins/xep_0060/pubsub.py
+++ b/slixmpp/plugins/xep_0060/pubsub.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0060/stanza/base.py b/slixmpp/plugins/xep_0060/stanza/base.py
index b8f3d6cc..2f781e98 100644
--- a/slixmpp/plugins/xep_0060/stanza/base.py
+++ b/slixmpp/plugins/xep_0060/stanza/base.py
@@ -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'):
diff --git a/slixmpp/plugins/xep_0060/stanza/pubsub.py b/slixmpp/plugins/xep_0060/stanza/pubsub.py
index 3f6f2719..210bce08 100644
--- a/slixmpp/plugins/xep_0060/stanza/pubsub.py
+++ b/slixmpp/plugins/xep_0060/stanza/pubsub.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0060/stanza/pubsub_errors.py b/slixmpp/plugins/xep_0060/stanza/pubsub_errors.py
index 3e728009..d0444081 100644
--- a/slixmpp/plugins/xep_0060/stanza/pubsub_errors.py
+++ b/slixmpp/plugins/xep_0060/stanza/pubsub_errors.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0060/stanza/pubsub_event.py b/slixmpp/plugins/xep_0060/stanza/pubsub_event.py
index 1ba97c75..e46ad408 100644
--- a/slixmpp/plugins/xep_0060/stanza/pubsub_event.py
+++ b/slixmpp/plugins/xep_0060/stanza/pubsub_event.py
@@ -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')
diff --git a/slixmpp/plugins/xep_0060/stanza/pubsub_owner.py b/slixmpp/plugins/xep_0060/stanza/pubsub_owner.py
index 402e5e30..850df8cf 100644
--- a/slixmpp/plugins/xep_0060/stanza/pubsub_owner.py
+++ b/slixmpp/plugins/xep_0060/stanza/pubsub_owner.py
@@ -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))
diff --git a/slixmpp/plugins/xep_0065/proxy.py b/slixmpp/plugins/xep_0065/proxy.py
index c5d358dd..3fe6d2d1 100644
--- a/slixmpp/plugins/xep_0065/proxy.py
+++ b/slixmpp/plugins/xep_0065/proxy.py
@@ -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
}
@@ -55,6 +55,7 @@ class XEP_0065(BasePlugin):
"""Returns the socket associated to the SID."""
return self._sessions.get(sid, None)
+ @asyncio.coroutine
def handshake(self, to, ifrom=None, sid=None, timeout=None):
""" Starts the handshake to establish the socks5 bytestreams
connection.
@@ -104,6 +105,7 @@ class XEP_0065(BasePlugin):
iq['socks'].add_streamhost(proxy, host, port)
return iq.send(timeout=timeout, callback=callback)
+ @asyncio.coroutine
def discover_proxies(self, jid=None, ifrom=None, timeout=None):
"""Auto-discover the JIDs of SOCKS5 proxies on an XMPP server."""
if jid is None:
diff --git a/slixmpp/plugins/xep_0065/stanza.py b/slixmpp/plugins/xep_0065/stanza.py
index 5ba15b32..9701c237 100644
--- a/slixmpp/plugins/xep_0065/stanza.py
+++ b/slixmpp/plugins/xep_0065/stanza.py
@@ -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))
diff --git a/slixmpp/plugins/xep_0066/oob.py b/slixmpp/plugins/xep_0066/oob.py
index c9d4ae5b..233263a2 100644
--- a/slixmpp/plugins/xep_0066/oob.py
+++ b/slixmpp/plugins/xep_0066/oob.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0066/stanza.py b/slixmpp/plugins/xep_0066/stanza.py
index e1da5bdd..55707b99 100644
--- a/slixmpp/plugins/xep_0066/stanza.py
+++ b/slixmpp/plugins/xep_0066/stanza.py
@@ -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
diff --git a/slixmpp/plugins/xep_0071/stanza.py b/slixmpp/plugins/xep_0071/stanza.py
index 3df686cf..4c3380c4 100644
--- a/slixmpp/plugins/xep_0071/stanza.py
+++ b/slixmpp/plugins/xep_0071/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0071/xhtml_im.py b/slixmpp/plugins/xep_0071/xhtml_im.py
index 0b412126..ff4cf591 100644
--- a/slixmpp/plugins/xep_0071/xhtml_im.py
+++ b/slixmpp/plugins/xep_0071/xhtml_im.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0077/register.py b/slixmpp/plugins/xep_0077/register.py
index eb2e7443..8c0c6f09 100644
--- a/slixmpp/plugins/xep_0077/register.py
+++ b/slixmpp/plugins/xep_0077/register.py
@@ -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,
diff --git a/slixmpp/plugins/xep_0077/stanza.py b/slixmpp/plugins/xep_0077/stanza.py
index 6ac543c2..d020a005 100644
--- a/slixmpp/plugins/xep_0077/stanza.py
+++ b/slixmpp/plugins/xep_0077/stanza.py
@@ -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)
diff --git a/slixmpp/plugins/xep_0078/stanza.py b/slixmpp/plugins/xep_0078/stanza.py
index 7dc9401d..2a9ba510 100644
--- a/slixmpp/plugins/xep_0078/stanza.py
+++ b/slixmpp/plugins/xep_0078/stanza.py
@@ -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 = {}
diff --git a/slixmpp/plugins/xep_0079/amp.py b/slixmpp/plugins/xep_0079/amp.py
index 6e65d02a..a8fbc258 100644
--- a/slixmpp/plugins/xep_0079/amp.py
+++ b/slixmpp/plugins/xep_0079/amp.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0079/stanza.py b/slixmpp/plugins/xep_0079/stanza.py
index e3e1553a..f959f21b 100644
--- a/slixmpp/plugins/xep_0079/stanza.py
+++ b/slixmpp/plugins/xep_0079/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0080/geoloc.py b/slixmpp/plugins/xep_0080/geoloc.py
index c9d97edb..459d8a91 100644
--- a/slixmpp/plugins/xep_0080/geoloc.py
+++ b/slixmpp/plugins/xep_0080/geoloc.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0080/stanza.py b/slixmpp/plugins/xep_0080/stanza.py
index e25fea4f..adad6321 100644
--- a/slixmpp/plugins/xep_0080/stanza.py
+++ b/slixmpp/plugins/xep_0080/stanza.py
@@ -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
diff --git a/slixmpp/plugins/xep_0084/avatar.py b/slixmpp/plugins/xep_0084/avatar.py
index e5f9dfaa..6ab4d24b 100644
--- a/slixmpp/plugins/xep_0084/avatar.py
+++ b/slixmpp/plugins/xep_0084/avatar.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0084/stanza.py b/slixmpp/plugins/xep_0084/stanza.py
index ebcd73e3..4b6370ce 100644
--- a/slixmpp/plugins/xep_0084/stanza.py
+++ b/slixmpp/plugins/xep_0084/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0085/chat_states.py b/slixmpp/plugins/xep_0085/chat_states.py
index 1aab9eaa..ade6eda9 100644
--- a/slixmpp/plugins/xep_0085/chat_states.py
+++ b/slixmpp/plugins/xep_0085/chat_states.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0085/stanza.py b/slixmpp/plugins/xep_0085/stanza.py
index de1bc645..d0987308 100644
--- a/slixmpp/plugins/xep_0085/stanza.py
+++ b/slixmpp/plugins/xep_0085/stanza.py
@@ -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('')
diff --git a/slixmpp/plugins/xep_0086/stanza.py b/slixmpp/plugins/xep_0086/stanza.py
index cbc9429d..a28abafa 100644
--- a/slixmpp/plugins/xep_0086/stanza.py
+++ b/slixmpp/plugins/xep_0086/stanza.py
@@ -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'),
diff --git a/slixmpp/plugins/xep_0091/stanza.py b/slixmpp/plugins/xep_0091/stanza.py
index ac6457e6..0ce2acda 100644
--- a/slixmpp/plugins/xep_0091/stanza.py
+++ b/slixmpp/plugins/xep_0091/stanza.py
@@ -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')
diff --git a/slixmpp/plugins/xep_0092/stanza.py b/slixmpp/plugins/xep_0092/stanza.py
index 04097a8b..e76a041e 100644
--- a/slixmpp/plugins/xep_0092/stanza.py
+++ b/slixmpp/plugins/xep_0092/stanza.py
@@ -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
diff --git a/slixmpp/plugins/xep_0092/version.py b/slixmpp/plugins/xep_0092/version.py
index ff0317da..839f740d 100644
--- a/slixmpp/plugins/xep_0092/version.py
+++ b/slixmpp/plugins/xep_0092/version.py
@@ -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',
diff --git a/slixmpp/plugins/xep_0095/stanza.py b/slixmpp/plugins/xep_0095/stanza.py
index 62b5f6f8..0a99ddf6 100644
--- a/slixmpp/plugins/xep_0095/stanza.py
+++ b/slixmpp/plugins/xep_0095/stanza.py
@@ -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')
diff --git a/slixmpp/plugins/xep_0095/stream_initiation.py b/slixmpp/plugins/xep_0095/stream_initiation.py
index 3f909d93..d135ecba 100644
--- a/slixmpp/plugins/xep_0095/stream_initiation.py
+++ b/slixmpp/plugins/xep_0095/stream_initiation.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0096/file_transfer.py b/slixmpp/plugins/xep_0096/file_transfer.py
index 3c09a5b5..f136772d 100644
--- a/slixmpp/plugins/xep_0096/file_transfer.py
+++ b/slixmpp/plugins/xep_0096/file_transfer.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0096/stanza.py b/slixmpp/plugins/xep_0096/stanza.py
index d3781c8d..2a1a9060 100644
--- a/slixmpp/plugins/xep_0096/stanza.py
+++ b/slixmpp/plugins/xep_0096/stanza.py
@@ -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))
diff --git a/slixmpp/plugins/xep_0106.py b/slixmpp/plugins/xep_0106.py
index a4717956..bcf4c555 100644
--- a/slixmpp/plugins/xep_0106.py
+++ b/slixmpp/plugins/xep_0106.py
@@ -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')
diff --git a/slixmpp/plugins/xep_0107/stanza.py b/slixmpp/plugins/xep_0107/stanza.py
index 05967de9..8384793a 100644
--- a/slixmpp/plugins/xep_0107/stanza.py
+++ b/slixmpp/plugins/xep_0107/stanza.py
@@ -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()
diff --git a/slixmpp/plugins/xep_0107/user_mood.py b/slixmpp/plugins/xep_0107/user_mood.py
index c56d15fa..c745671f 100644
--- a/slixmpp/plugins/xep_0107/user_mood.py
+++ b/slixmpp/plugins/xep_0107/user_mood.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0108/stanza.py b/slixmpp/plugins/xep_0108/stanza.py
index d65dfdf9..c9a3c362 100644
--- a/slixmpp/plugins/xep_0108/stanza.py
+++ b/slixmpp/plugins/xep_0108/stanza.py
@@ -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()
diff --git a/slixmpp/plugins/xep_0108/user_activity.py b/slixmpp/plugins/xep_0108/user_activity.py
index 502dfae0..d66ed9c4 100644
--- a/slixmpp/plugins/xep_0108/user_activity.py
+++ b/slixmpp/plugins/xep_0108/user_activity.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0115/caps.py b/slixmpp/plugins/xep_0115/caps.py
index c6f9ea10..131d269b 100644
--- a/slixmpp/plugins/xep_0115/caps.py
+++ b/slixmpp/plugins/xep_0115/caps.py
@@ -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',
diff --git a/slixmpp/plugins/xep_0115/stanza.py b/slixmpp/plugins/xep_0115/stanza.py
index 36fb173c..1811307f 100644
--- a/slixmpp/plugins/xep_0115/stanza.py
+++ b/slixmpp/plugins/xep_0115/stanza.py
@@ -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'}
diff --git a/slixmpp/plugins/xep_0118/stanza.py b/slixmpp/plugins/xep_0118/stanza.py
index 4f5a1795..579fcbf0 100644
--- a/slixmpp/plugins/xep_0118/stanza.py
+++ b/slixmpp/plugins/xep_0118/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0118/user_tune.py b/slixmpp/plugins/xep_0118/user_tune.py
index 0882a5ba..8b64eaf7 100644
--- a/slixmpp/plugins/xep_0118/user_tune.py
+++ b/slixmpp/plugins/xep_0118/user_tune.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0122/data_validation.py b/slixmpp/plugins/xep_0122/data_validation.py
index 6129db51..65e7b3e3 100644
--- a/slixmpp/plugins/xep_0122/data_validation.py
+++ b/slixmpp/plugins/xep_0122/data_validation.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0128/extended_disco.py b/slixmpp/plugins/xep_0128/extended_disco.py
index 5cc1d35a..bf3971e3 100644
--- a/slixmpp/plugins/xep_0128/extended_disco.py
+++ b/slixmpp/plugins/xep_0128/extended_disco.py
@@ -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."""
diff --git a/slixmpp/plugins/xep_0131/headers.py b/slixmpp/plugins/xep_0131/headers.py
index 81fc9188..978c490d 100644
--- a/slixmpp/plugins/xep_0131/headers.py
+++ b/slixmpp/plugins/xep_0131/headers.py
@@ -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()
diff --git a/slixmpp/plugins/xep_0131/stanza.py b/slixmpp/plugins/xep_0131/stanza.py
index cbbe61a7..d075c15e 100644
--- a/slixmpp/plugins/xep_0131/stanza.py
+++ b/slixmpp/plugins/xep_0131/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0133.py b/slixmpp/plugins/xep_0133.py
index a1eb9e02..aec1ee36 100644
--- a/slixmpp/plugins/xep_0133.py
+++ b/slixmpp/plugins/xep_0133.py
@@ -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:
diff --git a/slixmpp/plugins/xep_0138.py b/slixmpp/plugins/xep_0138.py
index 049060cf..4780f8ee 100644
--- a/slixmpp/plugins/xep_0138.py
+++ b/slixmpp/plugins/xep_0138.py
@@ -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'
diff --git a/slixmpp/plugins/xep_0152/reachability.py b/slixmpp/plugins/xep_0152/reachability.py
index e6d94b65..3ff5e118 100644
--- a/slixmpp/plugins/xep_0152/reachability.py
+++ b/slixmpp/plugins/xep_0152/reachability.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0152/stanza.py b/slixmpp/plugins/xep_0152/stanza.py
index 661544e3..cbf725fa 100644
--- a/slixmpp/plugins/xep_0152/stanza.py
+++ b/slixmpp/plugins/xep_0152/stanza.py
@@ -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)
diff --git a/slixmpp/plugins/xep_0153/stanza.py b/slixmpp/plugins/xep_0153/stanza.py
index fe8d5e98..9d0c51da 100644
--- a/slixmpp/plugins/xep_0153/stanza.py
+++ b/slixmpp/plugins/xep_0153/stanza.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0153/vcard_avatar.py b/slixmpp/plugins/xep_0153/vcard_avatar.py
index b2c4caf5..f1591e27 100644
--- a/slixmpp/plugins/xep_0153/vcard_avatar.py
+++ b/slixmpp/plugins/xep_0153/vcard_avatar.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0163.py b/slixmpp/plugins/xep_0163.py
index b85c662c..5832b4ee 100644
--- a/slixmpp/plugins/xep_0163.py
+++ b/slixmpp/plugins/xep_0163.py
@@ -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):
"""
diff --git a/slixmpp/plugins/xep_0172/stanza.py b/slixmpp/plugins/xep_0172/stanza.py
index 305f3a00..c85137ab 100644
--- a/slixmpp/plugins/xep_0172/stanza.py
+++ b/slixmpp/plugins/xep_0172/stanza.py
@@ -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):
"""
diff --git a/slixmpp/plugins/xep_0172/user_nick.py b/slixmpp/plugins/xep_0172/user_nick.py
index b9f20b27..0bba8611 100644
--- a/slixmpp/plugins/xep_0172/user_nick.py
+++ b/slixmpp/plugins/xep_0172/user_nick.py
@@ -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):
diff --git a/slixmpp/plugins/xep_0184/receipt.py b/slixmpp/plugins/xep_0184/receipt.py
index 2c3555dc..f89a5d9b 100644
--- a/slixmpp/plugins/xep_0184/receipt.py
+++ b/slixmpp/plugins/xep_0184/receipt.py
@@ -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,
diff --git a/slixmpp/plugins/xep_0184/stanza.py b/slixmpp/plugins/xep_0184/stanza.py
index 03a0ff9c..26e289a3 100644
--- a/slixmpp/plugins/xep_0184/stanza.py
+++ b/slixmpp/plugins/xep_0184/stanza.py
@@ -13,7 +13,7 @@ class Request(ElementBase):
namespace = 'urn:xmpp:receipts'
name = 'request'
plugin_attrib = 'request_receipt'
- interfaces = set(('request_receipt',))
+ interfaces = {'request_receipt'}
sub_interfaces = interfaces
is_extension = True
@@ -45,7 +45,7 @@ class Received(ElementBase):
namespace = 'urn:xmpp:receipts'
name = 'received'
plugin_attrib = 'receipt'
- interfaces = set(['receipt'])
+ interfaces = {'receipt'}
sub_interfaces = interfaces
is_extension = True
diff --git a/slixmpp/plugins/xep_0186/invisible_command.py b/slixmpp/plugins/xep_0186/invisible_command.py
index 88266f6e..a6df59a2 100644
--- a/slixmpp/plugins/xep_0186/invisible_command.py
+++ b/slixmpp/plugins/xep_0186/invisible_command.py
@@ -21,7 +21,7 @@ class XEP_0186(BasePlugin):
name = 'xep_0186'
description = 'XEP-0186: Invisible Command'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
def plugin_init(self):
register_stanza_plugin(Iq, Visible)
diff --git a/slixmpp/plugins/xep_0191/blocking.py b/slixmpp/plugins/xep_0191/blocking.py
index fa2a013e..5425544d 100644
--- a/slixmpp/plugins/xep_0191/blocking.py
+++ b/slixmpp/plugins/xep_0191/blocking.py
@@ -23,7 +23,7 @@ class XEP_0191(BasePlugin):
name = 'xep_0191'
description = 'XEP-0191: Blocking Command'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0191/stanza.py b/slixmpp/plugins/xep_0191/stanza.py
index 4dac7bfc..0cf5c71a 100644
--- a/slixmpp/plugins/xep_0191/stanza.py
+++ b/slixmpp/plugins/xep_0191/stanza.py
@@ -13,7 +13,7 @@ class BlockList(ElementBase):
name = 'blocklist'
namespace = 'urn:xmpp:blocking'
plugin_attrib = 'blocklist'
- interfaces = set(['items'])
+ interfaces = {'items'}
def get_items(self):
result = set()
diff --git a/slixmpp/plugins/xep_0196/stanza.py b/slixmpp/plugins/xep_0196/stanza.py
index 9c3cd0ed..79f5621e 100644
--- a/slixmpp/plugins/xep_0196/stanza.py
+++ b/slixmpp/plugins/xep_0196/stanza.py
@@ -14,7 +14,7 @@ class UserGaming(ElementBase):
name = 'gaming'
namespace = 'urn:xmpp:gaming:0'
plugin_attrib = 'gaming'
- interfaces = set(['character_name', 'character_profile', 'name',
- 'level', 'server_address', 'server_name', 'uri'])
+ interfaces = {'character_name', 'character_profile', 'name',
+ 'level', 'server_address', 'server_name', 'uri'}
sub_interfaces = interfaces
diff --git a/slixmpp/plugins/xep_0196/user_gaming.py b/slixmpp/plugins/xep_0196/user_gaming.py
index f0dee99f..5a573ea9 100644
--- a/slixmpp/plugins/xep_0196/user_gaming.py
+++ b/slixmpp/plugins/xep_0196/user_gaming.py
@@ -23,7 +23,7 @@ class XEP_0196(BasePlugin):
name = 'xep_0196'
description = 'XEP-0196: User Gaming'
- dependencies = set(['xep_0163'])
+ dependencies = {'xep_0163'}
stanza = stanza
def plugin_end(self):
diff --git a/slixmpp/plugins/xep_0198/stanza.py b/slixmpp/plugins/xep_0198/stanza.py
index 5b13293b..37560227 100644
--- a/slixmpp/plugins/xep_0198/stanza.py
+++ b/slixmpp/plugins/xep_0198/stanza.py
@@ -13,7 +13,7 @@ from slixmpp.xmlstream import ElementBase, StanzaBase
class Enable(StanzaBase):
name = 'enable'
namespace = 'urn:xmpp:sm:3'
- interfaces = set(['max', 'resume'])
+ interfaces = {'max', 'resume'}
def setup(self, xml):
StanzaBase.setup(self, xml)
@@ -30,7 +30,7 @@ class Enable(StanzaBase):
class Enabled(StanzaBase):
name = 'enabled'
namespace = 'urn:xmpp:sm:3'
- interfaces = set(['id', 'location', 'max', 'resume'])
+ interfaces = {'id', 'location', 'max', 'resume'}
def setup(self, xml):
StanzaBase.setup(self, xml)
@@ -47,7 +47,7 @@ class Enabled(StanzaBase):
class Resume(StanzaBase):
name = 'resume'
namespace = 'urn:xmpp:sm:3'
- interfaces = set(['h', 'previd'])
+ interfaces = {'h', 'previd'}
def setup(self, xml):
StanzaBase.setup(self, xml)
@@ -66,7 +66,7 @@ class Resume(StanzaBase):
class Resumed(StanzaBase):
name = 'resumed'
namespace = 'urn:xmpp:sm:3'
- interfaces = set(['h', 'previd'])
+ interfaces = {'h', 'previd'}
def setup(self, xml):
StanzaBase.setup(self, xml)
@@ -96,7 +96,7 @@ class StreamManagement(ElementBase):
name = 'sm'
namespace = 'urn:xmpp:sm:3'
plugin_attrib = name
- interfaces = set(['required', 'optional'])
+ interfaces = {'required', 'optional'}
def get_required(self):
return self.xml.find('{%s}required' % self.namespace) is not None
@@ -134,7 +134,7 @@ class RequestAck(StanzaBase):
class Ack(StanzaBase):
name = 'a'
namespace = 'urn:xmpp:sm:3'
- interfaces = set(['h'])
+ interfaces = {'h'}
def setup(self, xml):
StanzaBase.setup(self, xml)
diff --git a/slixmpp/plugins/xep_0199/ping.py b/slixmpp/plugins/xep_0199/ping.py
index 8594ac01..9bd595a4 100644
--- a/slixmpp/plugins/xep_0199/ping.py
+++ b/slixmpp/plugins/xep_0199/ping.py
@@ -50,7 +50,7 @@ class XEP_0199(BasePlugin):
name = 'xep_0199'
description = 'XEP-0199: XMPP Ping'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
default_config = {
'keepalive': False,
diff --git a/slixmpp/plugins/xep_0202/stanza.py b/slixmpp/plugins/xep_0202/stanza.py
index c855663b..d97b2fb2 100644
--- a/slixmpp/plugins/xep_0202/stanza.py
+++ b/slixmpp/plugins/xep_0202/stanza.py
@@ -48,7 +48,7 @@ class EntityTime(ElementBase):
name = 'time'
namespace = 'urn:xmpp:time'
plugin_attrib = 'entity_time'
- interfaces = set(('tzo', 'utc', 'time'))
+ interfaces = {'tzo', 'utc', 'time'}
sub_interfaces = interfaces
def set_time(self, value):
diff --git a/slixmpp/plugins/xep_0202/time.py b/slixmpp/plugins/xep_0202/time.py
index 185200fc..05df6374 100644
--- a/slixmpp/plugins/xep_0202/time.py
+++ b/slixmpp/plugins/xep_0202/time.py
@@ -28,7 +28,7 @@ class XEP_0202(BasePlugin):
name = 'xep_0202'
description = 'XEP-0202: Entity Time'
- dependencies = set(['xep_0030', 'xep_0082'])
+ dependencies = {'xep_0030', 'xep_0082'}
stanza = stanza
default_config = {
#: As a default, respond to time requests with the
diff --git a/slixmpp/plugins/xep_0203/stanza.py b/slixmpp/plugins/xep_0203/stanza.py
index de907c69..5daed864 100644
--- a/slixmpp/plugins/xep_0203/stanza.py
+++ b/slixmpp/plugins/xep_0203/stanza.py
@@ -18,7 +18,7 @@ class Delay(ElementBase):
name = 'delay'
namespace = 'urn:xmpp:delay'
plugin_attrib = 'delay'
- interfaces = set(('from', 'stamp', 'text'))
+ interfaces = {'from', 'stamp', 'text'}
def get_from(self):
from_ = self._get_attr('from')
diff --git a/slixmpp/plugins/xep_0221/media.py b/slixmpp/plugins/xep_0221/media.py
index 4c34fbd2..628a3b05 100644
--- a/slixmpp/plugins/xep_0221/media.py
+++ b/slixmpp/plugins/xep_0221/media.py
@@ -21,7 +21,7 @@ class XEP_0221(BasePlugin):
name = 'xep_0221'
description = 'XEP-0221: Data Forms Media Element'
- dependencies = set(['xep_0004'])
+ dependencies = {'xep_0004'}
def plugin_init(self):
register_stanza_plugin(FormField, Media)
diff --git a/slixmpp/plugins/xep_0221/stanza.py b/slixmpp/plugins/xep_0221/stanza.py
index 2a2bbabd..097f03c4 100644
--- a/slixmpp/plugins/xep_0221/stanza.py
+++ b/slixmpp/plugins/xep_0221/stanza.py
@@ -13,7 +13,7 @@ class Media(ElementBase):
name = 'media'
namespace = 'urn:xmpp:media-element'
plugin_attrib = 'media'
- interfaces = set(['height', 'width', 'alt'])
+ interfaces = {'height', 'width', 'alt'}
def add_uri(self, value, itype):
uri = URI()
@@ -27,7 +27,7 @@ class URI(ElementBase):
namespace = 'urn:xmpp:media-element'
plugin_attrib = 'uri'
plugin_multi_attrib = 'uris'
- interfaces = set(['type', 'value'])
+ interfaces = {'type', 'value'}
def get_value(self):
return self.xml.text
@@ -36,7 +36,7 @@ class URI(ElementBase):
self.xml.text = value
def del_value(self):
- sel.xml.text = ''
+ self.xml.text = ''
register_stanza_plugin(Media, URI, iterable=True)
diff --git a/slixmpp/plugins/xep_0222.py b/slixmpp/plugins/xep_0222.py
index 059f4c85..81daed38 100644
--- a/slixmpp/plugins/xep_0222.py
+++ b/slixmpp/plugins/xep_0222.py
@@ -23,12 +23,12 @@ class XEP_0222(BasePlugin):
name = 'xep_0222'
description = 'XEP-0222: Persistent Storage of Public Data via PubSub'
- dependencies = set(['xep_0163', 'xep_0060', 'xep_0004'])
+ dependencies = {'xep_0163', 'xep_0060', 'xep_0004'}
profile = {'pubsub#persist_items': True,
'pubsub#send_last_published_item': 'never'}
- def configure(self, node):
+ def configure(self, node, ifrom=None, callback=None, timeout=None):
"""
Update a node's configuration to match the public storage profile.
"""
diff --git a/slixmpp/plugins/xep_0223.py b/slixmpp/plugins/xep_0223.py
index 2461bb20..566e430b 100644
--- a/slixmpp/plugins/xep_0223.py
+++ b/slixmpp/plugins/xep_0223.py
@@ -23,12 +23,12 @@ class XEP_0223(BasePlugin):
name = 'xep_0223'
description = 'XEP-0223: Persistent Storage of Private Data via PubSub'
- dependencies = set(['xep_0163', 'xep_0060', 'xep_0004'])
+ dependencies = {'xep_0163', 'xep_0060', 'xep_0004'}
profile = {'pubsub#persist_items': True,
'pubsub#send_last_published_item': 'never'}
- def configure(self, node):
+ def configure(self, node, ifrom=None, callback=None, timeout=None):
"""
Update a node's configuration to match the public storage profile.
"""
diff --git a/slixmpp/plugins/xep_0224/attention.py b/slixmpp/plugins/xep_0224/attention.py
index 2777e1b0..196d3ed6 100644
--- a/slixmpp/plugins/xep_0224/attention.py
+++ b/slixmpp/plugins/xep_0224/attention.py
@@ -27,7 +27,7 @@ class XEP_0224(BasePlugin):
name = 'xep_0224'
description = 'XEP-0224: Attention'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0224/stanza.py b/slixmpp/plugins/xep_0224/stanza.py
index 2b77dadd..d50d74b4 100644
--- a/slixmpp/plugins/xep_0224/stanza.py
+++ b/slixmpp/plugins/xep_0224/stanza.py
@@ -17,7 +17,7 @@ class Attention(ElementBase):
name = 'attention'
namespace = 'urn:xmpp:attention:0'
plugin_attrib = 'attention'
- interfaces = set(('attention',))
+ interfaces = {'attention'}
is_extension = True
def setup(self, xml):
diff --git a/slixmpp/plugins/xep_0231/bob.py b/slixmpp/plugins/xep_0231/bob.py
index a3b5edd4..690d34d4 100644
--- a/slixmpp/plugins/xep_0231/bob.py
+++ b/slixmpp/plugins/xep_0231/bob.py
@@ -31,7 +31,7 @@ class XEP_0231(BasePlugin):
name = 'xep_0231'
description = 'XEP-0231: Bits of Binary'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
def plugin_init(self):
self._cids = {}
diff --git a/slixmpp/plugins/xep_0231/stanza.py b/slixmpp/plugins/xep_0231/stanza.py
index b3b96eff..3de99aac 100644
--- a/slixmpp/plugins/xep_0231/stanza.py
+++ b/slixmpp/plugins/xep_0231/stanza.py
@@ -18,7 +18,7 @@ class BitsOfBinary(ElementBase):
name = 'data'
namespace = 'urn:xmpp:bob'
plugin_attrib = 'bob'
- interfaces = set(('cid', 'max_age', 'type', 'data'))
+ interfaces = {'cid', 'max_age', 'type', 'data'}
def get_max_age(self):
return int(self._get_attr('max-age'))
diff --git a/slixmpp/plugins/xep_0235/oauth.py b/slixmpp/plugins/xep_0235/oauth.py
index bcd220b0..4d685cd2 100644
--- a/slixmpp/plugins/xep_0235/oauth.py
+++ b/slixmpp/plugins/xep_0235/oauth.py
@@ -19,7 +19,7 @@ class XEP_0235(BasePlugin):
name = 'xep_0235'
description = 'XEP-0235: OAuth Over XMPP'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0235/stanza.py b/slixmpp/plugins/xep_0235/stanza.py
index abb4a38d..5205b07c 100644
--- a/slixmpp/plugins/xep_0235/stanza.py
+++ b/slixmpp/plugins/xep_0235/stanza.py
@@ -19,9 +19,9 @@ class OAuth(ElementBase):
name = 'oauth'
namespace = 'urn:xmpp:oauth:0'
plugin_attrib = 'oauth'
- interfaces = set(['oauth_consumer_key', 'oauth_nonce', 'oauth_signature',
- 'oauth_signature_method', 'oauth_timestamp',
- 'oauth_token', 'oauth_version'])
+ interfaces = {'oauth_consumer_key', 'oauth_nonce', 'oauth_signature',
+ 'oauth_signature_method', 'oauth_timestamp', 'oauth_token',
+ 'oauth_version'}
sub_interfaces = interfaces
def generate_signature(self, stanza, sfrom, sto, consumer_secret,
diff --git a/slixmpp/plugins/xep_0242.py b/slixmpp/plugins/xep_0242.py
index ea077a70..27e4e7c8 100644
--- a/slixmpp/plugins/xep_0242.py
+++ b/slixmpp/plugins/xep_0242.py
@@ -13,9 +13,9 @@ class XEP_0242(BasePlugin):
name = 'xep_0242'
description = 'XEP-0242: XMPP Client Compliance 2009'
- dependencies = set(['xep_0030', 'xep_0115', 'xep_0054',
- 'xep_0045', 'xep_0085', 'xep_0016',
- 'xep_0191'])
+ dependencies = {'xep_0030', 'xep_0115', 'xep_0054',
+ 'xep_0045', 'xep_0085', 'xep_0016',
+ 'xep_0191'}
register_plugin(XEP_0242)
diff --git a/slixmpp/plugins/xep_0249/invite.py b/slixmpp/plugins/xep_0249/invite.py
index fe5f5884..9f08eae3 100644
--- a/slixmpp/plugins/xep_0249/invite.py
+++ b/slixmpp/plugins/xep_0249/invite.py
@@ -28,7 +28,7 @@ class XEP_0249(BasePlugin):
name = 'xep_0249'
description = 'XEP-0249: Direct MUC Invitations'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0256.py b/slixmpp/plugins/xep_0256.py
index 4ad4f0ea..4efa3518 100644
--- a/slixmpp/plugins/xep_0256.py
+++ b/slixmpp/plugins/xep_0256.py
@@ -23,7 +23,7 @@ class XEP_0256(BasePlugin):
name = 'xep_0256'
description = 'XEP-0256: Last Activity in Presence'
- dependencies = set(['xep_0012'])
+ dependencies = {'xep_0012'}
stanza = stanza
default_config = {
'auto_last_activity': False
diff --git a/slixmpp/plugins/xep_0256/last_activity_presence.py b/slixmpp/plugins/xep_0256/last_activity_presence.py
index 3766c61e..eb153808 100644
--- a/slixmpp/plugins/xep_0256/last_activity_presence.py
+++ b/slixmpp/plugins/xep_0256/last_activity_presence.py
@@ -20,7 +20,7 @@ class XEP_0256(BasePlugin):
name = 'xep_0256'
description = 'XEP-0256: Last Activity in Presence'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0257/client_cert_management.py b/slixmpp/plugins/xep_0257/client_cert_management.py
index a6d07506..e5a06cf3 100644
--- a/slixmpp/plugins/xep_0257/client_cert_management.py
+++ b/slixmpp/plugins/xep_0257/client_cert_management.py
@@ -22,7 +22,7 @@ class XEP_0257(BasePlugin):
name = 'xep_0257'
description = 'XEP-0257: Client Certificate Management for SASL EXTERNAL'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0257/stanza.py b/slixmpp/plugins/xep_0257/stanza.py
index 86b63451..18d26775 100644
--- a/slixmpp/plugins/xep_0257/stanza.py
+++ b/slixmpp/plugins/xep_0257/stanza.py
@@ -21,13 +21,13 @@ class CertItem(ElementBase):
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'item'
plugin_multi_attrib = 'items'
- interfaces = set(['name', 'x509cert', 'users'])
- sub_interfaces = set(['name', 'x509cert'])
+ interfaces = {'name', 'x509cert', 'users'}
+ sub_interfaces = {'name', 'x509cert'}
def get_users(self):
resources = self.xml.findall('{%s}users/{%s}resource' % (
self.namespace, self.namespace))
- return set([res.text for res in resources])
+ return {res.text for res in resources}
def set_users(self, values):
users = self.xml.find('{%s}users' % self.namespace)
@@ -49,8 +49,8 @@ class AppendCert(ElementBase):
name = 'append'
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'sasl_cert_append'
- interfaces = set(['name', 'x509cert', 'cert_management'])
- sub_interfaces = set(['name', 'x509cert'])
+ interfaces = {'name', 'x509cert', 'cert_management'}
+ sub_interfaces = {'name', 'x509cert'}
def get_cert_management(self):
manage = self.xml.find('{%s}no-cert-management' % self.namespace)
@@ -72,7 +72,7 @@ class DisableCert(ElementBase):
name = 'disable'
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'sasl_cert_disable'
- interfaces = set(['name'])
+ interfaces = {'name'}
sub_interfaces = interfaces
@@ -80,7 +80,7 @@ class RevokeCert(ElementBase):
name = 'revoke'
namespace = 'urn:xmpp:saslcert:1'
plugin_attrib = 'sasl_cert_revoke'
- interfaces = set(['name'])
+ interfaces = {'name'}
sub_interfaces = interfaces
diff --git a/slixmpp/plugins/xep_0258/security_labels.py b/slixmpp/plugins/xep_0258/security_labels.py
index 2fb048c7..b4c3a75a 100644
--- a/slixmpp/plugins/xep_0258/security_labels.py
+++ b/slixmpp/plugins/xep_0258/security_labels.py
@@ -21,7 +21,7 @@ class XEP_0258(BasePlugin):
name = 'xep_0258'
description = 'XEP-0258: Security Labels in XMPP'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0258/stanza.py b/slixmpp/plugins/xep_0258/stanza.py
index e47bd34f..c0c7080c 100644
--- a/slixmpp/plugins/xep_0258/stanza.py
+++ b/slixmpp/plugins/xep_0258/stanza.py
@@ -8,6 +8,7 @@
from base64 import b64encode, b64decode
+from slixmpp import JID
from slixmpp.util import bytes
from slixmpp.xmlstream import ElementBase, ET, register_stanza_plugin
@@ -33,7 +34,7 @@ class DisplayMarking(ElementBase):
name = 'displaymarking'
namespace = 'urn:xmpp:sec-label:0'
plugin_attrib = 'display_marking'
- interfaces = set(['fgcolor', 'bgcolor', 'value'])
+ interfaces = {'fgcolor', 'bgcolor', 'value'}
def get_fgcolor(self):
return self._get_attr('fgcolor', 'black')
@@ -62,7 +63,7 @@ class Catalog(ElementBase):
name = 'catalog'
namespace = 'urn:xmpp:sec-label:catalog:2'
plugin_attrib = 'security_label_catalog'
- interfaces = set(['to', 'from', 'name', 'desc', 'id', 'size', 'restrict'])
+ interfaces = {'to', 'from', 'name', 'desc', 'id', 'size', 'restrict'}
def get_to(self):
return JID(self._get_attr('to'))
@@ -96,7 +97,7 @@ class CatalogItem(ElementBase):
namespace = 'urn:xmpp:sec-label:catalog:2'
plugin_attrib = 'item'
plugin_multi_attrib = 'items'
- interfaces = set(['selector', 'default'])
+ interfaces = {'selector', 'default'}
def get_default(self):
value = self._get_attr('default', '')
@@ -116,7 +117,7 @@ class ESSLabel(ElementBase):
name = 'esssecuritylabel'
namespace = 'urn:xmpp:sec-label:ess:0'
plugin_attrib = 'ess'
- interfaces = set(['value'])
+ interfaces = {'value'}
def get_value(self):
if self.xml.text:
diff --git a/slixmpp/plugins/xep_0270.py b/slixmpp/plugins/xep_0270.py
index 4d02a0a1..e5316ae5 100644
--- a/slixmpp/plugins/xep_0270.py
+++ b/slixmpp/plugins/xep_0270.py
@@ -13,8 +13,8 @@ class XEP_0270(BasePlugin):
name = 'xep_0270'
description = 'XEP-0270: XMPP Compliance Suites 2010'
- dependencies = set(['xep_0030', 'xep_0115', 'xep_0054',
- 'xep_0163', 'xep_0045', 'xep_0085'])
+ dependencies = {'xep_0030', 'xep_0115', 'xep_0054',
+ 'xep_0163', 'xep_0045', 'xep_0085'}
register_plugin(XEP_0270)
diff --git a/slixmpp/plugins/xep_0279/ipcheck.py b/slixmpp/plugins/xep_0279/ipcheck.py
index e8cea46f..56d9afd4 100644
--- a/slixmpp/plugins/xep_0279/ipcheck.py
+++ b/slixmpp/plugins/xep_0279/ipcheck.py
@@ -19,7 +19,7 @@ class XEP_0279(BasePlugin):
name = 'xep_0279'
description = 'XEP-0279: Server IP Check'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0279/stanza.py b/slixmpp/plugins/xep_0279/stanza.py
index f80623cd..d8f5f674 100644
--- a/slixmpp/plugins/xep_0279/stanza.py
+++ b/slixmpp/plugins/xep_0279/stanza.py
@@ -14,7 +14,7 @@ class IPCheck(ElementBase):
name = 'ip'
namespace = 'urn:xmpp:sic:0'
plugin_attrib = 'ip_check'
- interfaces = set(['ip_check'])
+ interfaces = {'ip_check'}
is_extension = True
def get_ip_check(self):
diff --git a/slixmpp/plugins/xep_0280/carbons.py b/slixmpp/plugins/xep_0280/carbons.py
index a64ccbfd..aa71f7f1 100644
--- a/slixmpp/plugins/xep_0280/carbons.py
+++ b/slixmpp/plugins/xep_0280/carbons.py
@@ -28,7 +28,7 @@ class XEP_0280(BasePlugin):
name = 'xep_0280'
description = 'XEP-0280: Message Carbons'
- dependencies = set(['xep_0030', 'xep_0297'])
+ dependencies = {'xep_0030', 'xep_0297'}
stanza = stanza
def plugin_init(self):
@@ -61,10 +61,12 @@ class XEP_0280(BasePlugin):
self.xmpp.plugin['xep_0030'].add_feature('urn:xmpp:carbons:2')
def _handle_carbon_received(self, msg):
- self.xmpp.event('carbon_received', msg)
+ if msg['from'].bare == self.xmpp.boundjid.bare:
+ self.xmpp.event('carbon_received', msg)
def _handle_carbon_sent(self, msg):
- self.xmpp.event('carbon_sent', msg)
+ if msg['from'].bare == self.xmpp.boundjid.bare:
+ self.xmpp.event('carbon_sent', msg)
def enable(self, ifrom=None, timeout=None, callback=None,
timeout_callback=None):
diff --git a/slixmpp/plugins/xep_0280/stanza.py b/slixmpp/plugins/xep_0280/stanza.py
index 46276189..343df12f 100644
--- a/slixmpp/plugins/xep_0280/stanza.py
+++ b/slixmpp/plugins/xep_0280/stanza.py
@@ -13,7 +13,7 @@ class ReceivedCarbon(ElementBase):
name = 'received'
namespace = 'urn:xmpp:carbons:2'
plugin_attrib = 'carbon_received'
- interfaces = set(['carbon_received'])
+ interfaces = {'carbon_received'}
is_extension = True
def get_carbon_received(self):
@@ -30,7 +30,7 @@ class SentCarbon(ElementBase):
name = 'sent'
namespace = 'urn:xmpp:carbons:2'
plugin_attrib = 'carbon_sent'
- interfaces = set(['carbon_sent'])
+ interfaces = {'carbon_sent'}
is_extension = True
def get_carbon_sent(self):
diff --git a/slixmpp/plugins/xep_0297/forwarded.py b/slixmpp/plugins/xep_0297/forwarded.py
index 7c40bf30..a0c36d0c 100644
--- a/slixmpp/plugins/xep_0297/forwarded.py
+++ b/slixmpp/plugins/xep_0297/forwarded.py
@@ -21,7 +21,7 @@ class XEP_0297(BasePlugin):
name = 'xep_0297'
description = 'XEP-0297: Stanza Forwarding'
- dependencies = set(['xep_0030', 'xep_0203'])
+ dependencies = {'xep_0030', 'xep_0203'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0297/stanza.py b/slixmpp/plugins/xep_0297/stanza.py
index 233ad4f6..d211f83c 100644
--- a/slixmpp/plugins/xep_0297/stanza.py
+++ b/slixmpp/plugins/xep_0297/stanza.py
@@ -14,7 +14,7 @@ class Forwarded(ElementBase):
name = 'forwarded'
namespace = 'urn:xmpp:forward:0'
plugin_attrib = 'forwarded'
- interfaces = set(['stanza'])
+ interfaces = {'stanza'}
def get_stanza(self):
for stanza in self:
diff --git a/slixmpp/plugins/xep_0300/__init__.py b/slixmpp/plugins/xep_0300/__init__.py
new file mode 100644
index 00000000..522d40e3
--- /dev/null
+++ b/slixmpp/plugins/xep_0300/__init__.py
@@ -0,0 +1,16 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2017 Emmanuel Gil Peyrot
+ This file is part of Slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.plugins.base import register_plugin
+
+from slixmpp.plugins.xep_0300 import stanza
+from slixmpp.plugins.xep_0300.stanza import Hash
+from slixmpp.plugins.xep_0300.hash import XEP_0300
+
+
+register_plugin(XEP_0300)
diff --git a/slixmpp/plugins/xep_0300/hash.py b/slixmpp/plugins/xep_0300/hash.py
new file mode 100644
index 00000000..43dcb5bd
--- /dev/null
+++ b/slixmpp/plugins/xep_0300/hash.py
@@ -0,0 +1,87 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2017 Emmanuel Gil Peyrot
+ This file is part of Slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from base64 import b64encode
+import hashlib
+import logging
+
+from slixmpp.plugins import BasePlugin
+from slixmpp.plugins.xep_0300 import stanza, Hash
+
+
+log = logging.getLogger(__name__)
+
+
+class XEP_0300(BasePlugin):
+
+ name = 'xep_0300'
+ description = 'XEP-0300: Use of Cryptographic Hash Functions in XMPP'
+ dependencies = {'xep_0030'}
+ stanza = stanza
+ default_config = {
+ 'block_size': 1024 * 1024, # One MiB
+ 'prefered': 'sha-256',
+ 'enable_sha-1': False,
+ 'enable_sha-256': True,
+ 'enable_sha-512': True,
+ 'enable_sha3-256': True,
+ 'enable_sha3-512': True,
+ 'enable_BLAKE2b256': True,
+ 'enable_BLAKE2b512': True,
+ }
+
+ _hashlib_function = {
+ 'sha-1': hashlib.sha1,
+ 'sha-256': hashlib.sha256,
+ 'sha-512': hashlib.sha512,
+ 'sha3-256': lambda: hashlib.sha3_256(),
+ 'sha3-512': lambda: hashlib.sha3_512(),
+ 'BLAKE2b256': lambda: hashlib.blake2b(digest_size=32),
+ 'BLAKE2b512': lambda: hashlib.blake2b(digest_size=64),
+ }
+
+ def plugin_init(self):
+ namespace = 'urn:xmpp:hash-function-text-names:%s'
+ self.enabled_hashes = []
+ for algo in self._hashlib_function:
+ if getattr(self, 'enable_' + algo, False):
+ # XXX: this is a hack for Python 3.5 or below, which
+ # don’t support sha3 or blake2b…
+ try:
+ self._hashlib_function[algo]()
+ except AttributeError:
+ log.warn('Algorithm %s unavailable, disabling.', algo)
+ else:
+ self.enabled_hashes.append(namespace % algo)
+
+ def session_bind(self, jid):
+ self.xmpp['xep_0030'].add_feature(Hash.namespace)
+
+ for namespace in self.enabled_hashes:
+ self.xmpp['xep_0030'].add_feature(namespace)
+
+ def plugin_end(self):
+ for namespace in self.enabled_hashes:
+ self.xmpp['xep_0030'].del_feature(namespace)
+
+ self.xmpp['xep_0030'].del_feature(feature=Hash.namespace)
+
+ def compute_hash(self, filename, function=None):
+ if function is None:
+ function = self.prefered
+ h = self._hashlib_function[function]()
+ with open(filename, 'rb') as f:
+ while True:
+ block = f.read(self.block_size)
+ if not block:
+ break
+ h.update(block)
+ hash_elem = Hash()
+ hash_elem['algo'] = function
+ hash_elem['value'] = b64encode(h.digest())
+ return hash_elem
diff --git a/slixmpp/plugins/xep_0300/stanza.py b/slixmpp/plugins/xep_0300/stanza.py
new file mode 100644
index 00000000..f5ab483c
--- /dev/null
+++ b/slixmpp/plugins/xep_0300/stanza.py
@@ -0,0 +1,35 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2017 Emmanuel Gil Peyrot
+ This file is part of Slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.xmlstream import ElementBase
+
+
+class Hash(ElementBase):
+ name = 'hash'
+ namespace = 'urn:xmpp:hashes:2'
+ plugin_attrib = 'hash'
+ interfaces = {'algo', 'value'}
+
+ allowed_algos = ['sha-1', 'sha-256', 'sha-512', 'sha3-256', 'sha3-512', 'BLAKE2b256', 'BLAKE2b512']
+
+ def set_algo(self, value):
+ if value in self.allowed_algos:
+ self._set_attr('algo', value)
+ elif value in [None, '']:
+ self._del_attr('algo')
+ else:
+ raise ValueError('Invalid algo: %s' % value)
+
+ def get_value(self):
+ return self.xml.text
+
+ def set_value(self, value):
+ self.xml.text = value
+
+ def del_value(self):
+ self.xml.text = ''
diff --git a/slixmpp/plugins/xep_0302.py b/slixmpp/plugins/xep_0302.py
index 6092b3e3..ff56e63e 100644
--- a/slixmpp/plugins/xep_0302.py
+++ b/slixmpp/plugins/xep_0302.py
@@ -13,9 +13,9 @@ class XEP_0302(BasePlugin):
name = 'xep_0302'
description = 'XEP-0302: XMPP Compliance Suites 2012'
- dependencies = set(['xep_0030', 'xep_0115', 'xep_0054',
- 'xep_0163', 'xep_0045', 'xep_0085',
- 'xep_0184', 'xep_0198'])
+ dependencies = {'xep_0030', 'xep_0115', 'xep_0054',
+ 'xep_0163', 'xep_0045', 'xep_0085',
+ 'xep_0184', 'xep_0198'}
register_plugin(XEP_0302)
diff --git a/slixmpp/plugins/xep_0308/correction.py b/slixmpp/plugins/xep_0308/correction.py
index 3802b799..d94f62a4 100644
--- a/slixmpp/plugins/xep_0308/correction.py
+++ b/slixmpp/plugins/xep_0308/correction.py
@@ -28,7 +28,7 @@ class XEP_0308(BasePlugin):
name = 'xep_0308'
description = 'XEP-0308: Last Message Correction'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0308/stanza.py b/slixmpp/plugins/xep_0308/stanza.py
index eb04d1ad..11e0d52b 100644
--- a/slixmpp/plugins/xep_0308/stanza.py
+++ b/slixmpp/plugins/xep_0308/stanza.py
@@ -13,4 +13,4 @@ class Replace(ElementBase):
name = 'replace'
namespace = 'urn:xmpp:message-correct:0'
plugin_attrib = 'replace'
- interfaces = set(['id'])
+ interfaces = {'id'}
diff --git a/slixmpp/plugins/xep_0313/mam.py b/slixmpp/plugins/xep_0313/mam.py
index d1c6b983..37aa49b4 100644
--- a/slixmpp/plugins/xep_0313/mam.py
+++ b/slixmpp/plugins/xep_0313/mam.py
@@ -29,7 +29,7 @@ class XEP_0313(BasePlugin):
name = 'xep_0313'
description = 'XEP-0313: Message Archive Management'
- dependencies = set(['xep_0030', 'xep_0050', 'xep_0059', 'xep_0297'])
+ dependencies = {'xep_0030', 'xep_0050', 'xep_0059', 'xep_0297'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0313/stanza.py b/slixmpp/plugins/xep_0313/stanza.py
index d7cfa222..3075c48e 100644
--- a/slixmpp/plugins/xep_0313/stanza.py
+++ b/slixmpp/plugins/xep_0313/stanza.py
@@ -17,8 +17,8 @@ class MAM(ElementBase):
name = 'query'
namespace = 'urn:xmpp:mam:tmp'
plugin_attrib = 'mam'
- interfaces = set(['queryid', 'start', 'end', 'with', 'results'])
- sub_interfaces = set(['start', 'end', 'with'])
+ interfaces = {'queryid', 'start', 'end', 'with', 'results'}
+ sub_interfaces = {'start', 'end', 'with'}
def setup(self, xml=None):
ElementBase.setup(self, xml)
@@ -66,8 +66,8 @@ class Preferences(ElementBase):
name = 'prefs'
namespace = 'urn:xmpp:mam:tmp'
plugin_attrib = 'mam_prefs'
- interfaces = set(['default', 'always', 'never'])
- sub_interfaces = set(['always', 'never'])
+ interfaces = {'default', 'always', 'never'}
+ sub_interfaces = {'always', 'never'}
def get_always(self):
results = set()
@@ -122,7 +122,7 @@ class Result(ElementBase):
name = 'result'
namespace = 'urn:xmpp:mam:tmp'
plugin_attrib = 'mam_result'
- interfaces = set(['queryid', 'id'])
+ interfaces = {'queryid', 'id'}
class Archived(ElementBase):
@@ -130,10 +130,10 @@ class Archived(ElementBase):
namespace = 'urn:xmpp:mam:tmp'
plugin_attrib = 'mam_archived'
plugin_multi_attrib = 'mam_archives'
- interfaces = set(['by', 'id'])
+ interfaces = {'by', 'id'}
def get_by(self):
return JID(self._get_attr('by'))
- def set_by(self):
+ def set_by(self, value):
return self._set_attr('by', str(value))
diff --git a/slixmpp/plugins/xep_0319/idle.py b/slixmpp/plugins/xep_0319/idle.py
index 1fd980a5..65500706 100644
--- a/slixmpp/plugins/xep_0319/idle.py
+++ b/slixmpp/plugins/xep_0319/idle.py
@@ -19,7 +19,7 @@ from slixmpp.plugins.xep_0319 import stanza
class XEP_0319(BasePlugin):
name = 'xep_0319'
description = 'XEP-0319: Last User Interaction in Presence'
- dependencies = set(['xep_0012'])
+ dependencies = {'xep_0012'}
stanza = stanza
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0319/stanza.py b/slixmpp/plugins/xep_0319/stanza.py
index ea70087b..3fdcd502 100644
--- a/slixmpp/plugins/xep_0319/stanza.py
+++ b/slixmpp/plugins/xep_0319/stanza.py
@@ -16,7 +16,7 @@ class Idle(ElementBase):
name = 'idle'
namespace = 'urn:xmpp:idle:1'
plugin_attrib = 'idle'
- interfaces = set(['since'])
+ interfaces = {'since'}
def get_since(self):
timestamp = self._get_attr('since')
diff --git a/slixmpp/plugins/xep_0323/sensordata.py b/slixmpp/plugins/xep_0323/sensordata.py
index c88deee9..fa340aae 100644
--- a/slixmpp/plugins/xep_0323/sensordata.py
+++ b/slixmpp/plugins/xep_0323/sensordata.py
@@ -101,7 +101,7 @@ class XEP_0323(BasePlugin):
name = 'xep_0323'
description = 'XEP-0323 Internet of Things - Sensor Data'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
diff --git a/slixmpp/plugins/xep_0323/stanza/sensordata.py b/slixmpp/plugins/xep_0323/stanza/sensordata.py
index aa223a62..c0906cac 100644
--- a/slixmpp/plugins/xep_0323/stanza/sensordata.py
+++ b/slixmpp/plugins/xep_0323/stanza/sensordata.py
@@ -10,36 +10,40 @@
from slixmpp import Iq, Message
from slixmpp.xmlstream import register_stanza_plugin, ElementBase, ET, JID
-from re import match
+import re
class Sensordata(ElementBase):
""" Placeholder for the namespace, not used as a stanza """
namespace = 'urn:xmpp:iot:sensordata'
name = 'sensordata'
plugin_attrib = name
- interfaces = set(tuple())
+ interfaces = set()
class FieldTypes():
"""
All field types are optional booleans that default to False
"""
- field_types = set([ 'momentary','peak','status','computed','identity','historicalSecond','historicalMinute','historicalHour', \
- 'historicalDay','historicalWeek','historicalMonth','historicalQuarter','historicalYear','historicalOther'])
+ field_types = {'momentary', 'peak', 'status', 'computed', 'identity',
+ 'historicalSecond', 'historicalMinute', 'historicalHour',
+ 'historicalDay', 'historicalWeek', 'historicalMonth',
+ 'historicalQuarter', 'historicalYear', 'historicalOther'}
class FieldStatus():
"""
All field statuses are optional booleans that default to False
"""
- field_status = set([ 'missing','automaticEstimate','manualEstimate','manualReadout','automaticReadout','timeOffset','warning','error', \
- 'signed','invoiced','endOfSeries','powerFailure','invoiceConfirmed'])
+ field_status = {'missing', 'automaticEstimate', 'manualEstimate',
+ 'manualReadout', 'automaticReadout', 'timeOffset',
+ 'warning', 'error', 'signed', 'invoiced', 'endOfSeries',
+ 'powerFailure', 'invoiceConfirmed'}
class Request(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'req'
plugin_attrib = name
- interfaces = set(['seqnr','nodes','fields','serviceToken','deviceToken','userToken','from','to','when','historical','all'])
+ interfaces = {'seqnr','nodes','fields','serviceToken','deviceToken','userToken','from','to','when','historical','all'}
interfaces.update(FieldTypes.field_types)
- _flags = set(['serviceToken','deviceToken','userToken','from','to','when','historical','all'])
+ _flags = {'serviceToken','deviceToken','userToken','from','to','when','historical','all'}
_flags.update(FieldTypes.field_types)
def __init__(self, xml=None, parent=None):
@@ -59,8 +63,8 @@ class Request(ElementBase):
xml -- Use an existing XML object for the stanza's values.
"""
ElementBase.setup(self, xml)
- self._nodes = set([node['nodeId'] for node in self['nodes']])
- self._fields = set([field['name'] for field in self['fields']])
+ self._nodes = {node['nodeId'] for node in self['nodes']}
+ self._fields = {field['name'] for field in self['fields']}
def _get_flags(self):
"""
@@ -225,39 +229,39 @@ class RequestNode(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'node'
plugin_attrib = name
- interfaces = set(['nodeId','sourceId','cacheType'])
+ interfaces = {'nodeId','sourceId','cacheType'}
class RequestField(ElementBase):
""" Field element in a request """
namespace = 'urn:xmpp:iot:sensordata'
name = 'field'
plugin_attrib = name
- interfaces = set(['name'])
+ interfaces = {'name'}
class Accepted(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'accepted'
plugin_attrib = name
- interfaces = set(['seqnr','queued'])
+ interfaces = {'seqnr','queued'}
class Started(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'started'
plugin_attrib = name
- interfaces = set(['seqnr'])
+ interfaces = {'seqnr'}
class Failure(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'failure'
plugin_attrib = name
- interfaces = set(['seqnr','done'])
+ interfaces = {'seqnr','done'}
class Error(ElementBase):
""" Error element in a request failure """
namespace = 'urn:xmpp:iot:sensordata'
name = 'error'
plugin_attrib = name
- interfaces = set(['nodeId','timestamp','sourceId','cacheType','text'])
+ interfaces = {'nodeId','timestamp','sourceId','cacheType','text'}
def get_text(self):
"""Return then contents inside the XML tag."""
@@ -281,15 +285,15 @@ class Rejected(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'rejected'
plugin_attrib = name
- interfaces = set(['seqnr','error'])
- sub_interfaces = set(['error'])
+ interfaces = {'seqnr','error'}
+ sub_interfaces = {'error'}
class Fields(ElementBase):
""" Fields element, top level in a response message with data """
namespace = 'urn:xmpp:iot:sensordata'
name = 'fields'
plugin_attrib = name
- interfaces = set(['seqnr','done','nodes'])
+ interfaces = {'seqnr','done','nodes'}
def __init__(self, xml=None, parent=None):
ElementBase.__init__(self, xml, parent)
@@ -307,7 +311,7 @@ class Fields(ElementBase):
xml -- Use an existing XML object for the stanza's values.
"""
ElementBase.setup(self, xml)
- self._nodes = set([node['nodeId'] for node in self['nodes']])
+ self._nodes = {node['nodeId'] for node in self['nodes']}
def add_node(self, nodeId, sourceId=None, cacheType=None, substanzas=None):
@@ -389,7 +393,7 @@ class FieldsNode(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'node'
plugin_attrib = name
- interfaces = set(['nodeId','sourceId','cacheType','timestamps'])
+ interfaces = {'nodeId','sourceId','cacheType','timestamps'}
def __init__(self, xml=None, parent=None):
ElementBase.__init__(self, xml, parent)
@@ -407,7 +411,7 @@ class FieldsNode(ElementBase):
xml -- Use an existing XML object for the stanza's values.
"""
ElementBase.setup(self, xml)
- self._timestamps = set([ts['value'] for ts in self['timestamps']])
+ self._timestamps = {ts['value'] for ts in self['timestamps']}
def add_timestamp(self, timestamp, substanzas=None):
"""
@@ -498,7 +502,7 @@ class Field(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'field'
plugin_attrib = name
- interfaces = set(['name','module','stringIds'])
+ interfaces = {'name','module','stringIds'}
interfaces.update(FieldTypes.field_types)
interfaces.update(FieldStatus.field_status)
@@ -554,7 +558,7 @@ class Timestamp(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'timestamp'
plugin_attrib = name
- interfaces = set(['value','datas'])
+ interfaces = {'value','datas'}
def __init__(self, xml=None, parent=None):
ElementBase.__init__(self, xml, parent)
@@ -572,7 +576,7 @@ class Timestamp(ElementBase):
xml -- Use an existing XML object for the stanza's values.
"""
ElementBase.setup(self, xml)
- self._datas = set([data['name'] for data in self['datas']])
+ self._datas = {data['name'] for data in self['datas']}
def add_data(self, typename, name, value, module=None, stringIds=None, unit=None, dataType=None, flags=None):
"""
@@ -668,7 +672,7 @@ class DataNumeric(Field):
namespace = 'urn:xmpp:iot:sensordata'
name = 'numeric'
plugin_attrib = name
- interfaces = set(['value', 'unit'])
+ interfaces = {'value', 'unit'}
interfaces.update(Field.interfaces)
def _get_typename(self):
@@ -681,7 +685,7 @@ class DataString(Field):
namespace = 'urn:xmpp:iot:sensordata'
name = 'string'
plugin_attrib = name
- interfaces = set(['value'])
+ interfaces = {'value'}
interfaces.update(Field.interfaces)
def _get_typename(self):
@@ -695,7 +699,7 @@ class DataBoolean(Field):
namespace = 'urn:xmpp:iot:sensordata'
name = 'boolean'
plugin_attrib = name
- interfaces = set(['value'])
+ interfaces = {'value'}
interfaces.update(Field.interfaces)
def _get_typename(self):
@@ -709,7 +713,7 @@ class DataDateTime(Field):
namespace = 'urn:xmpp:iot:sensordata'
name = 'dateTime'
plugin_attrib = name
- interfaces = set(['value'])
+ interfaces = {'value'}
interfaces.update(Field.interfaces)
def _get_typename(self):
@@ -723,7 +727,7 @@ class DataTimeSpan(Field):
namespace = 'urn:xmpp:iot:sensordata'
name = 'timeSpan'
plugin_attrib = name
- interfaces = set(['value'])
+ interfaces = {'value'}
interfaces.update(Field.interfaces)
def _get_typename(self):
@@ -737,7 +741,7 @@ class DataEnum(Field):
namespace = 'urn:xmpp:iot:sensordata'
name = 'enum'
plugin_attrib = name
- interfaces = set(['value', 'dataType'])
+ interfaces = {'value', 'dataType'}
interfaces.update(Field.interfaces)
def _get_typename(self):
@@ -748,21 +752,21 @@ class Done(ElementBase):
namespace = 'urn:xmpp:iot:sensordata'
name = 'done'
plugin_attrib = name
- interfaces = set(['seqnr'])
+ interfaces = {'seqnr'}
class Cancel(ElementBase):
""" Cancel element used to signal that a request shall be cancelled """
namespace = 'urn:xmpp:iot:sensordata'
name = 'cancel'
plugin_attrib = name
- interfaces = set(['seqnr'])
+ interfaces = {'seqnr'}
class Cancelled(ElementBase):
""" Cancelled element used to signal that cancellation is confirmed """
namespace = 'urn:xmpp:iot:sensordata'
name = 'cancelled'
plugin_attrib = name
- interfaces = set(['seqnr'])
+ interfaces = {'seqnr'}
register_stanza_plugin(Iq, Request)
diff --git a/slixmpp/plugins/xep_0325/control.py b/slixmpp/plugins/xep_0325/control.py
index 5c1b3003..5960291c 100644
--- a/slixmpp/plugins/xep_0325/control.py
+++ b/slixmpp/plugins/xep_0325/control.py
@@ -97,7 +97,7 @@ class XEP_0325(BasePlugin):
name = 'xep_0325'
description = 'XEP-0325 Internet of Things - Control'
- dependencies = set(['xep_0030'])
+ dependencies = {'xep_0030'}
stanza = stanza
diff --git a/slixmpp/plugins/xep_0325/stanza/control.py b/slixmpp/plugins/xep_0325/stanza/control.py
index c47f3a4e..3662ff0c 100644
--- a/slixmpp/plugins/xep_0325/stanza/control.py
+++ b/slixmpp/plugins/xep_0325/stanza/control.py
@@ -23,7 +23,7 @@ class ControlSet(ElementBase):
namespace = 'urn:xmpp:iot:control'
name = 'set'
plugin_attrib = name
- interfaces = set(['nodes','datas'])
+ interfaces = {'nodes','datas'}
def __init__(self, xml=None, parent=None):
ElementBase.__init__(self, xml, parent)
@@ -42,8 +42,8 @@ class ControlSet(ElementBase):
xml -- Use an existing XML object for the stanza's values.
"""
ElementBase.setup(self, xml)
- self._nodes = set([node['nodeId'] for node in self['nodes']])
- self._datas = set([data['name'] for data in self['datas']])
+ self._nodes = {node['nodeId'] for node in self['nodes']}
+ self._datas = {data['name'] for data in self['datas']}
def add_node(self, nodeId, sourceId=None, cacheType=None):
"""
@@ -207,14 +207,14 @@ class RequestNode(ElementBase):
namespace = 'urn:xmpp:iot:control'
name = 'node'
plugin_attrib = name
- interfaces = set(['nodeId','sourceId','cacheType'])
+ interfaces = {'nodeId','sourceId','cacheType'}
class ControlSetResponse(ElementBase):
namespace = 'urn:xmpp:iot:control'
name = 'setResponse'
plugin_attrib = name
- interfaces = set(['responseCode'])
+ interfaces = {'responseCode'}
def __init__(self, xml=None, parent=None):
ElementBase.__init__(self, xml, parent)
@@ -233,8 +233,8 @@ class ControlSetResponse(ElementBase):
xml -- Use an existing XML object for the stanza's values.
"""
ElementBase.setup(self, xml)
- self._nodes = set([node['nodeId'] for node in self['nodes']])
- self._datas = set([data['name'] for data in self['datas']])
+ self._nodes = {node['nodeId'] for node in self['nodes']}
+ self._datas = {data['name'] for data in self['datas']}
def add_node(self, nodeId, sourceId=None, cacheType=None):
"""
@@ -370,7 +370,7 @@ class Error(ElementBase):
namespace = 'urn:xmpp:iot:control'
name = 'error'
plugin_attrib = name
- interfaces = set(['var','text'])
+ interfaces = {'var','text'}
def get_text(self):
"""Return then contents inside the XML tag."""
@@ -398,7 +398,7 @@ class ResponseParameter(ElementBase):
namespace = 'urn:xmpp:iot:control'
name = 'parameter'
plugin_attrib = name
- interfaces = set(['name'])
+ interfaces = {'name'}
class BaseParameter(ElementBase):
@@ -419,7 +419,7 @@ class BaseParameter(ElementBase):
namespace = 'urn:xmpp:iot:control'
name = 'baseParameter'
plugin_attrib = name
- interfaces = set(['name','value'])
+ interfaces = {'name','value'}
def _get_typename(self):
return self.name
diff --git a/slixmpp/plugins/xep_0332/http.py b/slixmpp/plugins/xep_0332/http.py
index 7ad14dc8..bebb0e69 100644
--- a/slixmpp/plugins/xep_0332/http.py
+++ b/slixmpp/plugins/xep_0332/http.py
@@ -36,11 +36,11 @@ class XEP_0332(BasePlugin):
#: xep_0047 not included.
#: xep_0001, 0137 and 0166 are missing
- dependencies = set(['xep_0030', 'xep_0131'])
+ dependencies = {'xep_0030', 'xep_0131'}
#: TODO: Do we really need to mention the supported_headers?!
default_config = {
- 'supported_headers': set([
+ 'supported_headers': {
'Content-Length', 'Transfer-Encoding', 'DateTime',
'Accept-Charset', 'Location', 'Content-ID', 'Description',
'Content-Language', 'Content-Transfer-Encoding', 'Timestamp',
@@ -48,7 +48,7 @@ class XEP_0332(BasePlugin):
'WWW-Authenticate', 'Accept-Encoding', 'Server', 'Error-Info',
'Identifier', 'Content-Location', 'Content-Encoding', 'Distribute',
'Accept', 'Proxy-Authenticate', 'ETag', 'Expect', 'Content-Type'
- ])
+ }
}
def plugin_init(self):
diff --git a/slixmpp/plugins/xep_0332/stanza/data.py b/slixmpp/plugins/xep_0332/stanza/data.py
index a19c94f5..92e3d3af 100644
--- a/slixmpp/plugins/xep_0332/stanza/data.py
+++ b/slixmpp/plugins/xep_0332/stanza/data.py
@@ -17,7 +17,7 @@ class HTTPData(ElementBase):
"""
name = 'data'
namespace = 'urn:xmpp:http'
- interfaces = set(['data'])
+ interfaces = {'data'}
plugin_attrib = 'data'
is_extension = True
diff --git a/slixmpp/plugins/xep_0332/stanza/request.py b/slixmpp/plugins/xep_0332/stanza/request.py
index e3e46361..1d4aa5b1 100644
--- a/slixmpp/plugins/xep_0332/stanza/request.py
+++ b/slixmpp/plugins/xep_0332/stanza/request.py
@@ -49,7 +49,7 @@ class HTTPRequest(ElementBase):
name = 'request'
namespace = 'urn:xmpp:http'
- interfaces = set(['method', 'resource', 'version'])
+ interfaces = {'method', 'resource', 'version'}
plugin_attrib = 'http-req'
def get_method(self):
diff --git a/slixmpp/plugins/xep_0332/stanza/response.py b/slixmpp/plugins/xep_0332/stanza/response.py
index a0b8fe34..8f58f0c2 100644
--- a/slixmpp/plugins/xep_0332/stanza/response.py
+++ b/slixmpp/plugins/xep_0332/stanza/response.py
@@ -46,7 +46,7 @@ class HTTPResponse(ElementBase):
name = 'response'
namespace = 'urn:xmpp:http'
- interfaces = set(['code', 'message', 'version'])
+ interfaces = {'code', 'message', 'version'}
plugin_attrib = 'http-resp'
def get_code(self):
diff --git a/slixmpp/plugins/xep_0333/hints.py b/slixmpp/plugins/xep_0333/hints.py
index 932bf6d5..5a3d3f9a 100644
--- a/slixmpp/plugins/xep_0333/hints.py
+++ b/slixmpp/plugins/xep_0333/hints.py
@@ -11,6 +11,8 @@ import logging
from slixmpp import Message
from slixmpp.plugins import BasePlugin
from slixmpp.xmlstream import register_stanza_plugin
+from slixmpp.xmlstream.handler import Callback
+from slixmpp.xmlstream.matcher import StanzaPath
from slixmpp.plugins.xep_0333 import stanza, Markable, Received, Displayed, Acknowledged
log = logging.getLogger(__name__)
diff --git a/slixmpp/plugins/xep_0380/__init__.py b/slixmpp/plugins/xep_0380/__init__.py
new file mode 100644
index 00000000..fec9f60f
--- /dev/null
+++ b/slixmpp/plugins/xep_0380/__init__.py
@@ -0,0 +1,15 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2016 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
+ This file is part of Slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.plugins.base import register_plugin
+
+from slixmpp.plugins.xep_0380.stanza import Encryption
+from slixmpp.plugins.xep_0380.eme import XEP_0380
+
+
+register_plugin(XEP_0380)
diff --git a/slixmpp/plugins/xep_0380/eme.py b/slixmpp/plugins/xep_0380/eme.py
new file mode 100644
index 00000000..abdd3e88
--- /dev/null
+++ b/slixmpp/plugins/xep_0380/eme.py
@@ -0,0 +1,69 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2016 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
+ This file is part of Slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+import logging
+
+import slixmpp
+from slixmpp.stanza import Message
+from slixmpp.xmlstream.handler import Callback
+from slixmpp.xmlstream.matcher import StanzaPath
+from slixmpp.xmlstream import register_stanza_plugin, ElementBase, ET
+from slixmpp.plugins import BasePlugin
+from slixmpp.plugins.xep_0380 import stanza, Encryption
+
+
+log = logging.getLogger(__name__)
+
+
+class XEP_0380(BasePlugin):
+
+ """
+ XEP-0380: Explicit Message Encryption
+ """
+
+ name = 'xep_0380'
+ description = 'XEP-0380: Explicit Message Encryption'
+ dependencies = {'xep_0030'}
+ default_config = {
+ 'template': 'This message is encrypted with {name} ({namespace})',
+ }
+
+ mechanisms = {
+ 'jabber:x:encrypted': 'Legacy OpenPGP',
+ 'urn:xmpp:ox:0': 'OpenPGP for XMPP',
+ 'urn:xmpp:otr:0': 'OTR',
+ 'eu.siacs.conversations.axolotl': 'Legacy OMEMO',
+ 'urn:xmpp:omemo:0': 'OMEMO',
+ }
+
+ def plugin_init(self):
+ self.xmpp.register_handler(
+ Callback('Explicit Message Encryption',
+ StanzaPath('message/eme'),
+ self._handle_eme))
+
+ register_stanza_plugin(Message, Encryption)
+
+ def plugin_end(self):
+ self.xmpp.remove_handler('Chat State')
+
+ def session_bind(self, jid):
+ self.xmpp.plugin['xep_0030'].add_feature(Encryption.namespace)
+
+ def has_eme(self, msg):
+ return msg.xml.find('{%s}encryption' % Encryption.namespace) is not None
+
+ def replace_body_with_eme(self, msg):
+ eme = msg['eme']
+ namespace = eme['namespace']
+ name = self.mechanisms[namespace] if namespace in self.mechanisms else eme['name']
+ body = self.config['template'].format(name=name, namespace=namespace)
+ msg['body'] = body
+
+ def _handle_eme(self, msg):
+ self.xmpp.event('message_encryption', msg)
diff --git a/slixmpp/plugins/xep_0380/stanza.py b/slixmpp/plugins/xep_0380/stanza.py
new file mode 100644
index 00000000..7dd678b1
--- /dev/null
+++ b/slixmpp/plugins/xep_0380/stanza.py
@@ -0,0 +1,16 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2016 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
+ This file is part of Slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+from slixmpp.xmlstream import ElementBase
+
+
+class Encryption(ElementBase):
+ name = 'encryption'
+ namespace = 'urn:xmpp:eme:0'
+ plugin_attrib = 'eme'
+ interfaces = {'namespace', 'name'}
diff --git a/slixmpp/stanza/atom.py b/slixmpp/stanza/atom.py
index ccded724..8dde00de 100644
--- a/slixmpp/stanza/atom.py
+++ b/slixmpp/stanza/atom.py
@@ -21,9 +21,8 @@ class AtomEntry(ElementBase):
namespace = 'http://www.w3.org/2005/Atom'
name = 'entry'
plugin_attrib = 'entry'
- interfaces = set(('title', 'summary', 'id', 'published', 'updated'))
- sub_interfaces = set(('title', 'summary', 'id', 'published',
- 'updated'))
+ interfaces = {'title', 'summary', 'id', 'published', 'updated'}
+ sub_interfaces = {'title', 'summary', 'id', 'published', 'updated'}
class AtomAuthor(ElementBase):
@@ -37,7 +36,7 @@ class AtomAuthor(ElementBase):
name = 'author'
plugin_attrib = 'author'
- interfaces = set(('name', 'uri'))
- sub_interfaces = set(('name', 'uri'))
+ interfaces = {'name', 'uri'}
+ sub_interfaces = {'name', 'uri'}
register_stanza_plugin(AtomEntry, AtomAuthor)
diff --git a/slixmpp/stanza/error.py b/slixmpp/stanza/error.py
index 67f736c0..132ffc4d 100644
--- a/slixmpp/stanza/error.py
+++ b/slixmpp/stanza/error.py
@@ -51,22 +51,22 @@ class Error(ElementBase):
namespace = 'jabber:client'
name = 'error'
plugin_attrib = 'error'
- interfaces = set(('code', 'condition', 'text', 'type',
- 'gone', 'redirect', 'by'))
- sub_interfaces = set(('text',))
+ interfaces = {'code', 'condition', 'text', 'type',
+ 'gone', 'redirect', 'by'}
+ sub_interfaces = {'text'}
plugin_attrib_map = {}
plugin_tag_map = {}
- conditions = set(('bad-request', 'conflict', 'feature-not-implemented',
- 'forbidden', 'gone', 'internal-server-error',
- 'item-not-found', 'jid-malformed', 'not-acceptable',
- 'not-allowed', 'not-authorized', 'payment-required',
- 'recipient-unavailable', 'redirect',
- 'registration-required', 'remote-server-not-found',
- 'remote-server-timeout', 'resource-constraint',
- 'service-unavailable', 'subscription-required',
- 'undefined-condition', 'unexpected-request'))
+ conditions = {'bad-request', 'conflict', 'feature-not-implemented',
+ 'forbidden', 'gone', 'internal-server-error',
+ 'item-not-found', 'jid-malformed', 'not-acceptable',
+ 'not-allowed', 'not-authorized', 'payment-required',
+ 'recipient-unavailable', 'redirect',
+ 'registration-required', 'remote-server-not-found',
+ 'remote-server-timeout', 'resource-constraint',
+ 'service-unavailable', 'subscription-required',
+ 'undefined-condition', 'unexpected-request'}
condition_ns = 'urn:ietf:params:xml:ns:xmpp-stanzas'
- types = set(('cancel', 'continue', 'modify', 'auth', 'wait'))
+ types = {'cancel', 'continue', 'modify', 'auth', 'wait'}
def setup(self, xml=None):
"""
diff --git a/slixmpp/stanza/iq.py b/slixmpp/stanza/iq.py
index a64dfa7f..af7e3109 100644
--- a/slixmpp/stanza/iq.py
+++ b/slixmpp/stanza/iq.py
@@ -57,8 +57,8 @@ class Iq(RootStanza):
namespace = 'jabber:client'
name = 'iq'
- interfaces = set(('type', 'to', 'from', 'id', 'query'))
- types = set(('get', 'result', 'set', 'error'))
+ interfaces = {'type', 'to', 'from', 'id', 'query'}
+ types = {'get', 'result', 'set', 'error'}
plugin_attrib = name
def __init__(self, *args, **kwargs):
diff --git a/slixmpp/stanza/message.py b/slixmpp/stanza/message.py
index cbb170fa..f5813eaf 100644
--- a/slixmpp/stanza/message.py
+++ b/slixmpp/stanza/message.py
@@ -47,11 +47,11 @@ class Message(RootStanza):
name = 'message'
namespace = 'jabber:client'
plugin_attrib = name
- interfaces = set(['type', 'to', 'from', 'id', 'body', 'subject',
- 'thread', 'parent_thread', 'mucroom', 'mucnick'])
- sub_interfaces = set(['body', 'subject', 'thread'])
+ interfaces = {'type', 'to', 'from', 'id', 'body', 'subject', 'thread',
+ 'parent_thread', 'mucroom', 'mucnick'}
+ sub_interfaces = {'body', 'subject', 'thread'}
lang_interfaces = sub_interfaces
- types = set(['normal', 'chat', 'headline', 'error', 'groupchat'])
+ types = {'normal', 'chat', 'headline', 'error', 'groupchat'}
def __init__(self, *args, **kwargs):
"""
diff --git a/slixmpp/stanza/presence.py b/slixmpp/stanza/presence.py
index 517e73c1..614cd331 100644
--- a/slixmpp/stanza/presence.py
+++ b/slixmpp/stanza/presence.py
@@ -56,14 +56,13 @@ class Presence(RootStanza):
name = 'presence'
namespace = 'jabber:client'
plugin_attrib = name
- interfaces = set(['type', 'to', 'from', 'id', 'show',
- 'status', 'priority'])
- sub_interfaces = set(['show', 'status', 'priority'])
- lang_interfaces = set(['status'])
-
- types = set(['available', 'unavailable', 'error', 'probe', 'subscribe',
- 'subscribed', 'unsubscribe', 'unsubscribed'])
- showtypes = set(['dnd', 'chat', 'xa', 'away'])
+ interfaces = {'type', 'to', 'from', 'id', 'show', 'status', 'priority'}
+ sub_interfaces = {'show', 'status', 'priority'}
+ lang_interfaces = {'status'}
+
+ types = {'available', 'unavailable', 'error', 'probe', 'subscribe',
+ 'subscribed', 'unsubscribe', 'unsubscribed'}
+ showtypes = {'dnd', 'chat', 'xa', 'away'}
def __init__(self, *args, **kwargs):
"""
diff --git a/slixmpp/stanza/roster.py b/slixmpp/stanza/roster.py
index c017c33f..11d38cc2 100644
--- a/slixmpp/stanza/roster.py
+++ b/slixmpp/stanza/roster.py
@@ -36,7 +36,7 @@ class Roster(ElementBase):
namespace = 'jabber:iq:roster'
name = 'query'
plugin_attrib = 'roster'
- interfaces = set(('items', 'ver'))
+ interfaces = {'items', 'ver'}
def get_ver(self):
"""
@@ -118,8 +118,7 @@ class RosterItem(ElementBase):
namespace = 'jabber:iq:roster'
name = 'item'
plugin_attrib = 'item'
- interfaces = set(('jid', 'name', 'subscription', 'ask',
- 'approved', 'groups'))
+ interfaces = {'jid', 'name', 'subscription', 'ask', 'approved', 'groups'}
def get_jid(self):
return JID(self._get_attr('jid', ''))
diff --git a/slixmpp/stanza/stream_error.py b/slixmpp/stanza/stream_error.py
index d8b8bb5a..2aa70173 100644
--- a/slixmpp/stanza/stream_error.py
+++ b/slixmpp/stanza/stream_error.py
@@ -54,8 +54,8 @@ class StreamError(Error, StanzaBase):
"""
namespace = 'http://etherx.jabber.org/streams'
- interfaces = set(('condition', 'text', 'see_other_host'))
- conditions = set((
+ interfaces = {'condition', 'text', 'see_other_host'}
+ conditions = {
'bad-format', 'bad-namespace-prefix', 'conflict',
'connection-timeout', 'host-gone', 'host-unknown',
'improper-addressing', 'internal-server-error', 'invalid-from',
@@ -64,7 +64,7 @@ class StreamError(Error, StanzaBase):
'reset', 'resource-constraint', 'restricted-xml', 'see-other-host',
'system-shutdown', 'undefined-condition', 'unsupported-encoding',
'unsupported-feature', 'unsupported-stanza-type',
- 'unsupported-version'))
+ 'unsupported-version'}
condition_ns = 'urn:ietf:params:xml:ns:xmpp-streams'
def get_see_other_host(self):
diff --git a/slixmpp/stanza/stream_features.py b/slixmpp/stanza/stream_features.py
index 05788771..70d0ccca 100644
--- a/slixmpp/stanza/stream_features.py
+++ b/slixmpp/stanza/stream_features.py
@@ -17,7 +17,7 @@ class StreamFeatures(StanzaBase):
name = 'features'
namespace = 'http://etherx.jabber.org/streams'
- interfaces = set(('features', 'required', 'optional'))
+ interfaces = {'features', 'required', 'optional'}
sub_interfaces = interfaces
plugin_tag_map = {}
plugin_attrib_map = {}
diff --git a/slixmpp/util/sasl/client.py b/slixmpp/util/sasl/client.py
index d5daf4be..745eca20 100644
--- a/slixmpp/util/sasl/client.py
+++ b/slixmpp/util/sasl/client.py
@@ -75,7 +75,7 @@ def sasl_mech(score):
MECH_SEC_SCORES[mech.name] = mech.score
if mech.channel_binding:
MECHANISMS[mech.name + '-PLUS'] = mech
- MECH_SEC_SCORES[name] = mech.score + 10
+ MECH_SEC_SCORES[mech.name] = mech.score + 10
return mech
return register
diff --git a/slixmpp/util/sasl/mechanisms.py b/slixmpp/util/sasl/mechanisms.py
index de0203c0..36b2795c 100644
--- a/slixmpp/util/sasl/mechanisms.py
+++ b/slixmpp/util/sasl/mechanisms.py
@@ -39,7 +39,7 @@ class ANONYMOUS(Mech):
class LOGIN(Mech):
name = 'LOGIN'
- required_credentials = set(['username', 'password'])
+ required_credentials = {'username', 'password'}
def setup(self, name):
self.step = 0
@@ -59,9 +59,9 @@ class LOGIN(Mech):
class PLAIN(Mech):
name = 'PLAIN'
- required_credentials = set(['username', 'password'])
- optional_credentials = set(['authzid'])
- security = set(['encrypted', 'encrypted_plain', 'unencrypted_plain'])
+ required_credentials = {'username', 'password'}
+ optional_credentials = {'authzid'}
+ security = {'encrypted', 'encrypted_plain', 'unencrypted_plain'}
def setup(self, name):
if not self.security_settings['encrypted']:
@@ -82,7 +82,7 @@ class PLAIN(Mech):
class EXTERNAL(Mech):
name = 'EXTERNAL'
- optional_credentials = set(['authzid'])
+ optional_credentials = {'authzid'}
def process(self, challenge=b''):
return self.credentials['authzid']
@@ -92,7 +92,7 @@ class EXTERNAL(Mech):
class X_FACEBOOK_PLATFORM(Mech):
name = 'X-FACEBOOK-PLATFORM'
- required_credentials = set(['api_key', 'access_token'])
+ required_credentials = {'api_key', 'access_token'}
def process(self, challenge=b''):
if challenge:
@@ -119,7 +119,7 @@ class X_FACEBOOK_PLATFORM(Mech):
class X_MESSENGER_OAUTH2(Mech):
name = 'X-MESSENGER-OAUTH2'
- required_credentials = set(['access_token'])
+ required_credentials = {'access_token'}
def process(self, challenge=b''):
return self.credentials['access_token']
@@ -129,7 +129,7 @@ class X_MESSENGER_OAUTH2(Mech):
class X_OAUTH2(Mech):
name = 'X-OAUTH2'
- required_credentials = set(['username', 'access_token'])
+ required_credentials = {'username', 'access_token'}
def process(self, challenge=b''):
return b'\x00' + self.credentials['username'] + \
@@ -140,7 +140,7 @@ class X_OAUTH2(Mech):
class X_GOOGLE_TOKEN(Mech):
name = 'X-GOOGLE-TOKEN'
- required_credentials = set(['email', 'access_token'])
+ required_credentials = {'email', 'access_token'}
def process(self, challenge=b''):
email = self.credentials['email']
@@ -153,8 +153,8 @@ class CRAM(Mech):
name = 'CRAM'
use_hashes = True
- required_credentials = set(['username', 'password'])
- security = set(['encrypted', 'unencrypted_cram'])
+ required_credentials = {'username', 'password'}
+ security = {'encrypted', 'unencrypted_cram'}
def setup(self, name):
self.hash_name = name[5:]
@@ -184,9 +184,9 @@ class SCRAM(Mech):
name = 'SCRAM'
use_hashes = True
channel_binding = True
- required_credentials = set(['username', 'password'])
- optional_credentials = set(['authzid', 'channel_binding'])
- security = set(['encrypted', 'unencrypted_scram'])
+ required_credentials = {'username', 'password'}
+ optional_credentials = {'authzid', 'channel_binding'}
+ security = {'encrypted', 'unencrypted_scram'}
def setup(self, name):
self.use_channel_binding = False
@@ -291,8 +291,7 @@ class SCRAM(Mech):
cbind_input = self.gs2_header + cbind_data
channel_binding = b'c=' + b64encode(cbind_input).replace(b'\n', b'')
- client_final_message_without_proof = channel_binding + b',' + \
- b'r=' + nonce
+ client_final_message_without_proof = channel_binding + b',r=' + nonce
salted_password = self.Hi(self.credentials['password'],
salt,
@@ -334,9 +333,9 @@ class DIGEST(Mech):
name = 'DIGEST'
use_hashes = True
- required_credentials = set(['username', 'password', 'realm', 'service', 'host'])
- optional_credentials = set(['authzid', 'service-name'])
- security = set(['encrypted', 'unencrypted_digest'])
+ required_credentials = {'username', 'password', 'realm', 'service', 'host'}
+ optional_credentials = {'authzid', 'service-name'}
+ security = {'encrypted', 'unencrypted_digest'}
def setup(self, name):
self.hash_name = name[7:]
@@ -511,8 +510,8 @@ else:
class GSSAPI(Mech):
name = 'GSSAPI'
- required_credentials = set(['username', 'service-name'])
- optional_credentials = set(['authzid'])
+ required_credentials = {'username', 'service-name'}
+ optional_credentials = {'authzid'}
def setup(self, name):
authzid = self.credentials['authzid']
diff --git a/slixmpp/util/stringprep_profiles.py b/slixmpp/util/stringprep_profiles.py
index 5fb0b4b7..8ba3842f 100644
--- a/slixmpp/util/stringprep_profiles.py
+++ b/slixmpp/util/stringprep_profiles.py
@@ -146,6 +146,7 @@ def create(nfkc=True, bidi=True, mappings=None,
if bidi:
check_bidi(data)
if query and unassigned:
- check_unassigned(data, unassigned)
+ #check_unassigned(data, unassigned)
+ raise StringPrepError('Query profile with unassigned data is unimplemented.')
return data
return profile
diff --git a/slixmpp/version.py b/slixmpp/version.py
index 2dd4fcff..ef9cc605 100644
--- a/slixmpp/version.py
+++ b/slixmpp/version.py
@@ -9,5 +9,5 @@
# We don't want to have to import the entire library
# just to get the version info for setup.py
-__version__ = '1.2.1'
-__version_info__ = (1, 2, 1)
+__version__ = '1.2.4'
+__version_info__ = (1, 2, 4)
diff --git a/slixmpp/xmlstream/cert.py b/slixmpp/xmlstream/cert.py
index d357b326..28ef585a 100644
--- a/slixmpp/xmlstream/cert.py
+++ b/slixmpp/xmlstream/cert.py
@@ -76,7 +76,7 @@ def extract_names(raw_cert):
name_type = name.getName()
if name_type == 'dNSName':
results['DNS'].add(decode_str(name.getComponent()))
- if name_type == 'uniformResourceIdentifier':
+ elif name_type == 'uniformResourceIdentifier':
value = decode_str(name.getComponent())
if value.startswith('xmpp:'):
results['URI'].add(value[5:])
diff --git a/slixmpp/xmlstream/stanzabase.py b/slixmpp/xmlstream/stanzabase.py
index e7ffddc8..605dbb61 100644
--- a/slixmpp/xmlstream/stanzabase.py
+++ b/slixmpp/xmlstream/stanzabase.py
@@ -147,8 +147,8 @@ def multifactory(stanza, plugin_attrib):
Multi.is_extension = True
Multi.plugin_attrib = plugin_attrib
Multi._multistanza = stanza
- Multi.interfaces = set([plugin_attrib])
- Multi.lang_interfaces = set([plugin_attrib])
+ Multi.interfaces = {plugin_attrib}
+ Multi.lang_interfaces = {plugin_attrib}
setattr(Multi, "get_%s" % plugin_attrib, get_multi)
setattr(Multi, "set_%s" % plugin_attrib, set_multi)
setattr(Multi, "del_%s" % plugin_attrib, del_multi)
@@ -212,8 +212,8 @@ class ElementBase(object):
>>> class Message(ElementBase):
... name = "message"
... namespace = "jabber:client"
- ... interfaces = set(('to', 'from', 'type', 'body'))
- ... sub_interfaces = set(('body',))
+ ... interfaces = {'to', 'from', 'type', 'body'}
+ ... sub_interfaces = {'body'}
The resulting Message stanza's contents may be accessed as so::
@@ -239,7 +239,7 @@ class ElementBase(object):
>>> class MessagePlugin(ElementBase):
... name = "custom_plugin"
... namespace = "custom"
- ... interfaces = set(('useful_thing', 'custom'))
+ ... interfaces = {'useful_thing', 'custom'}
... plugin_attrib = "custom"
The plugin stanza class must be associated with its intended
@@ -311,7 +311,7 @@ class ElementBase(object):
#: manipulating the underlying XML object. This set may be augmented
#: with the :attr:`plugin_attrib` value of any registered
#: stanza plugins.
- interfaces = set(('type', 'to', 'from', 'id', 'payload'))
+ interfaces = {'type', 'to', 'from', 'id', 'payload'}
#: A subset of :attr:`interfaces` which maps interfaces to direct
#: subelements of the underlying XML object. Using this set, the text
@@ -1385,10 +1385,10 @@ class StanzaBase(ElementBase):
#: There is a small set of attributes which apply to all XMPP stanzas:
#: the stanza type, the to and from JIDs, the stanza ID, and, especially
#: in the case of an Iq stanza, a payload.
- interfaces = set(('type', 'to', 'from', 'id', 'payload'))
+ interfaces = {'type', 'to', 'from', 'id', 'payload'}
#: A basic set of allowed values for the ``'type'`` interface.
- types = set(('get', 'set', 'error', None, 'unavailable', 'normal', 'chat'))
+ types = {'get', 'set', 'error', None, 'unavailable', 'normal', 'chat'}
def __init__(self, stream=None, xml=None, stype=None,
sto=None, sfrom=None, sid=None, parent=None):
diff --git a/slixmpp/xmlstream/xmlstream.py b/slixmpp/xmlstream/xmlstream.py
index 72d2651c..704a34f1 100644
--- a/slixmpp/xmlstream/xmlstream.py
+++ b/slixmpp/xmlstream/xmlstream.py
@@ -19,7 +19,7 @@ import ssl
import weakref
import uuid
-import xml.etree.ElementTree
+import xml.etree.ElementTree as ET
from slixmpp.xmlstream.asyncio import asyncio
from slixmpp.xmlstream import tostring, highlight
@@ -289,7 +289,8 @@ class XMLStream(asyncio.BaseProtocol):
record = yield from self.pick_dns_answer(self.default_domain)
if record is not None:
- host, address, port = record
+ host, address, dns_port = record
+ port = dns_port if dns_port else self.address[1]
self.address = (address, port)
self._service_name = host
else:
@@ -339,7 +340,7 @@ class XMLStream(asyncio.BaseProtocol):
"""
self.xml_depth = 0
self.xml_root = None
- self.parser = xml.etree.ElementTree.XMLPullParser(("start", "end"))
+ self.parser = ET.XMLPullParser(("start", "end"))
def connection_made(self, transport):
"""Called when the TCP connection has been established with the server
@@ -358,33 +359,51 @@ class XMLStream(asyncio.BaseProtocol):
event. This could trigger one or more event (a stanza is received,
the stream is opened, etc).
"""
+ if self.parser is None:
+ log.warning('Received data before the connection is established: %r',
+ data)
+ return
self.parser.feed(data)
- for event, xml in self.parser.read_events():
- if event == 'start':
- if self.xml_depth == 0:
- # We have received the start of the root element.
- self.xml_root = xml
- log.debug('RECV: %s', highlight(tostring(self.xml_root, xmlns=self.default_ns,
- stream=self,
- top_level=True,
- open_only=True)))
- self.start_stream_handler(self.xml_root)
- self.xml_depth += 1
- if event == 'end':
- self.xml_depth -= 1
- if self.xml_depth == 0:
- # The stream's root element has closed,
- # terminating the stream.
- log.debug("End of stream received")
- self.abort()
- elif self.xml_depth == 1:
- # A stanza is an XML element that is a direct child of
- # the root element, hence the check of depth == 1
- self._spawn_event(xml)
- if self.xml_root is not None:
- # Keep the root element empty of children to
- # save on memory use.
- self.xml_root.clear()
+ try:
+ for event, xml in self.parser.read_events():
+ if event == 'start':
+ if self.xml_depth == 0:
+ # We have received the start of the root element.
+ self.xml_root = xml
+ log.debug('RECV: %s',
+ highlight(tostring(self.xml_root,
+ xmlns=self.default_ns,
+ stream=self,
+ top_level=True,
+ open_only=True)))
+ self.start_stream_handler(self.xml_root)
+ self.xml_depth += 1
+ if event == 'end':
+ self.xml_depth -= 1
+ if self.xml_depth == 0:
+ # The stream's root element has closed,
+ # terminating the stream.
+ log.debug("End of stream received")
+ self.abort()
+ elif self.xml_depth == 1:
+ # A stanza is an XML element that is a direct child of
+ # the root element, hence the check of depth == 1
+ self._spawn_event(xml)
+ if self.xml_root is not None:
+ # Keep the root element empty of children to
+ # save on memory use.
+ self.xml_root.clear()
+ except ET.ParseError:
+ log.error('Parse error: %r', data)
+
+ # Due to cyclic dependencies, this can’t be imported at the module
+ # level.
+ from slixmpp.stanza.stream_error import StreamError
+ error = StreamError()
+ error['condition'] = 'not-well-formed'
+ error['text'] = 'Server sent: %r' % data
+ self.send(error)
+ self.disconnect()
def is_connected(self):
return self.transport is not None
diff --git a/tests/test_plugins.py b/tests/test_plugins.py
index ee6d44c0..a8cc2744 100644
--- a/tests/test_plugins.py
+++ b/tests/test_plugins.py
@@ -14,21 +14,21 @@ class B(BasePlugin):
class C(BasePlugin):
name = 'c'
- dependencies = set(['b', 'd'])
+ dependencies = {'b', 'd'}
class D(BasePlugin):
name = 'd'
- dependencies = set(['c'])
+ dependencies = {'c'}
class E(BasePlugin):
name = 'e'
- dependencies = set(['a', 'd'])
+ dependencies = {'a', 'd'}
class F(BasePlugin):
name = 'f'
- dependencies = set(['a', 'b'])
+ dependencies = {'a', 'b'}
register_plugin(A)
diff --git a/tests/test_stanza_element.py b/tests/test_stanza_element.py
index 240203cc..89ea0310 100644
--- a/tests/test_stanza_element.py
+++ b/tests/test_stanza_element.py
@@ -43,18 +43,18 @@ class TestElementBase(SlixTest):
class TestStanzaPlugin(ElementBase):
name = "foo2"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
plugin_attrib = "foo2"
class TestSubStanza(ElementBase):
name = "subfoo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
register_stanza_plugin(TestStanza, TestStanzaPlugin, iterable=True)
@@ -90,24 +90,24 @@ class TestElementBase(SlixTest):
class TestStanzaPlugin(ElementBase):
name = "pluginfoo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
plugin_attrib = "plugin_foo"
class TestStanzaPlugin2(ElementBase):
name = "pluginfoo2"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
plugin_attrib = "plugin_foo2"
class TestSubStanza(ElementBase):
name = "subfoo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
register_stanza_plugin(TestStanza, TestSubStanza, iterable=True)
register_stanza_plugin(TestStanza, TestStanzaPlugin)
@@ -139,8 +139,8 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz', 'qux'))
- sub_interfaces = set(('baz',))
+ interfaces = {'bar', 'baz', 'qux'}
+ sub_interfaces = {'baz'}
def get_qux(self):
return 'qux'
@@ -149,7 +149,7 @@ class TestElementBase(SlixTest):
name = "foobar"
namespace = "foo"
plugin_attrib = "foobar"
- interfaces = set(('fizz',))
+ interfaces = {'fizz'}
register_stanza_plugin(TestStanza, TestStanza, iterable=True)
register_stanza_plugin(TestStanza, TestStanzaPlugin)
@@ -185,8 +185,8 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz', 'qux'))
- sub_interfaces = set(('baz',))
+ interfaces = {'bar', 'baz', 'qux'}
+ sub_interfaces = {'baz'}
def set_qux(self, value):
pass
@@ -195,7 +195,7 @@ class TestElementBase(SlixTest):
name = "foobar"
namespace = "foo"
plugin_attrib = "foobar"
- interfaces = set(('foobar',))
+ interfaces = {'foobar'}
register_stanza_plugin(TestStanza, TestStanzaPlugin)
@@ -219,8 +219,8 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz', 'qux'))
- sub_interfaces = set(('bar',))
+ interfaces = {'bar', 'baz', 'qux'}
+ sub_interfaces = {'bar'}
def del_qux(self):
pass
@@ -229,7 +229,7 @@ class TestElementBase(SlixTest):
name = "foobar"
namespace = "foo"
plugin_attrib = "foobar"
- interfaces = set(('foobar',))
+ interfaces = {'foobar'}
register_stanza_plugin(TestStanza, TestStanzaPlugin)
@@ -261,7 +261,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
stanza = TestStanza()
@@ -298,7 +298,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar',))
+ interfaces = {'bar'}
def set_bar(self, value):
wrapper = ET.Element("{foo}wrapper")
@@ -331,7 +331,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
def set_baz(self, value):
self._set_sub_text("wrapper/baz", text=value)
@@ -382,7 +382,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
def set_bar(self, value):
self._set_sub_text("path/to/only/bar", value)
@@ -458,13 +458,13 @@ class TestElementBase(SlixTest):
class TestSubStanza(ElementBase):
name = "sub"
namespace = "baz"
- interfaces = set(('attrib',))
+ interfaces = {'attrib'}
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar','baz', 'qux'))
- sub_interfaces = set(('qux',))
+ interfaces = {'bar','baz', 'qux'}
+ sub_interfaces = {'qux'}
def set_qux(self, value):
self._set_sub_text('qux', text=value)
@@ -475,7 +475,7 @@ class TestElementBase(SlixTest):
class TestStanzaPlugin(ElementBase):
name = "plugin"
namespace = "http://test/slash/bar"
- interfaces = set(('attrib',))
+ interfaces = {'attrib'}
register_stanza_plugin(TestStanza, TestSubStanza, iterable=True)
register_stanza_plugin(TestStanza, TestStanzaPlugin)
@@ -528,7 +528,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
stanza1 = TestStanza()
stanza1['bar'] = 'a'
@@ -554,19 +554,19 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
plugin_attrib = 'qux'
register_stanza_plugin(TestStanza, TestStanza)
stanza = TestStanza()
- self.failUnless(set(stanza.keys()) == set(('lang', 'bar', 'baz')),
+ self.failUnless(set(stanza.keys()) == {'lang', 'bar', 'baz'},
"Returned set of interface keys does not match expected.")
stanza.enable('qux')
- self.failUnless(set(stanza.keys()) == set(('lang', 'bar', 'baz', 'qux')),
+ self.failUnless(set(stanza.keys()) == {'lang', 'bar', 'baz', 'qux'},
"Incorrect set of interface and plugin keys.")
def testGet(self):
@@ -575,7 +575,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
stanza = TestStanza()
stanza['bar'] = 'a'
@@ -592,12 +592,12 @@ class TestElementBase(SlixTest):
class TestSubStanza(ElementBase):
name = "foobar"
namespace = "foo"
- interfaces = set(('qux',))
+ interfaces = {'qux'}
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
register_stanza_plugin(TestStanza, TestSubStanza, iterable=True)
@@ -652,7 +652,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
stanza1 = TestStanza()
stanza1['bar'] = 'a'
@@ -672,13 +672,13 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
class TestExtension(ElementBase):
name = 'extended'
namespace = 'foo'
plugin_attrib = name
- interfaces = set((name,))
+ interfaces = {name}
is_extension = True
def set_extended(self, value):
@@ -715,13 +715,13 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(('bar', 'baz'))
+ interfaces = {'bar', 'baz'}
class TestOverride(ElementBase):
name = 'overrider'
namespace = 'foo'
plugin_attrib = name
- interfaces = set(('bar',))
+ interfaces = {'bar'}
overrides = ['set_bar']
def setup(self, xml):
@@ -754,7 +754,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = "foo"
namespace = "foo"
- interfaces = set(['bar'])
+ interfaces = {'bar'}
bool_interfaces = interfaces
stanza = TestStanza()
@@ -946,7 +946,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['test'])
+ interfaces = {'test'}
sub_interfaces = interfaces
lang_interfaces = interfaces
@@ -972,7 +972,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['test'])
+ interfaces = {'test'}
sub_interfaces = interfaces
lang_interfaces = interfaces
@@ -1008,7 +1008,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['test'])
+ interfaces = {'test'}
sub_interfaces = interfaces
lang_interfaces = interfaces
@@ -1040,7 +1040,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['test'])
+ interfaces = {'test'}
sub_interfaces = interfaces
lang_interfaces = interfaces
@@ -1096,7 +1096,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['test'])
+ interfaces = {'test'}
sub_interfaces = interfaces
lang_interfaces = interfaces
@@ -1136,7 +1136,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['test'])
+ interfaces = {'test'}
sub_interfaces = interfaces
lang_interfaces = interfaces
@@ -1177,7 +1177,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['test'])
+ interfaces = {'test'}
sub_interfaces = interfaces
lang_interfaces = interfaces
@@ -1217,7 +1217,7 @@ class TestElementBase(SlixTest):
class TestStanza(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['test'])
+ interfaces = {'test'}
sub_interfaces = interfaces
lang_interfaces = interfaces
diff --git a/tests/test_stanza_xep_0030.py b/tests/test_stanza_xep_0030.py
index d8e99ffb..d85f1980 100644
--- a/tests/test_stanza_xep_0030.py
+++ b/tests/test_stanza_xep_0030.py
@@ -254,10 +254,10 @@ class TestDisco(SlixTest):
iq['disco_info'].add_identity('client', 'pc', lang='en')
iq['disco_info'].add_identity('client', 'pc', lang='fr')
- expected = set([('client', 'pc', None, None),
- ('client', 'pc', 'no', None),
- ('client', 'pc', 'en', None),
- ('client', 'pc', 'fr', None)])
+ expected = {('client', 'pc', None, None),
+ ('client', 'pc', 'no', None),
+ ('client', 'pc', 'en', None),
+ ('client', 'pc', 'fr', None)}
self.failUnless(iq['disco_info']['identities'] == expected,
"Identities do not match:\n%s\n%s" % (
expected,
@@ -274,7 +274,7 @@ class TestDisco(SlixTest):
iq['disco_info'].add_identity('client', 'pc', lang='en')
iq['disco_info'].add_identity('client', 'pc', lang='fr')
- expected = set([('client', 'pc', 'no', None)])
+ expected = {('client', 'pc', 'no', None)}
result = iq['disco_info'].get_identities(lang='no')
self.failUnless(result == expected,
"Identities do not match:\n%s\n%s" % (
@@ -336,7 +336,7 @@ class TestDisco(SlixTest):
iq['disco_info'].add_feature('bar')
iq['disco_info'].add_feature('baz')
- expected = set(['foo', 'bar', 'baz'])
+ expected = {'foo', 'bar', 'baz'}
self.failUnless(iq['disco_info']['features'] == expected,
"Features do not match:\n%s\n%s" % (
expected,
@@ -472,9 +472,9 @@ class TestDisco(SlixTest):
node='bar',
name='Tester')
- expected = set([('user@localhost', None, None),
- ('user@localhost', 'foo', None),
- ('test@localhost', 'bar', 'Tester')])
+ expected = {('user@localhost', None, None),
+ ('user@localhost', 'foo', None),
+ ('test@localhost', 'bar', 'Tester')}
self.failUnless(iq['disco_items']['items'] == expected,
"Items do not match:\n%s\n%s" % (
expected,
diff --git a/tests/test_stanza_xep_0050.py b/tests/test_stanza_xep_0050.py
index 7272d783..0898b136 100644
--- a/tests/test_stanza_xep_0050.py
+++ b/tests/test_stanza_xep_0050.py
@@ -51,7 +51,7 @@ class TestAdHocCommandStanzas(SlixTest):
iq['command']['actions'] = ['prev', 'next']
results = iq['command']['actions']
- expected = set(['prev', 'next'])
+ expected = {'prev', 'next'}
self.assertEqual(results, expected,
"Incorrect next actions: %s" % results)
diff --git a/tests/test_stanza_xep_0300.py b/tests/test_stanza_xep_0300.py
new file mode 100644
index 00000000..5ffd8e3b
--- /dev/null
+++ b/tests/test_stanza_xep_0300.py
@@ -0,0 +1,57 @@
+"""
+ Slixmpp: The Slick XMPP Library
+ Copyright (C) 2017 Emmanuel Gil Peyrot
+ This file is part of Slixmpp.
+
+ See the file LICENSE for copying permission.
+"""
+
+import unittest
+from slixmpp import Iq
+from slixmpp.test import SlixTest
+from slixmpp.plugins.xep_0300 import Hash
+from slixmpp.xmlstream import register_stanza_plugin
+
+
+class TestHash(SlixTest):
+
+ def setUp(self):
+ register_stanza_plugin(Iq, Hash)
+
+ def testSimpleElement(self):
+ """Test that the element is created correctly."""
+ iq = Iq()
+ iq['type'] = 'set'
+ iq['hash']['algo'] = 'sha-256'
+ iq['hash']['value'] = 'EQgS9n+h4fARf289cCQcGkKnsHcRqTwkd8xRbZBC+ds='
+
+ self.check(iq, """
+ <iq type="set">
+ <hash xmlns="urn:xmpp:hashes:2" algo="sha-256">EQgS9n+h4fARf289cCQcGkKnsHcRqTwkd8xRbZBC+ds=</hash>
+ </iq>
+ """)
+
+ def testInvalidAlgo(self):
+ """Test that invalid algos raise an exception."""
+ iq = Iq()
+ iq['type'] = 'set'
+ try:
+ iq['hash']['algo'] = 'coucou'
+ except ValueError:
+ pass
+ else:
+ raise self.failureException
+
+ #def testDisabledAlgo(self):
+ # """Test that disabled algos aren’t used."""
+ # iq = Iq()
+ # iq['type'] = 'set'
+ # try:
+ # iq['hash']['algo'] = 'sha-1'
+ # except ValueError:
+ # pass
+ # else:
+ # raise self.failureException
+
+
+suite = unittest.TestLoader().loadTestsFromTestCase(TestHash)
diff --git a/tests/test_stanza_xep_0380.py b/tests/test_stanza_xep_0380.py
new file mode 100644
index 00000000..9ed349bf
--- /dev/null
+++ b/tests/test_stanza_xep_0380.py
@@ -0,0 +1,37 @@
+import unittest
+from slixmpp import Message
+from slixmpp.test import SlixTest
+import slixmpp.plugins.xep_0380 as xep_0380
+from slixmpp.xmlstream import register_stanza_plugin
+
+
+class TestEME(SlixTest):
+
+ def setUp(self):
+ register_stanza_plugin(Message, xep_0380.stanza.Encryption)
+
+ def testCreateEME(self):
+ """Testing creating EME."""
+
+ xmlstring = """
+ <message>
+ <encryption xmlns="urn:xmpp:eme:0" namespace="%s"%s />
+ </message>
+ """
+
+ msg = self.Message()
+ self.check(msg, "<message />")
+
+ msg['eme']['namespace'] = 'urn:xmpp:otr:0'
+ self.check(msg, xmlstring % ('urn:xmpp:otr:0', ''))
+
+ msg['eme']['namespace'] = 'urn:xmpp:openpgp:0'
+ self.check(msg, xmlstring % ('urn:xmpp:openpgp:0', ''))
+
+ msg['eme']['name'] = 'OX'
+ self.check(msg, xmlstring % ('urn:xmpp:openpgp:0', ' name="OX"'))
+
+ del msg['eme']
+ self.check(msg, "<message />")
+
+suite = unittest.TestLoader().loadTestsFromTestCase(TestEME)
diff --git a/tests/test_stream_presence.py b/tests/test_stream_presence.py
index ea2337a2..caf3fef9 100644
--- a/tests/test_stream_presence.py
+++ b/tests/test_stream_presence.py
@@ -38,7 +38,7 @@ class TestStreamPresence(SlixTest):
to="tester@localhost"/>
""")
- self.assertEqual(events, set(('unavailable',)),
+ self.assertEqual(events, {'unavailable'},
"Got offline incorrectly triggered: %s." % events)
def testGotOffline(self):
@@ -102,7 +102,7 @@ class TestStreamPresence(SlixTest):
to="tester@localhost" />
""")
- expected = set(('presence_available', 'got_online'))
+ expected = {'presence_available', 'got_online'}
self.assertEqual(events, expected,
"Incorrect events triggered: %s" % events)
@@ -151,7 +151,7 @@ class TestStreamPresence(SlixTest):
type="subscribe" />
""")
- expected = set(('presence_subscribe', 'changed_subscription'))
+ expected = {'presence_subscribe', 'changed_subscription'}
self.assertEqual(events, expected,
"Incorrect events triggered: %s" % events)
@@ -185,7 +185,7 @@ class TestStreamPresence(SlixTest):
type="unsubscribed" />
""")
- expected = set(('presence_subscribe', 'changed_subscription'))
+ expected = {'presence_subscribe', 'changed_subscription'}
self.assertEqual(events, expected,
"Incorrect events triggered: %s" % events)
diff --git a/tests/test_stream_xep_0030.py b/tests/test_stream_xep_0030.py
index 1d6337d5..d1ad9087 100644
--- a/tests/test_stream_xep_0030.py
+++ b/tests/test_stream_xep_0030.py
@@ -307,7 +307,7 @@ class TestStreamDisco(SlixTest):
</iq>
""")
- self.assertEqual(events, set(('disco_info',)),
+ self.assertEqual(events, {'disco_info'},
"Disco info event was not triggered: %s" % events)
def testDynamicItemsJID(self):
@@ -502,9 +502,9 @@ class TestStreamDisco(SlixTest):
</iq>
""")
- items = set([('user@localhost', 'bar', 'Test'),
- ('user@localhost', 'baz', 'Test 2')])
- self.assertEqual(events, set(('disco_items',)),
+ items = {('user@localhost', 'bar', 'Test'),
+ ('user@localhost', 'baz', 'Test 2')}
+ self.assertEqual(events, {'disco_items'},
"Disco items event was not triggered: %s" % events)
self.assertEqual(results, items,
"Unexpected items: %s" % results)
diff --git a/tests/test_stream_xep_0047.py b/tests/test_stream_xep_0047.py
index ecba2445..a0e6c227 100644
--- a/tests/test_stream_xep_0047.py
+++ b/tests/test_stream_xep_0047.py
@@ -77,7 +77,7 @@ class TestInBandByteStreams(SlixTest):
from="tester@localhost/receiver" />
""")
- self.assertEqual(events, set(['ibb_stream_start', 'callback']))
+ self.assertEqual(events, {'ibb_stream_start', 'callback'})
@asyncio.coroutine
def testSendData(self):
diff --git a/tests/test_stream_xep_0050.py b/tests/test_stream_xep_0050.py
index 65b5f678..d1a94ecc 100644
--- a/tests/test_stream_xep_0050.py
+++ b/tests/test_stream_xep_0050.py
@@ -25,7 +25,7 @@ class TestAdHocCommands(SlixTest):
class TestPayload(ElementBase):
name = 'foo'
namespace = 'test'
- interfaces = set(['bar'])
+ interfaces = {'bar'}
plugin_attrib = name
Command = self.xmpp['xep_0050'].stanza.Command