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