Add basic start for a client side XEP-0077 plugin.

This commit is contained in:
Lance Stout
2012-01-19 02:37:36 -08:00
parent b25668b5b7
commit 02f4006153
5 changed files with 354 additions and 0 deletions

View 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

View 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)

View 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()