diff options
author | Philipp Hörist <philipp@hoerist.com> | 2019-11-27 01:07:48 +0300 |
---|---|---|
committer | Philipp Hörist <philipp@hoerist.com> | 2019-11-27 01:07:48 +0300 |
commit | dc337d8c124047863696057a757f6882cdade6fc (patch) | |
tree | 30814404b3cb2041e11a02b8bde1c9ec4e376949 | |
parent | f28ff1dfa193c458ff9d13f3d743ae971fc05b11 (diff) |
Register: Add change_password()
-rw-r--r-- | nbxmpp/modules/register.py | 33 | ||||
-rw-r--r-- | nbxmpp/structs.py | 2 | ||||
-rw-r--r-- | nbxmpp/util.py | 16 |
3 files changed, 51 insertions, 0 deletions
diff --git a/nbxmpp/modules/register.py b/nbxmpp/modules/register.py index 06fb848..35d3ff0 100644 --- a/nbxmpp/modules/register.py +++ b/nbxmpp/modules/register.py @@ -24,9 +24,11 @@ from nbxmpp.protocol import Iq from nbxmpp.protocol import isResultNode from nbxmpp.structs import CommonResult from nbxmpp.structs import RegisterData +from nbxmpp.structs import ChangePasswordResult from nbxmpp.util import call_on_response from nbxmpp.util import callback from nbxmpp.util import raise_error +from nbxmpp.util import get_form from nbxmpp.const import REGISTER_FIELDS from nbxmpp.modules.bits_of_binary import parse_bob_data from nbxmpp.modules.dataforms import extend_form @@ -119,3 +121,34 @@ class Register: fields.append(create_field(typ='hidden', var='fakeform')) return SimpleDataForm(type_='form', fields=fields) + + @call_on_response('_on_password_change') + def change_password(self, password): + hostname = self._client.get_bound_jid().getDomain() + username = self._client.get_bound_jid().getNode() + iq = Iq('set', NS_REGISTER, to=hostname) + query = iq.getQuery() + query.setTagData('username', username) + query.setTagData('password', password) + return iq + + @callback + def _on_password_change(self, stanza): + if isResultNode(stanza): + return ChangePasswordResult(successful=True) + + if stanza.getQuery() is None: + return raise_error(log.info, stanza) + + form = get_form(stanza.getQuery(), + 'jabber:iq:register:changepassword') + if form is None: + return raise_error(log.info, stanza) + return ChangePasswordResult(successful=False, form=form) + + @call_on_response('_default_response') + def change_password_with_form(self, form): + hostname = self._client.get_bound_jid().getDomain() + iq = Iq('set', NS_REGISTER, to=hostname) + iq.setQueryPayload(form) + return iq diff --git a/nbxmpp/structs.py b/nbxmpp/structs.py index ffe70db..52691c3 100644 --- a/nbxmpp/structs.py +++ b/nbxmpp/structs.py @@ -133,6 +133,8 @@ SecurityLabel = namedtuple('SecurityLabel', 'displaymarking') RegisterData = namedtuple('RegisterData', 'instructions form fields_form oob_url bob_data') +ChangePasswordResult = namedtuple('ChangePasswordResult', 'successful form') +ChangePasswordResult.__new__.__defaults__ = (None,) class DiscoInfo(namedtuple('DiscoInfo', 'stanza identities features dataforms timestamp')): diff --git a/nbxmpp/util.py b/nbxmpp/util.py index 25311d8..2abe79a 100644 --- a/nbxmpp/util.py +++ b/nbxmpp/util.py @@ -321,3 +321,19 @@ def compute_caps_hash(info, compare=True): def generate_id(): return str(uuid.uuid4()) + + +def get_form(stanza, form_type): + forms = stanza.getTags('x', namespace=NS_DATA) + if not forms: + return None + + for form in forms: + form = extend_form(node=form) + field = form.vars.get('FORM_TYPE') + if field is None: + continue + + if field.value == form_type: + return form + return None |