Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/python-nbxmpp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/nbxmpp
diff options
context:
space:
mode:
authorPhilipp Hörist <philipp@hoerist.com>2019-11-27 01:07:48 +0300
committerPhilipp Hörist <philipp@hoerist.com>2019-11-27 01:07:48 +0300
commitdc337d8c124047863696057a757f6882cdade6fc (patch)
tree30814404b3cb2041e11a02b8bde1c9ec4e376949 /nbxmpp
parentf28ff1dfa193c458ff9d13f3d743ae971fc05b11 (diff)
Register: Add change_password()
Diffstat (limited to 'nbxmpp')
-rw-r--r--nbxmpp/modules/register.py33
-rw-r--r--nbxmpp/structs.py2
-rw-r--r--nbxmpp/util.py16
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