diff options
Diffstat (limited to 'poezio/connection.py')
-rw-r--r-- | poezio/connection.py | 93 |
1 files changed, 45 insertions, 48 deletions
diff --git a/poezio/connection.py b/poezio/connection.py index b04bf9fd..503d9169 100644 --- a/poezio/connection.py +++ b/poezio/connection.py @@ -3,7 +3,7 @@ # This file is part of Poezio. # # Poezio is free software: you can redistribute it and/or modify -# it under the terms of the zlib license. See the COPYING file. +# it under the terms of the GPL-3.0+ license. See the COPYING file. """ Defines the Connection class """ @@ -16,8 +16,10 @@ import subprocess import sys import base64 import random +from pathlib import Path import slixmpp +from slixmpp import JID, InvalidJID from slixmpp.xmlstream import ET from slixmpp.plugins.xep_0184 import XEP_0184 from slixmpp.plugins.xep_0030 import DiscoInfo @@ -26,8 +28,7 @@ from slixmpp.util import FileSystemCache from poezio import common from poezio import fixes from poezio import xdg -from poezio.common import safeJID -from poezio.config import config, options +from poezio.config import config class Connection(slixmpp.ClientXMPP): @@ -37,25 +38,25 @@ class Connection(slixmpp.ClientXMPP): """ __init = False - def __init__(self): - keyfile = config.get('keyfile') - certfile = config.get('certfile') + def __init__(self, custom_version=''): + keyfile = config.getstr('keyfile') + certfile = config.getstr('certfile') - device_id = config.get('device_id') + device_id = config.getstr('device_id') if not device_id: rng = random.SystemRandom() device_id = base64.urlsafe_b64encode( rng.getrandbits(24).to_bytes(3, 'little')).decode('ascii') config.set_and_save('device_id', device_id) - if config.get('jid'): + if config.getstr('jid'): # Field used to know if we are anonymous or not. # many features will be handled differently # depending on this setting self.anon = False - jid = config.get('jid') - password = config.get('password') - eval_password = config.get('eval_password') + jid = config.getstr('jid') + password = config.getstr('password') + eval_password = config.getstr('eval_password') if not password and not eval_password and not (keyfile and certfile): password = getpass.getpass() @@ -79,25 +80,29 @@ class Connection(slixmpp.ClientXMPP): '\n') else: # anonymous auth self.anon = True - jid = config.get('server') + jid = config.getstr('server') password = None - jid = safeJID(jid) + try: + jid = JID(jid) + except InvalidJID: + sys.stderr.write('Invalid jid option: "%s" is not a valid JID\n' % jid) + sys.exit(1) 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')) + self, jid, password, lang=config.getstr('lang')) - force_encryption = config.get('force_encryption') + force_encryption = config.getbool('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') + self.keyfile = keyfile + self.certfile = certfile if keyfile and not certfile: log.error( 'keyfile is present in configuration file without certfile') @@ -106,15 +111,18 @@ class Connection(slixmpp.ClientXMPP): 'certfile is present in configuration file without keyfile') self.core = None - self.auto_reconnect = config.get('auto_reconnect') + self.auto_reconnect = config.getbool('auto_reconnect') self.auto_authorize = None # prosody defaults, lowest is AES128-SHA, it should be a minimum # for anything that came out after 2002 - self.ciphers = config.get( + self.ciphers = config.getstr( 'ciphers', 'HIGH+kEDH:HIGH+kEECDH:HIGH:!PSK' ':!SRP:!3DES:!aNULL') - self.ca_certs = config.get('ca_cert_path') or None - interval = config.get('whitespace_interval') + self.ca_certs = None + ca_certs = config.getlist('ca_cert_path') + if ca_certs and ca_certs != ['']: + self.ca_certs = list(map(Path, config.getlist('ca_cert_path'))) + interval = config.getint('whitespace_interval') if int(interval) > 0: self.whitespace_keepalive_interval = int(interval) else: @@ -152,33 +160,21 @@ class Connection(slixmpp.ClientXMPP): # without a body XEP_0184._filter_add_receipt_request = fixes._filter_add_receipt_request self.register_plugin('xep_0184') - self.plugin['xep_0184'].auto_ack = config.get('ack_message_receipts') - self.plugin['xep_0184'].auto_request = config.get( + self.plugin['xep_0184'].auto_ack = config.getbool('ack_message_receipts') + self.plugin['xep_0184'].auto_request = config.getbool( 'request_message_receipts') self.register_plugin('xep_0191') - if config.get('enable_smacks'): + if config.getbool('enable_smacks'): self.register_plugin('xep_0198') self.register_plugin('xep_0199') - if config.get('enable_user_tune'): - self.register_plugin('xep_0118') - - if config.get('enable_user_nick'): + if config.getbool('enable_user_nick'): self.register_plugin('xep_0172') - if config.get('enable_user_mood'): - self.register_plugin('xep_0107') - - if config.get('enable_user_activity'): - self.register_plugin('xep_0108') - - if config.get('enable_user_gaming'): - self.register_plugin('xep_0196') - - if config.get('send_poezio_info'): - info = {'name': 'poezio', 'version': options.custom_version} - if config.get('send_os_info'): + if config.getbool('send_poezio_info'): + info = {'name': 'poezio', 'version': custom_version} + if config.getbool('send_os_info'): info['os'] = common.get_os_info() self.plugin['xep_0030'].set_identities(identities={('client', 'console', @@ -190,7 +186,7 @@ class Connection(slixmpp.ClientXMPP): 'console', None, '')}) self.register_plugin('xep_0092', pconfig=info) - if config.get('send_time'): + if config.getbool('send_time'): self.register_plugin('xep_0202') self.register_plugin('xep_0224') self.register_plugin('xep_0231') @@ -200,18 +196,19 @@ class Connection(slixmpp.ClientXMPP): self.register_plugin('xep_0297') self.register_plugin('xep_0308') self.register_plugin('xep_0313') - self.register_plugin('xep_0319') self.register_plugin('xep_0334') self.register_plugin('xep_0352') try: self.register_plugin('xep_0363') - except SyntaxError: - log.error('Failed to load HTTP File Upload plugin, it can only be ' - 'used on Python 3.5+') except slixmpp.plugins.base.PluginNotFound: log.error('Failed to load HTTP File Upload plugin, it can only be ' 'used with aiohttp installed') self.register_plugin('xep_0380') + try: + self.register_plugin('xep_0454') + except slixmpp.plugins.base.PluginNotFound: + log.error('Failed to load Media Sharing plugin, ' + 'it requires slixmpp 1.8.2.') self.init_plugins() def set_keepalive_values(self, option=None, value=None): @@ -224,8 +221,8 @@ class Connection(slixmpp.ClientXMPP): # Happens when we change the value with /set while we are not # connected. Do nothing in that case return - ping_interval = config.get('connection_check_interval') - timeout_delay = config.get('connection_timeout_delay') + ping_interval = config.getint('connection_check_interval') + timeout_delay = config.getint('connection_timeout_delay') if timeout_delay <= 0: # We help the stupid user (with a delay of 0, poezio will try to # reconnect immediately because the timeout is immediately @@ -242,7 +239,7 @@ class Connection(slixmpp.ClientXMPP): """ Connect and process events. """ - custom_host = config.get('custom_host') + custom_host = config.getstr('custom_host') custom_port = config.get('custom_port', 5222) if custom_port == -1: custom_port = 5222 |