Split send_socks5_info monster method into smaller methods. (Extract Method Refactoring)
(I don't think what we have here is good, but it is atleast readable)
This commit is contained in:
parent
24f44d8bdd
commit
9eb35dcf18
2 changed files with 97 additions and 88 deletions
|
@ -72,9 +72,6 @@ class ConnectionBytestream:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.files_props = {}
|
self.files_props = {}
|
||||||
self.awaiting_xmpp_ping_id = None
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def send_success_connect_reply(self, streamhost):
|
def send_success_connect_reply(self, streamhost):
|
||||||
"""
|
"""
|
||||||
|
@ -92,9 +89,9 @@ class ConnectionBytestream:
|
||||||
stream_tag.setAttr('jid', streamhost['jid'])
|
stream_tag.setAttr('jid', streamhost['jid'])
|
||||||
self.connection.send(iq)
|
self.connection.send(iq)
|
||||||
|
|
||||||
def remove_transfers_for_contact(self, contact):
|
def stop_all_active_file_transfers(self, contact):
|
||||||
"""
|
"""
|
||||||
Stop all active transfer for contact
|
Stop all active transfer to or from the given contact
|
||||||
"""
|
"""
|
||||||
for file_props in self.files_props.values():
|
for file_props in self.files_props.values():
|
||||||
if is_transfer_stopped(file_props):
|
if is_transfer_stopped(file_props):
|
||||||
|
@ -115,7 +112,6 @@ class ConnectionBytestream:
|
||||||
"""
|
"""
|
||||||
for file_props in self.files_props.values():
|
for file_props in self.files_props.values():
|
||||||
self.remove_transfer(file_props, remove_from_list=False)
|
self.remove_transfer(file_props, remove_from_list=False)
|
||||||
del(self.files_props)
|
|
||||||
self.files_props = {}
|
self.files_props = {}
|
||||||
|
|
||||||
def remove_transfer(self, file_props, remove_from_list=True):
|
def remove_transfer(self, file_props, remove_from_list=True):
|
||||||
|
@ -140,95 +136,40 @@ class ConnectionBytestream:
|
||||||
if 'idx' in host and host['idx'] > 0:
|
if 'idx' in host and host['idx'] > 0:
|
||||||
gajim.socks5queue.remove_receiver(host['idx'])
|
gajim.socks5queue.remove_receiver(host['idx'])
|
||||||
gajim.socks5queue.remove_sender(host['idx'])
|
gajim.socks5queue.remove_sender(host['idx'])
|
||||||
|
|
||||||
def send_socks5_info(self, file_props, fast=True, receiver=None, sender
|
def _send_socks5_info(self, file_props):
|
||||||
=None):
|
|
||||||
"""
|
"""
|
||||||
Send iq for the present streamhosts and proxies
|
Send iq for the present streamhosts and proxies
|
||||||
"""
|
"""
|
||||||
if not self.connection or self.connected < 2:
|
if not self.connection or self.connected < 2:
|
||||||
return
|
return
|
||||||
if not isinstance(self.peerhost, tuple):
|
receiver = file_props['receiver']
|
||||||
return
|
sender = file_props['sender']
|
||||||
port = gajim.config.get('file_transfers_port')
|
|
||||||
ft_add_hosts_to_send = gajim.config.get('ft_add_hosts_to_send')
|
|
||||||
cfg_proxies = gajim.config.get_per('accounts', self.name,
|
|
||||||
'file_transfer_proxies')
|
|
||||||
if receiver is None:
|
|
||||||
receiver = file_props['receiver']
|
|
||||||
if sender is None:
|
|
||||||
sender = file_props['sender']
|
|
||||||
proxyhosts = []
|
|
||||||
if fast and cfg_proxies:
|
|
||||||
proxies = [e.strip() for e in cfg_proxies.split(',')]
|
|
||||||
default = gajim.proxy65_manager.get_default_for_name(self.name)
|
|
||||||
if default:
|
|
||||||
# add/move default proxy at top of the others
|
|
||||||
if proxies.__contains__(default):
|
|
||||||
proxies.remove(default)
|
|
||||||
proxies.insert(0, default)
|
|
||||||
|
|
||||||
for proxy in proxies:
|
|
||||||
(host, _port, jid) = gajim.proxy65_manager.get_proxy(proxy, self.name)
|
|
||||||
if host is None:
|
|
||||||
continue
|
|
||||||
host_dict = {
|
|
||||||
'state': 0,
|
|
||||||
'target': unicode(receiver),
|
|
||||||
'id': file_props['sid'],
|
|
||||||
'sid': file_props['sid'],
|
|
||||||
'initiator': proxy,
|
|
||||||
'host': host,
|
|
||||||
'port': unicode(_port),
|
|
||||||
'jid': jid
|
|
||||||
}
|
|
||||||
proxyhosts.append(host_dict)
|
|
||||||
sha_str = helpers.get_auth_sha(file_props['sid'], sender, receiver)
|
sha_str = helpers.get_auth_sha(file_props['sid'], sender, receiver)
|
||||||
file_props['sha_str'] = sha_str
|
file_props['sha_str'] = sha_str
|
||||||
ft_add_hosts = []
|
|
||||||
if ft_add_hosts_to_send:
|
port = gajim.config.get('file_transfers_port')
|
||||||
ft_add_hosts_to_send = [e.strip() for e in ft_add_hosts_to_send.split(',')]
|
listener = gajim.socks5queue.start_listener(port, sha_str,
|
||||||
for ft_host in ft_add_hosts_to_send:
|
self._result_socks5_sid, file_props['sid'])
|
||||||
ft_add_hosts.append(ft_host)
|
if not listener:
|
||||||
listener = gajim.socks5queue.start_listener(port,
|
|
||||||
sha_str, self._result_socks5_sid, file_props['sid'])
|
|
||||||
if listener is None:
|
|
||||||
file_props['error'] = -5
|
file_props['error'] = -5
|
||||||
self.dispatch('FILE_REQUEST_ERROR', (unicode(receiver), file_props, ''))
|
self.dispatch('FILE_REQUEST_ERROR', (unicode(receiver), file_props, ''))
|
||||||
self._connect_error(unicode(receiver), file_props['sid'],
|
self._connect_error(unicode(receiver), file_props['sid'],
|
||||||
file_props['sid'], code=406)
|
file_props['sid'], code=406)
|
||||||
return
|
else:
|
||||||
|
iq = xmpp.Iq(to=unicode(receiver), typ='set')
|
||||||
iq = xmpp.Iq(to=unicode(receiver), typ='set')
|
file_props['request-id'] = 'id_' + file_props['sid']
|
||||||
file_props['request-id'] = 'id_' + file_props['sid']
|
iq.setID(file_props['request-id'])
|
||||||
iq.setID(file_props['request-id'])
|
query = iq.setTag('query', namespace=xmpp.NS_BYTESTREAM)
|
||||||
query = iq.setTag('query', namespace=xmpp.NS_BYTESTREAM)
|
query.setAttr('mode', 'plain')
|
||||||
query.setAttr('mode', 'plain')
|
query.setAttr('sid', file_props['sid'])
|
||||||
query.setAttr('sid', file_props['sid'])
|
|
||||||
self._add_streamhosts_to_query(query, sender, port, ft_add_hosts)
|
self._add_addiditional_streamhosts_to_query(query, file_props)
|
||||||
try:
|
self._add_local_ips_as_streamhosts_to_query(query, file_props)
|
||||||
# The ip we're connected to server with
|
self._add_proxy_streamhosts_to_query(query, file_props)
|
||||||
my_ips = [self.peerhost[0]]
|
|
||||||
# all IPs from local DNS
|
self.connection.send(iq)
|
||||||
for addr in socket.getaddrinfo(socket.gethostname(), None):
|
|
||||||
if not addr[4][0] in my_ips and not addr[4][0].startswith('127'):
|
|
||||||
my_ips.append(addr[4][0])
|
|
||||||
self._add_streamhosts_to_query(query, sender, port, my_ips)
|
|
||||||
except socket.gaierror:
|
|
||||||
self.dispatch('ERROR', (_('Wrong host'),
|
|
||||||
_('Invalid local address? :-O')))
|
|
||||||
|
|
||||||
if fast and proxyhosts != [] and gajim.config.get_per('accounts',
|
|
||||||
self.name, 'use_ft_proxies'):
|
|
||||||
file_props['proxy_receiver'] = unicode(receiver)
|
|
||||||
file_props['proxy_sender'] = unicode(sender)
|
|
||||||
file_props['proxyhosts'] = proxyhosts
|
|
||||||
|
|
||||||
for proxyhost in proxyhosts:
|
|
||||||
self._add_streamhosts_to_query(query, proxyhost['jid'],
|
|
||||||
proxyhost['port'], [proxyhost['host']])
|
|
||||||
|
|
||||||
self.connection.send(iq)
|
|
||||||
|
|
||||||
def _add_streamhosts_to_query(self, query, sender, port, hosts):
|
def _add_streamhosts_to_query(self, query, sender, port, hosts):
|
||||||
for host in hosts:
|
for host in hosts:
|
||||||
|
@ -238,6 +179,77 @@ class ConnectionBytestream:
|
||||||
streamhost.setAttr('host', host)
|
streamhost.setAttr('host', host)
|
||||||
streamhost.setAttr('jid', sender)
|
streamhost.setAttr('jid', sender)
|
||||||
|
|
||||||
|
def _add_local_ips_as_streamhosts_to_query(self, query, file_props):
|
||||||
|
try:
|
||||||
|
my_ips = [self.peerhost[0]] # The ip we're connected to server with
|
||||||
|
# all IPs from local DNS
|
||||||
|
for addr in socket.getaddrinfo(socket.gethostname(), None):
|
||||||
|
if not addr[4][0] in my_ips and not addr[4][0].startswith('127'):
|
||||||
|
my_ips.append(addr[4][0])
|
||||||
|
|
||||||
|
sender = file_props['sender']
|
||||||
|
port = gajim.config.get('file_transfers_port')
|
||||||
|
self._add_streamhosts_to_query(query, sender, port, my_ips)
|
||||||
|
except socket.gaierror:
|
||||||
|
self.dispatch('ERROR', (_('Wrong host'),
|
||||||
|
_('Invalid local address? :-O')))
|
||||||
|
|
||||||
|
def _add_addiditional_streamhosts_to_query(self, query, file_props):
|
||||||
|
sender = file_props['sender']
|
||||||
|
port = gajim.config.get('file_transfers_port')
|
||||||
|
ft_add_hosts_to_send = gajim.config.get('ft_add_hosts_to_send')
|
||||||
|
additional_hosts = []
|
||||||
|
if ft_add_hosts_to_send:
|
||||||
|
additional_hosts = [e.strip() for e in ft_add_hosts_to_send.split(',')]
|
||||||
|
else:
|
||||||
|
additional_hosts = []
|
||||||
|
self._add_streamhosts_to_query(query, sender, port, additional_hosts)
|
||||||
|
|
||||||
|
def _add_proxy_streamhosts_to_query(self, query, file_props):
|
||||||
|
proxyhosts = self._get_file_transfer_proxies_from_config(file_props)
|
||||||
|
if proxyhosts:
|
||||||
|
file_props['proxy_receiver'] = unicode(file_props['receiver'])
|
||||||
|
file_props['proxy_sender'] = unicode(file_props['sender'])
|
||||||
|
file_props['proxyhosts'] = proxyhosts
|
||||||
|
|
||||||
|
for proxyhost in proxyhosts:
|
||||||
|
self._add_streamhosts_to_query(query, proxyhost['jid'],
|
||||||
|
proxyhost['port'], [proxyhost['host']])
|
||||||
|
|
||||||
|
def _get_file_transfer_proxies_from_config(self, file_props):
|
||||||
|
configured_proxies = gajim.config.get_per('accounts', self.name,
|
||||||
|
'file_transfer_proxies')
|
||||||
|
shall_use_proxies = gajim.config.get_per('accounts', self.name,
|
||||||
|
'use_ft_proxies')
|
||||||
|
if shall_use_proxies and configured_proxies:
|
||||||
|
proxyhost_dicts = []
|
||||||
|
proxies = [item.strip() for item in configured_proxies.split(',')]
|
||||||
|
default_proxy = gajim.proxy65_manager.get_default_for_name(self.name)
|
||||||
|
if default_proxy:
|
||||||
|
# add/move default proxy at top of the others
|
||||||
|
if default_proxy in proxies:
|
||||||
|
proxies.remove(default_proxy)
|
||||||
|
proxies.insert(0, default_proxy)
|
||||||
|
|
||||||
|
for proxy in proxies:
|
||||||
|
(host, _port, jid) = gajim.proxy65_manager.get_proxy(proxy, self.name)
|
||||||
|
if not host:
|
||||||
|
continue
|
||||||
|
host_dict = {
|
||||||
|
'state': 0,
|
||||||
|
'target': unicode(file_props['receiver']),
|
||||||
|
'id': file_props['sid'],
|
||||||
|
'sid': file_props['sid'],
|
||||||
|
'initiator': proxy,
|
||||||
|
'host': host,
|
||||||
|
'port': unicode(_port),
|
||||||
|
'jid': jid
|
||||||
|
}
|
||||||
|
proxyhost_dicts.append(host_dict)
|
||||||
|
return proxyhost_dicts
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
def send_file_rejection(self, file_props, code='403', typ=None):
|
def send_file_rejection(self, file_props, code='403', typ=None):
|
||||||
"""
|
"""
|
||||||
Inform sender that we refuse to download the file
|
Inform sender that we refuse to download the file
|
||||||
|
@ -440,9 +452,6 @@ class ConnectionBytestream:
|
||||||
# if we want to respect xep-0065 we have to check for proxy
|
# if we want to respect xep-0065 we have to check for proxy
|
||||||
# activation result in any result iq
|
# activation result in any result iq
|
||||||
real_id = unicode(iq_obj.getAttr('id'))
|
real_id = unicode(iq_obj.getAttr('id'))
|
||||||
if real_id == self.awaiting_xmpp_ping_id:
|
|
||||||
self.awaiting_xmpp_ping_id = None
|
|
||||||
return
|
|
||||||
if not real_id.startswith('au_'):
|
if not real_id.startswith('au_'):
|
||||||
return
|
return
|
||||||
frm = self._ft_get_from(iq_obj)
|
frm = self._ft_get_from(iq_obj)
|
||||||
|
@ -559,7 +568,7 @@ class ConnectionBytestream:
|
||||||
field = form.getField('stream-method')
|
field = form.getField('stream-method')
|
||||||
if field.getValue() != xmpp.NS_BYTESTREAM:
|
if field.getValue() != xmpp.NS_BYTESTREAM:
|
||||||
return
|
return
|
||||||
self.send_socks5_info(file_props, fast=True)
|
self._send_socks5_info(file_props)
|
||||||
raise xmpp.NodeProcessed
|
raise xmpp.NodeProcessed
|
||||||
|
|
||||||
def _siSetCB(self, con, iq_obj):
|
def _siSetCB(self, con, iq_obj):
|
||||||
|
|
|
@ -440,7 +440,7 @@ class Interface:
|
||||||
|
|
||||||
# TODO: This causes problems when another
|
# TODO: This causes problems when another
|
||||||
# resource signs off!
|
# resource signs off!
|
||||||
conn.remove_transfers_for_contact(contact1)
|
conn.stop_all_active_file_transfers(contact1)
|
||||||
|
|
||||||
# disable encryption, since if any messages are
|
# disable encryption, since if any messages are
|
||||||
# lost they'll be not decryptable (note that
|
# lost they'll be not decryptable (note that
|
||||||
|
|
Loading…
Add table
Reference in a new issue