2 Slixmpp: The Slick XMPP Library
3 Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
4 This file is part of Slixmpp.
6 See the file LICENSE for copying permission.
12 from slixmpp
.stanza
import StreamFeatures
, Iq
13 from slixmpp
.xmlstream
import register_stanza_plugin
, JID
14 from slixmpp
.plugins
import BasePlugin
15 from slixmpp
.plugins
.xep_0077
import stanza
, Register
, RegisterFeature
18 log
= logging
.getLogger(__name__
)
21 class XEP_0077(BasePlugin
):
24 XEP-0077: In-Band Registration
28 description
= 'XEP-0077: In-Band Registration'
29 dependencies
= set(['xep_0004', 'xep_0066'])
32 'create_account': True,
33 'force_registration': False,
37 def plugin_init(self
):
38 register_stanza_plugin(StreamFeatures
, RegisterFeature
)
39 register_stanza_plugin(Iq
, Register
)
41 if not self
.xmpp
.is_component
:
42 self
.xmpp
.register_feature('register',
43 self
._handle
_register
_feature
,
47 register_stanza_plugin(Register
, self
.xmpp
['xep_0004'].stanza
.Form
)
48 register_stanza_plugin(Register
, self
.xmpp
['xep_0066'].stanza
.OOB
)
50 self
.xmpp
.add_event_handler('connected', self
._force
_registration
)
53 if not self
.xmpp
.is_component
:
54 self
.xmpp
.unregister_feature('register', self
.order
)
56 def _force_registration(self
, event
):
57 if self
.force_registration
:
58 self
.xmpp
.add_filter('in', self
._force
_stream
_feature
)
60 def _force_stream_feature(self
, stanza
):
61 if isinstance(stanza
, StreamFeatures
):
62 if self
.xmpp
.use_tls
or self
.xmpp
.use_ssl
:
63 if 'starttls' not in self
.xmpp
.features
:
65 elif not isinstance(self
.xmpp
.socket
, ssl
.SSLSocket
):
67 if 'mechanisms' not in self
.xmpp
.features
:
68 log
.debug('Forced adding in-band registration stream feature')
69 stanza
.enable('register')
70 self
.xmpp
.del_filter('in', self
._force
_stream
_feature
)
73 def _handle_register_feature(self
, features
):
74 if 'mechanisms' in self
.xmpp
.features
:
75 # We have already logged in with an account
78 if self
.create_account
and self
.xmpp
.event_handled('register'):
79 form
= self
.get_registration()
80 self
.xmpp
.event('register', form
, direct
=True)
84 def get_registration(self
, jid
=None, ifrom
=None, block
=True,
85 timeout
=None, callback
=None):
91 return iq
.send(block
=block
, timeout
=timeout
,
92 callback
=callback
, now
=True)
94 def cancel_registration(self
, jid
=None, ifrom
=None, block
=True,
95 timeout
=None, callback
=None):
100 iq
['register']['remove'] = True
101 return iq
.send(block
=block
, timeout
=timeout
, callback
=callback
)
103 def change_password(self
, password
, jid
=None, ifrom
=None, block
=True,
104 timeout
=None, callback
=None):
109 if self
.xmpp
.is_component
:
111 iq
['register']['username'] = ifrom
.user
113 iq
['register']['username'] = self
.xmpp
.boundjid
.user
114 iq
['register']['password'] = password
115 return iq
.send(block
=block
, timeout
=timeout
, callback
=callback
)