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
diff options
context:
space:
mode:
authorPhilipp Hörist <philipp@hoerist.com>2019-11-25 00:10:10 +0300
committerPhilipp Hörist <philipp@hoerist.com>2019-11-25 00:10:10 +0300
commitf28ff1dfa193c458ff9d13f3d743ae971fc05b11 (patch)
treede254216142f7de22b5fba9d931034a0e60b0251 /nbxmpp/modules
parentdab91c3dcd5022ba78aedbf95f990a407a0d7157 (diff)
Register: Add request_register_form()
Diffstat (limited to 'nbxmpp/modules')
-rw-r--r--nbxmpp/modules/register.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/nbxmpp/modules/register.py b/nbxmpp/modules/register.py
index 47c796c..06fb848 100644
--- a/nbxmpp/modules/register.py
+++ b/nbxmpp/modules/register.py
@@ -17,13 +17,21 @@
import logging
+from nbxmpp.protocol import NS_X_OOB
+from nbxmpp.protocol import NS_DATA
from nbxmpp.protocol import NS_REGISTER
from nbxmpp.protocol import Iq
from nbxmpp.protocol import isResultNode
from nbxmpp.structs import CommonResult
+from nbxmpp.structs import RegisterData
from nbxmpp.util import call_on_response
from nbxmpp.util import callback
from nbxmpp.util import raise_error
+from nbxmpp.const import REGISTER_FIELDS
+from nbxmpp.modules.bits_of_binary import parse_bob_data
+from nbxmpp.modules.dataforms import extend_form
+from nbxmpp.modules.dataforms import create_field
+from nbxmpp.modules.dataforms import SimpleDataForm
log = logging.getLogger('nbxmpp.m.register')
@@ -42,8 +50,72 @@ class Register:
query.addChild('remove')
return iq
+ @call_on_response('_on_register_form')
+ def request_register_form(self, jid=None):
+ if jid is None:
+ jid = self._client.Server
+ return Iq('get', NS_REGISTER, to=jid)
+
+ @callback
+ def _on_register_form(self, stanza):
+ query = stanza.getQuery()
+
+ instructions = query.getTagData('instructions') or None
+
+ return RegisterData(instructions=instructions,
+ form=self._parse_form(stanza),
+ fields_form=self._parse_fields_form(query),
+ oob_url=self._parse_oob_url(query),
+ bob_data=parse_bob_data(query))
+
@callback
def _default_response(self, stanza):
if not isResultNode(stanza):
return raise_error(log.info, stanza)
return CommonResult(jid=stanza.getFrom())
+
+ @staticmethod
+ def _parse_oob_url(query):
+ oob = query.getTag('x', namespace=NS_X_OOB)
+ if oob is not None:
+ return oob.getTagData('url') or None
+ return None
+
+ @staticmethod
+ def _parse_form(stanza):
+ form = stanza.getQuery().getTag('x', namespace=NS_DATA)
+ if form is None:
+ return None
+
+ form = extend_form(node=form)
+ field = form.vars.get('FORM_TYPE')
+ if field is None:
+ log.warning('No FORM_TYPE found')
+ log.warning(stanza)
+ return None
+
+ # Invalid urn:xmpp:captcha used by ejabberd
+ # See https://github.com/processone/ejabberd/issues/3093
+ if field.value in ('jabber:iq:register', 'urn:xmpp:captcha'):
+ return form
+ return None
+
+ @staticmethod
+ def _parse_fields_form(query):
+ fields = []
+ for field in query.getChildren():
+ field_name = field.getName()
+ if field_name not in REGISTER_FIELDS:
+ continue
+
+ required = field_name in ('username', 'password')
+ typ = 'text-single' if field_name != 'password' else 'text-private'
+ fields.append(create_field(typ=typ,
+ var=field_name,
+ required=required))
+
+ if not fields:
+ return None
+
+ fields.append(create_field(typ='hidden', var='fakeform'))
+ return SimpleDataForm(type_='form', fields=fields)