summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2013-02-08 09:34:26 -0800
committerLance Stout <lancestout@gmail.com>2013-02-08 09:36:51 -0800
commit79914fb56ba68153f2fcf779bf7be0be4e25f0a7 (patch)
treeb888be8dd63232186e58fb0ffb5a19dfa70657e9
parent9165cbf7f6839ee8ba2a4514b297f27fb019098a (diff)
downloadslixmpp-79914fb56ba68153f2fcf779bf7be0be4e25f0a7.tar.gz
slixmpp-79914fb56ba68153f2fcf779bf7be0be4e25f0a7.tar.bz2
slixmpp-79914fb56ba68153f2fcf779bf7be0be4e25f0a7.tar.xz
slixmpp-79914fb56ba68153f2fcf779bf7be0be4e25f0a7.zip
Add option to XEP-0077 plugin to force registration attempts.
-rw-r--r--examples/register_account.py8
-rw-r--r--sleekxmpp/plugins/xep_0077/register.py21
2 files changed, 27 insertions, 2 deletions
diff --git a/examples/register_account.py b/examples/register_account.py
index bd9b1160..2badef64 100644
--- a/examples/register_account.py
+++ b/examples/register_account.py
@@ -51,7 +51,7 @@ class RegisterBot(sleekxmpp.ClientXMPP):
# The register event provides an Iq result stanza with
# a registration form from the server. This may include
- # the basic registration fields, a data form, an
+ # the basic registration fields, a data form, an
# out-of-band URL, or any combination. For more advanced
# cases, you will need to examine the fields provided
# and respond accordingly. SleekXMPP provides plugins
@@ -104,7 +104,7 @@ class RegisterBot(sleekxmpp.ClientXMPP):
resp.send(now=True)
logging.info("Account created for %s!" % self.boundjid)
except IqError as e:
- logging.error("Could not register account: %s" %
+ logging.error("Could not register account: %s" %
e.iq['error']['text'])
self.disconnect()
except IqTimeout:
@@ -153,6 +153,10 @@ if __name__ == '__main__':
xmpp.register_plugin('xep_0066') # Out-of-band Data
xmpp.register_plugin('xep_0077') # In-band Registration
+ # Some servers don't advertise support for inband registration, even
+ # though they allow it. If this applies to your server, use:
+ # xmpp['xep_0077'].force_registration = True
+
# If you are working with an OpenFire server, you may need
# to adjust the SSL version used:
# xmpp.ssl_version = ssl.PROTOCOL_SSLv3
diff --git a/sleekxmpp/plugins/xep_0077/register.py b/sleekxmpp/plugins/xep_0077/register.py
index d4da21a5..ee07548b 100644
--- a/sleekxmpp/plugins/xep_0077/register.py
+++ b/sleekxmpp/plugins/xep_0077/register.py
@@ -7,6 +7,7 @@
"""
import logging
+import ssl
from sleekxmpp.stanza import StreamFeatures, Iq
from sleekxmpp.xmlstream import register_stanza_plugin, JID
@@ -29,6 +30,7 @@ class XEP_0077(BasePlugin):
stanza = stanza
default_config = {
'create_account': True,
+ 'force_registration': False,
'order': 50
}
@@ -45,10 +47,29 @@ class XEP_0077(BasePlugin):
register_stanza_plugin(Register, self.xmpp['xep_0004'].stanza.Form)
register_stanza_plugin(Register, self.xmpp['xep_0066'].stanza.OOB)
+ self.xmpp.add_event_handler('connected', self._force_registration)
+
def plugin_end(self):
if not self.xmpp.is_component:
self.xmpp.unregister_feature('register', self.order)
+ def _force_registration(self, event):
+ if self.force_registration:
+ self.xmpp.add_filter('in', self._force_stream_feature)
+
+ def _force_stream_feature(self, stanza):
+ if isinstance(stanza, StreamFeatures):
+ if self.xmpp.use_tls or self.xmpp.use_ssl:
+ if 'starttls' not in self.xmpp.features:
+ return stanza
+ elif not isinstance(self.xmpp.socket, ssl.SSLSocket):
+ return stanza
+ if 'mechanisms' not in self.xmpp.features:
+ log.debug('Forced adding in-band registration stream feature')
+ stanza.enable('register')
+ self.xmpp.del_filter('in', self._force_stream_feature)
+ return stanza
+
def _handle_register_feature(self, features):
if 'mechanisms' in self.xmpp.features:
# We have already logged in with an account