From 1d2092e35f2292218889fa8336d0d6d838f0aa44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20=E2=80=9Cpep=E2=80=9D=20Buquet?= Date: Mon, 20 Aug 2018 00:08:56 +0100 Subject: [PATCH] IBR: Initial attempt, doesn't work MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maxime “pep” Buquet --- poezio/connection.py | 66 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/poezio/connection.py b/poezio/connection.py index 57254069..d7bccd74 100644 --- a/poezio/connection.py +++ b/poezio/connection.py @@ -11,6 +11,7 @@ Defines the Connection class import logging log = logging.getLogger(__name__) +import asyncio import getpass import subprocess import sys @@ -22,6 +23,7 @@ from slixmpp.xmlstream import ET from slixmpp.plugins.xep_0184 import XEP_0184 from slixmpp.plugins.xep_0030 import DiscoInfo from slixmpp.util import FileSystemCache +from slixmpp.exceptions import IqError, IqTimeout from poezio import common from poezio import fixes @@ -48,6 +50,7 @@ class Connection(slixmpp.ClientXMPP): rng.getrandbits(24).to_bytes(3, 'little')).decode('ascii') config.set_and_save('device_id', device_id) + ibr = False if config.get('jid'): # Field used to know if we are anonymous or not. # many features will be handled differently @@ -77,24 +80,37 @@ class Connection(slixmpp.ClientXMPP): sys.exit(code) password = process.stdout.readline().decode('utf-8').strip( '\n') - else: # anonymous auth + elif config.get('server'): # anonymous auth self.anon = True jid = config.get('server') password = None + else: # IBR + self.wait_ibr = True + ibr = True + self.anon = False + jid = None + password = None + + if ibr: + # Display IBR form, make user choose domain. fill jid + jid = "buquet.me" + jid = safeJID(jid) - jid.resource = '%s-%s' % ( - jid.resource, - device_id) if jid.resource else 'poezio-%s' % device_id + if not ibr: + jid.resource = '%s-%s' % ( + jid.resource, + device_id) if jid.resource else 'poezio-%s' % device_id # TODO: use the system language slixmpp.ClientXMPP.__init__( self, jid, password, lang=config.get('lang')) - force_encryption = config.get('force_encryption') - if force_encryption: - self['feature_mechanisms'].unencrypted_plain = False - self['feature_mechanisms'].unencrypted_digest = False - self['feature_mechanisms'].unencrypted_cram = False - self['feature_mechanisms'].unencrypted_scram = False + if not ibr: + force_encryption = config.get('force_encryption') + if force_encryption: + self['feature_mechanisms'].unencrypted_plain = False + self['feature_mechanisms'].unencrypted_digest = False + self['feature_mechanisms'].unencrypted_cram = False + self['feature_mechanisms'].unencrypted_scram = False self.keyfile = config.get('keyfile') self.certfile = config.get('certfile') @@ -143,11 +159,13 @@ class Connection(slixmpp.ClientXMPP): self.register_plugin('xep_0070') self.register_plugin('xep_0071') self.register_plugin('xep_0077') - self.plugin['xep_0077'].create_account = False + self.plugin['xep_0077'].create_account = ibr # type: bool self.register_plugin('xep_0084') self.register_plugin('xep_0085') self.register_plugin('xep_0153') + self.add_event_handler('register', self.register_ibr) + # monkey-patch xep_0184 to avoid requesting receipts for messages # without a body XEP_0184._filter_add_receipt_request = fixes._filter_add_receipt_request @@ -213,6 +231,32 @@ class Connection(slixmpp.ClientXMPP): self.register_plugin('xep_0380') self.init_plugins() + async def register_ibr(self, form): + log.debug('FOO: %r', form) + info = lambda s: self.core.information(s, 'Info') + + localpart = 'caaa' + password = 'test' + + fields = [ + {'ftype': 'hidden', 'var': 'FORM_TYPE', 'value': 'jabber:iq:register'}, + {'ftype': 'text-single', 'var': 'username', 'value': localpart}, + {'ftype': 'text-private', 'var': 'password', 'value': password}, + ] + + try: + await self['xep_0077'].set_registration(fields) + info('Yay') + jid = self.boundjid + jid.local = localpart + config.set('jid', jid) + config.set('password', password) + except (IqError, IqTimeout): + info('Meh') + finally: + self.disconnect() + self.__init__() + def set_keepalive_values(self, option=None, value=None): """ Called after the XMPP session has been started, or triggered when one of