Add basic start for a client side XEP-0077 plugin.
This commit is contained in:
10
sleekxmpp/plugins/xep_0077/__init__.py
Normal file
10
sleekxmpp/plugins/xep_0077/__init__.py
Normal file
@@ -0,0 +1,10 @@
|
||||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
from sleekxmpp.plugins.xep_0077.stanza import Register, RegisterFeature
|
||||
from sleekxmpp.plugins.xep_0077.register import xep_0077
|
95
sleekxmpp/plugins/xep_0077/register.py
Normal file
95
sleekxmpp/plugins/xep_0077/register.py
Normal file
@@ -0,0 +1,95 @@
|
||||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
import sleekxmpp
|
||||
from sleekxmpp.stanza import StreamFeatures, Iq
|
||||
from sleekxmpp.xmlstream import register_stanza_plugin, JID
|
||||
from sleekxmpp.plugins.base import base_plugin
|
||||
from sleekxmpp.plugins.xep_0077 import stanza, Register, RegisterFeature
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class xep_0077(base_plugin):
|
||||
|
||||
"""
|
||||
XEP-0077: In-Band Registration
|
||||
"""
|
||||
|
||||
def plugin_init(self):
|
||||
self.xep = '0077'
|
||||
self.description = 'In-Band Registration'
|
||||
self.stanza = stanza
|
||||
|
||||
self.create_account = self.config.get('create_account', True)
|
||||
|
||||
register_stanza_plugin(StreamFeatures, RegisterFeature)
|
||||
register_stanza_plugin(Iq, Register)
|
||||
|
||||
|
||||
if self.xmpp.is_component:
|
||||
pass
|
||||
else:
|
||||
self.xmpp.register_feature('register',
|
||||
self._handle_register_feature,
|
||||
restart=False,
|
||||
order=self.config.get('order', 50))
|
||||
|
||||
def post_init(self):
|
||||
base_plugin.post_init(self)
|
||||
if 'xep_0004' in self.xmpp.plugin:
|
||||
register_stanza_plugin(Register, self.xmpp['xep_0004'].stanza.Form)
|
||||
|
||||
if 'xep_0066' in self.xmpp.plugin:
|
||||
register_stanza_plugin(Register, self.xmpp['xep_0066'].stanza.OOB)
|
||||
|
||||
def _handle_register_feature(self, features):
|
||||
if 'mechanisms' in self.xmpp.features:
|
||||
# We have already logged in with an account
|
||||
return False
|
||||
|
||||
if self.create_account:
|
||||
form = self.get_registration()
|
||||
self.xmpp.event('register', form, direct=True)
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_registration(self, jid=None, ifrom=None, block=True,
|
||||
timeout=None, callback=None):
|
||||
iq = self.xmpp.Iq()
|
||||
iq['type'] = 'get'
|
||||
iq['to'] = jid
|
||||
iq['from'] = ifrom
|
||||
iq.enable('register')
|
||||
return iq.send(block=block, timeout=timeout, callback=callback, now=True)
|
||||
|
||||
def cancel_registration(self, jid=None, ifrom=None, block=True,
|
||||
timeout=None, callback=None):
|
||||
iq = self.xmpp.Iq()
|
||||
iq['type'] = 'set'
|
||||
iq['to'] = jid
|
||||
iq['from'] = ifrom
|
||||
iq['register']['remove'] = True
|
||||
return iq.send(block=block, timeout=timeout, callback=callback)
|
||||
|
||||
def change_password(self, password, jid=None, ifrom=None, block=True,
|
||||
timeout=None, callback=None):
|
||||
iq= self.xmpp.Iq()
|
||||
iq['type'] = 'set'
|
||||
iq['to'] = jid
|
||||
iq['from'] = ifrom
|
||||
if self.xmpp.is_component:
|
||||
ifrom = JID(ifrom)
|
||||
iq['register']['username'] = ifrom.user
|
||||
else:
|
||||
iq['register']['username'] = self.xmpp.boundjid.user
|
||||
iq['register']['password'] = password
|
||||
return iq.send(block=block, timeout=timeout, callback=callback)
|
73
sleekxmpp/plugins/xep_0077/stanza.py
Normal file
73
sleekxmpp/plugins/xep_0077/stanza.py
Normal file
@@ -0,0 +1,73 @@
|
||||
"""
|
||||
SleekXMPP: The Sleek XMPP Library
|
||||
Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
|
||||
This file is part of SleekXMPP.
|
||||
|
||||
See the file LICENSE for copying permission.
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from sleekxmpp.xmlstream import ElementBase, ET
|
||||
|
||||
|
||||
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'))
|
||||
sub_interfaces = interfaces
|
||||
form_fields = set(('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)
|
||||
return present is not None
|
||||
|
||||
def get_remove(self):
|
||||
present = self.xml.find('{%s}remove' % self.namespace)
|
||||
return present is not None
|
||||
|
||||
def set_registered(self, value):
|
||||
if value:
|
||||
self.add_field('registered')
|
||||
else:
|
||||
del self['registered']
|
||||
|
||||
def set_remove(self, value):
|
||||
if value:
|
||||
self.add_field('remove')
|
||||
else:
|
||||
del self['remove']
|
||||
|
||||
def add_field(self, value):
|
||||
self._set_sub_text(value, '', keep=True)
|
||||
|
||||
def get_fields(self):
|
||||
fields = set()
|
||||
for field in self.form_fields:
|
||||
if self.xml.find('{%s}%s' % (self.namespace, field)) is not None:
|
||||
fields.add(field)
|
||||
return fields
|
||||
|
||||
def set_fields(self, fields):
|
||||
del self['fields']
|
||||
for field in fields:
|
||||
self._set_sub_text(field, '', keep=True)
|
||||
|
||||
def del_fields(self):
|
||||
for field in self.form_fields:
|
||||
self._del_sub(field)
|
||||
|
||||
|
||||
class RegisterFeature(ElementBase):
|
||||
|
||||
name = 'register'
|
||||
namespace = 'http://jabber.org/features/iq-register'
|
||||
plugin_attrib = name
|
||||
interfaces = set()
|
Reference in New Issue
Block a user