coding standards
This commit is contained in:
parent
4928275537
commit
4585c85458
|
@ -50,9 +50,7 @@ class JingleFileTransfer(JingleContent):
|
|||
def __init__(self, session, transport=None, file_props=None,
|
||||
use_security=False):
|
||||
JingleContent.__init__(self, session, transport)
|
||||
|
||||
log.info("transport value: %s" % transport)
|
||||
|
||||
# events we might be interested in
|
||||
self.callbacks['session-initiate'] += [self.__on_session_initiate]
|
||||
self.callbacks['session-initiate-sent'] += [
|
||||
|
@ -68,31 +66,25 @@ class JingleFileTransfer(JingleContent):
|
|||
self.callbacks['transport-reject'] += [self.__on_transport_reject]
|
||||
self.callbacks['transport-info'] += [self.__on_transport_info]
|
||||
self.callbacks['iq-result'] += [self.__on_iq_result]
|
||||
|
||||
self.use_security = use_security
|
||||
|
||||
self.file_props = file_props
|
||||
if file_props is None:
|
||||
self.weinitiate = False
|
||||
else:
|
||||
self.weinitiate = True
|
||||
|
||||
if self.file_props is not None:
|
||||
self.file_props.sender = session.ourjid
|
||||
self.file_props.receiver = session.peerjid
|
||||
self.file_props.session_type = 'jingle'
|
||||
self.file_props.session_sid = session.sid
|
||||
self.file_props.transfered_size = []
|
||||
|
||||
log.info("FT request: %s" % file_props)
|
||||
|
||||
if transport is None:
|
||||
self.transport = JingleTransportSocks5()
|
||||
self.transport.set_connection(session.connection)
|
||||
self.transport.set_file_props(self.file_props)
|
||||
self.transport.set_our_jid(session.ourjid)
|
||||
log.info('ourjid: %s' % session.ourjid)
|
||||
|
||||
self.session = session
|
||||
self.media = 'file'
|
||||
self.nominated_cand = {}
|
||||
|
@ -128,6 +120,7 @@ class JingleFileTransfer(JingleContent):
|
|||
# Delete this after file_props refactoring this shouldn't be necesary
|
||||
self.session.file_hash = self.file_props.hash_
|
||||
self.session.hash_algo = self.file_props.algo
|
||||
|
||||
def __on_session_initiate_sent(self, stanza, content, error, action):
|
||||
# Calculate file_hash in a new thread
|
||||
# if we haven't sent the hash already.
|
||||
|
@ -142,7 +135,6 @@ class JingleFileTransfer(JingleContent):
|
|||
checksum.setNamespace(xmpp.NS_JINGLE_FILE_TRANSFER)
|
||||
self.session.__session_info(checksum )
|
||||
|
||||
|
||||
def _calcHash(self):
|
||||
# Caculates the hash and returns a xep-300 hash stanza
|
||||
if self.session.hash_algo == None:
|
||||
|
@ -155,7 +147,7 @@ class JingleFileTransfer(JingleContent):
|
|||
h = xmpp.Hashes()
|
||||
hash_ = h.calculateHash(self.session.hash_algo, file_)
|
||||
# DEBUG
|
||||
#hash_ = '1294809248109223'
|
||||
hash_ = '1294809248109223'
|
||||
if not hash_:
|
||||
# Hash alogrithm not supported
|
||||
return
|
||||
|
@ -169,8 +161,6 @@ class JingleFileTransfer(JingleContent):
|
|||
security = content.getTag('security')
|
||||
if not security: # responder can not verify our fingerprint
|
||||
self.use_security = False
|
||||
|
||||
|
||||
if self.state == STATE_TRANSPORT_REPLACE:
|
||||
# We ack the session accept
|
||||
response = stanza.buildReply('result')
|
||||
|
@ -179,13 +169,11 @@ class JingleFileTransfer(JingleContent):
|
|||
# We send the file
|
||||
self.__state_changed(STATE_TRANSFERING)
|
||||
raise xmpp.NodeProcessed
|
||||
|
||||
self.file_props.streamhosts = self.transport.remote_candidates
|
||||
for host in self.file_props.streamhosts:
|
||||
host['initiator'] = self.session.initiator
|
||||
host['target'] = self.session.responder
|
||||
host['sid'] = self.file_props.sid
|
||||
|
||||
response = stanza.buildReply('result')
|
||||
response.delChild(response.getQuery())
|
||||
con.connection.send(response)
|
||||
|
@ -218,7 +206,6 @@ class JingleFileTransfer(JingleContent):
|
|||
|
||||
def __on_transport_info(self, stanza, content, error, action):
|
||||
log.info("__on_transport_info")
|
||||
|
||||
if content.getTag('transport').getTag('candidate-error'):
|
||||
self.nominated_cand['peer-cand'] = False
|
||||
if self.state == STATE_CAND_SENT:
|
||||
|
@ -244,7 +231,6 @@ class JingleFileTransfer(JingleContent):
|
|||
gajim.socks5queue.send_file(self.file_props,
|
||||
self.session.connection.name, 'client')
|
||||
return
|
||||
|
||||
args = {'content' : content,
|
||||
'sendCand' : False}
|
||||
if self.state == STATE_CAND_SENT:
|
||||
|
@ -257,8 +243,6 @@ class JingleFileTransfer(JingleContent):
|
|||
else:
|
||||
self.__state_changed(STATE_CAND_RECEIVED, args)
|
||||
|
||||
|
||||
|
||||
def __on_iq_result(self, stanza, content, error, action):
|
||||
log.info("__on_iq_result")
|
||||
|
||||
|
@ -277,12 +261,10 @@ class JingleFileTransfer(JingleContent):
|
|||
def __transport_setup(self, stanza=None, content=None, error=None,
|
||||
action=None):
|
||||
# Sets up a few transport specific things for the file transfer
|
||||
|
||||
if self.transport.type_ == TransportType.IBB:
|
||||
# No action required, just set the state to transfering
|
||||
self.state = STATE_TRANSFERING
|
||||
|
||||
|
||||
def on_connect(self, streamhost):
|
||||
"""
|
||||
send candidate-used stanza
|
||||
|
@ -292,7 +274,6 @@ class JingleFileTransfer(JingleContent):
|
|||
return
|
||||
args = {'streamhost' : streamhost,
|
||||
'sendCand' : True}
|
||||
|
||||
self.nominated_cand['our-cand'] = streamhost
|
||||
self.__sendCand(args)
|
||||
|
||||
|
@ -313,19 +294,15 @@ class JingleFileTransfer(JingleContent):
|
|||
self.file_props.hash_ = hash_id
|
||||
|
||||
def _listen_host(self):
|
||||
|
||||
receiver = self.file_props.receiver
|
||||
sender = self.file_props.sender
|
||||
sha_str = helpers.get_auth_sha(self.file_props.sid, sender,
|
||||
receiver)
|
||||
self.file_props.sha_str = sha_str
|
||||
|
||||
port = gajim.config.get('file_transfers_port')
|
||||
|
||||
fingerprint = None
|
||||
if self.use_security:
|
||||
fingerprint = 'server'
|
||||
|
||||
if self.weinitiate:
|
||||
listener = gajim.socks5queue.start_listener(port, sha_str,
|
||||
self._store_socks5_sid, self.file_props,
|
||||
|
@ -334,10 +311,10 @@ class JingleFileTransfer(JingleContent):
|
|||
listener = gajim.socks5queue.start_listener(port, sha_str,
|
||||
self._store_socks5_sid, self.file_props,
|
||||
fingerprint=fingerprint, typ='receiver')
|
||||
|
||||
if not listener:
|
||||
# send error message, notify the user
|
||||
return
|
||||
|
||||
def isOurCandUsed(self):
|
||||
'''
|
||||
If this method returns true then the candidate we nominated will be
|
||||
|
@ -348,10 +325,8 @@ class JingleFileTransfer(JingleContent):
|
|||
return True
|
||||
if self.nominated_cand['our-cand'] == False:
|
||||
return False
|
||||
|
||||
peer_pr = int(self.nominated_cand['peer-cand']['priority'])
|
||||
our_pr = int(self.nominated_cand['our-cand']['priority'])
|
||||
|
||||
if peer_pr != our_pr:
|
||||
return our_pr > peer_pr
|
||||
else:
|
||||
|
|
|
@ -16,6 +16,7 @@ import xmpp
|
|||
from jingle_transport import *
|
||||
from common.socks5 import Socks5ReceiverClient, Socks5SenderClient
|
||||
|
||||
|
||||
class JingleFileTransferStates:
|
||||
'''
|
||||
This class implements the state machine design pattern
|
||||
|
@ -64,27 +65,22 @@ class StateCandSent(JingleFileTransferStates):
|
|||
# Send candidate used
|
||||
streamhost = args['streamhost']
|
||||
self.jft.nominated_cand['our-cand'] = streamhost
|
||||
|
||||
content = xmpp.Node('content')
|
||||
content.setAttr('creator', 'initiator')
|
||||
content.setAttr('name', self.jft.name)
|
||||
|
||||
transport = xmpp.Node('transport')
|
||||
transport.setNamespace(xmpp.NS_JINGLE_BYTESTREAM)
|
||||
transport.setAttr('sid', self.jft.transport.sid)
|
||||
|
||||
candidateused = xmpp.Node('candidate-used')
|
||||
candidateused.setAttr('cid', streamhost['cid'])
|
||||
|
||||
transport.addChild(node=candidateused)
|
||||
content.addChild(node=transport)
|
||||
|
||||
self.jft.session.send_transport_info(content)
|
||||
|
||||
|
||||
def action(self, args=None):
|
||||
self._sendCand(args)
|
||||
|
||||
|
||||
class StateCandReceived(JingleFileTransferStates):
|
||||
'''
|
||||
This state happens when we receive a candidate.
|
||||
|
@ -111,6 +107,7 @@ class StateCandReceived(JingleFileTransferStates):
|
|||
def action(self, args=None):
|
||||
self._recvCand(args)
|
||||
|
||||
|
||||
class StateCandSentAndRecv( StateCandSent, StateCandReceived):
|
||||
'''
|
||||
This state happens when we have received and sent the candidates.
|
||||
|
@ -124,6 +121,7 @@ class StateCandSentAndRecv( StateCandSent, StateCandReceived):
|
|||
else:
|
||||
self._recvCand(args)
|
||||
|
||||
|
||||
class StateTransportReplace(JingleFileTransferStates):
|
||||
'''
|
||||
This state initiates transport replace
|
||||
|
@ -132,6 +130,7 @@ class StateTransportReplace(JingleFileTransferStates):
|
|||
def action(self, args=None):
|
||||
self.jft.session.transport_replace()
|
||||
|
||||
|
||||
class StateTransfering(JingleFileTransferStates):
|
||||
'''
|
||||
This state will start the transfer depeding on the type of transport
|
||||
|
@ -146,14 +145,12 @@ class StateTransfering(JingleFileTransferStates):
|
|||
def __start_SOCK5_transfer(self):
|
||||
# It tells wether we start the transfer as client or server
|
||||
mode = None
|
||||
|
||||
if self.jft.isOurCandUsed():
|
||||
mode = 'client'
|
||||
streamhost_used = self.jft.nominated_cand['our-cand']
|
||||
else:
|
||||
mode = 'server'
|
||||
streamhost_used = self.jft.nominated_cand['peer-cand']
|
||||
|
||||
if streamhost_used['type'] == 'proxy':
|
||||
self.jft.file_props.is_a_proxy = True
|
||||
# This needs to be changed when requesting
|
||||
|
@ -164,7 +161,6 @@ class StateTransfering(JingleFileTransferStates):
|
|||
self.jft.file_props.proxy_sender = streamhost_used['target']
|
||||
self.jft.file_props.proxy_receiver = streamhost_used[
|
||||
'initiator']
|
||||
|
||||
# This needs to be changed when requesting
|
||||
if not self.jft.weinitiate and streamhost_used['type'] == 'proxy':
|
||||
r = gajim.socks5queue.readers
|
||||
|
@ -172,7 +168,6 @@ class StateTransfering(JingleFileTransferStates):
|
|||
if r[reader].host == streamhost_used['host'] and \
|
||||
r[reader].connected:
|
||||
return
|
||||
|
||||
# This needs to be changed when requesting
|
||||
if self.jft.weinitiate and streamhost_used['type'] == 'proxy':
|
||||
s = gajim.socks5queue.senders
|
||||
|
@ -180,7 +175,6 @@ class StateTransfering(JingleFileTransferStates):
|
|||
if s[sender].host == streamhost_used['host'] and \
|
||||
s[sender].connected:
|
||||
return
|
||||
|
||||
if streamhost_used['type'] == 'proxy':
|
||||
self.jft.file_props.streamhost_used = True
|
||||
streamhost_used['sid'] = self.jft.file_props.sid
|
||||
|
@ -188,7 +182,6 @@ class StateTransfering(JingleFileTransferStates):
|
|||
self.jft.file_props.streamhosts.append(streamhost_used)
|
||||
self.jft.file_props.proxyhosts = []
|
||||
self.jft.file_props.proxyhosts.append(streamhost_used)
|
||||
|
||||
# This needs to be changed when requesting
|
||||
if self.jft.weinitiate:
|
||||
gajim.socks5queue.idx += 1
|
||||
|
@ -224,3 +217,5 @@ class StateTransfering(JingleFileTransferStates):
|
|||
|
||||
elif self.jft.transport.type_ == TransportType.SOCKS5:
|
||||
self.__start_SOCK5_transfer()
|
||||
|
||||
|
||||
|
|
|
@ -26,7 +26,6 @@ import socket
|
|||
import struct
|
||||
import hashlib
|
||||
import os
|
||||
|
||||
from errno import EWOULDBLOCK
|
||||
from errno import ENOBUFS
|
||||
from errno import EINTR
|
||||
|
@ -36,30 +35,24 @@ from errno import EAFNOSUPPORT
|
|||
from xmpp.idlequeue import IdleObject
|
||||
from file_props import FilesProp
|
||||
import jingle_xtls
|
||||
|
||||
if jingle_xtls.PYOPENSSL_PRESENT:
|
||||
import OpenSSL
|
||||
|
||||
import logging
|
||||
log = logging.getLogger('gajim.c.socks5')
|
||||
|
||||
MAX_BUFF_LEN = 65536
|
||||
|
||||
# after foo seconds without activity label transfer as 'stalled'
|
||||
STALLED_TIMEOUT = 10
|
||||
|
||||
# after foo seconds of waiting to connect, disconnect from
|
||||
# streamhost and try next one
|
||||
CONNECT_TIMEOUT = 30
|
||||
|
||||
# nothing received for the last foo seconds - stop transfer
|
||||
# if it is 0, then transfer will wait forever
|
||||
READ_TIMEOUT = 180
|
||||
|
||||
# nothing sent for the last foo seconds - stop transfer
|
||||
# if it is 0, then transfer will wait forever
|
||||
SEND_TIMEOUT = 180
|
||||
|
||||
|
||||
class SocksQueue:
|
||||
"""
|
||||
Queue for all file requests objects
|
||||
|
@ -100,7 +93,6 @@ class SocksQueue:
|
|||
# There is already a listener, we update the file's information
|
||||
# on the new connection.
|
||||
self.listener.file_props = file_props
|
||||
|
||||
self.connected += 1
|
||||
return self.listener
|
||||
|
||||
|
@ -124,10 +116,8 @@ class SocksQueue:
|
|||
self.on_failure[sid] = on_failure
|
||||
file_props = FilesProp.getFileProp(account, sid)
|
||||
file_props.failure_cb = on_failure
|
||||
|
||||
if not file_props.streamhosts:
|
||||
on_failure(file_props.sid)
|
||||
|
||||
# add streamhosts to the queue
|
||||
for streamhost in file_props.streamhosts:
|
||||
if 'type' in streamhost and streamhost['type'] == 'proxy':
|
||||
|
@ -310,12 +300,10 @@ class SocksQueue:
|
|||
return
|
||||
if file_props.name in key and file_props.sid in key \
|
||||
and self.senders[key].mode == mode:
|
||||
|
||||
log.info('socks5: sending file')
|
||||
sender = self.senders[key]
|
||||
file_props.streamhost_used = True
|
||||
sender.account = account
|
||||
|
||||
sender.file_props = file_props
|
||||
result = sender.send_file()
|
||||
self.process_result(result, sender)
|
||||
|
@ -333,7 +321,6 @@ class SocksQueue:
|
|||
sock_hash = sock.__hash__()
|
||||
if self.type_ == 'sender' and \
|
||||
not self.isHashInSockObjs(self.senders, sock_hash):
|
||||
|
||||
sockobj = Socks5SenderServer(self.idlequeue, sock_hash, self,
|
||||
sock[0], sock[1][0], sock[1][1], fingerprint='server',
|
||||
file_props=listener.file_props)
|
||||
|
@ -341,7 +328,6 @@ class SocksQueue:
|
|||
# Start waiting for data
|
||||
self.idlequeue.plug_idle(sockobj, False, True)
|
||||
self.connected += 1
|
||||
|
||||
if self.type_ == 'receiver' and \
|
||||
not self.isHashInSockObjs(self.readers, sock_hash):
|
||||
sh = {}
|
||||
|
@ -349,13 +335,11 @@ class SocksQueue:
|
|||
sh['port'] = sock[1][1]
|
||||
sh['initiator'] = None
|
||||
sh['target'] = None
|
||||
|
||||
sockobj = Socks5ReceiverServer(idlequeue=self.idlequeue,
|
||||
streamhost=sh,sid=None, file_props=listener.file_props,
|
||||
fingerprint='server')
|
||||
|
||||
self._add(sockobj, self.readers, listener.file_props, sock_hash)
|
||||
|
||||
sockobj.set_sock(sock[0])
|
||||
sockobj.queue = self
|
||||
self.connected += 1
|
||||
|
@ -425,6 +409,7 @@ class SocksQueue:
|
|||
self.listener = None
|
||||
self.connected -= 1
|
||||
|
||||
|
||||
class Socks5:
|
||||
def __init__(self, idlequeue, host, port, initiator, target, sid):
|
||||
if host is not None:
|
||||
|
@ -451,7 +436,6 @@ class Socks5:
|
|||
self.type_ = ''
|
||||
self.mode = ''
|
||||
|
||||
|
||||
def _is_connected(self):
|
||||
if self.state < 5:
|
||||
return False
|
||||
|
@ -463,11 +447,9 @@ class Socks5:
|
|||
"""
|
||||
if self.ais is None:
|
||||
return None
|
||||
|
||||
for ai in self.ais:
|
||||
try:
|
||||
self._sock = socket.socket(*ai[:3])
|
||||
|
||||
if not self.fingerprint is None:
|
||||
self._sock = OpenSSL.SSL.Connection(
|
||||
jingle_xtls.get_context('client'), self._sock)
|
||||
|
@ -514,7 +496,6 @@ class Socks5:
|
|||
self.file_props.disconnect_cb = self.disconnect
|
||||
self.file_props.paused = False
|
||||
self.state = 1 # connected
|
||||
|
||||
# stop all others connections to sender's streamhosts
|
||||
self.queue._socket_connected(self.streamhost, self.file_props)
|
||||
self.idlequeue.plug_idle(self, True, False)
|
||||
|
@ -677,7 +658,6 @@ class Socks5:
|
|||
"""
|
||||
Read file contents from socket and write them to file
|
||||
"""
|
||||
|
||||
if self.file_props is None or not self.file_props.file_name:
|
||||
self.file_props.error = -2
|
||||
return None
|
||||
|
@ -900,9 +880,7 @@ class Socks5Sender(IdleObject):
|
|||
self.queue = parent
|
||||
self.file_props = file_props
|
||||
self.proxy = False
|
||||
|
||||
self._sock = _sock
|
||||
|
||||
if _sock is not None:
|
||||
if self.fingerprint is not None and not isinstance(self._sock,
|
||||
OpenSSL.SSL.Connection):
|
||||
|
@ -910,7 +888,6 @@ class Socks5Sender(IdleObject):
|
|||
jingle_xtls.get_context('server'), _sock)
|
||||
else:
|
||||
self._sock.setblocking(False)
|
||||
|
||||
self.fd = _sock.fileno()
|
||||
self._recv = _sock.recv
|
||||
self._send = _sock.send
|
||||
|
@ -939,13 +916,11 @@ class Socks5Sender(IdleObject):
|
|||
|
||||
def set_connection_sock(self, _sock):
|
||||
self._sock = _sock
|
||||
|
||||
if self.fingerprint is not None:
|
||||
self._sock = OpenSSL.SSL.Connection(
|
||||
jingle_xtls.get_context('client'), _sock)
|
||||
else:
|
||||
self._sock.setblocking(False)
|
||||
|
||||
self.fd = _sock.fileno()
|
||||
self._recv = _sock.recv
|
||||
self._send = _sock.send
|
||||
|
@ -959,7 +934,6 @@ class Socks5Sender(IdleObject):
|
|||
"""
|
||||
Start sending the file over verified connection
|
||||
"""
|
||||
|
||||
self.pauses = 0
|
||||
self.state = 7
|
||||
# plug for writing
|
||||
|
@ -978,6 +952,7 @@ class Socks5Sender(IdleObject):
|
|||
if self.queue is not None:
|
||||
self.queue.remove_sender(self.queue_idx, False)
|
||||
|
||||
|
||||
class Socks5Receiver(IdleObject):
|
||||
|
||||
def __init__(self, idlequeue, streamhost, sid, file_props = None,
|
||||
|
@ -1055,6 +1030,7 @@ class Socks5Receiver(IdleObject):
|
|||
self.queue.remove_receiver(self.queue_idx, False)
|
||||
|
||||
class Socks5Server(Socks5):
|
||||
|
||||
def __init__(self, idlequeue, host, port, initiator, target, sid):
|
||||
Socks5.__init__(self, idlequeue, host, port, initiator, target, sid)
|
||||
self.mode = 'server'
|
||||
|
@ -1090,7 +1066,6 @@ class Socks5Server(Socks5):
|
|||
self.queue.result_sha(self.sha_msg, self.queue_idx)
|
||||
if result == -1:
|
||||
self.disconnect()
|
||||
|
||||
elif self.state == 5:
|
||||
self.state = 7
|
||||
if self.type_ == 'sender':
|
||||
|
@ -1101,7 +1076,6 @@ class Socks5Server(Socks5):
|
|||
# We plug for reading
|
||||
self.idlequeue.plug_idle(self, False, True)
|
||||
return
|
||||
|
||||
elif self.state == 7:
|
||||
if self.file_props.paused:
|
||||
self.file_props.continue_cb = \
|
||||
|
@ -1175,7 +1149,6 @@ class Socks5Client(Socks5):
|
|||
# end connection
|
||||
self.pollend()
|
||||
return
|
||||
|
||||
if self.state == 2: # read auth response
|
||||
if buff is None or len(buff) != 2:
|
||||
return None
|
||||
|
@ -1208,11 +1181,9 @@ class Socks5Client(Socks5):
|
|||
if self.type_ == 'sender' and self.proxy:
|
||||
self.queue.process_result(self.send_file(), self)
|
||||
return
|
||||
|
||||
if result == 0:
|
||||
self.state = 8
|
||||
self.disconnect()
|
||||
|
||||
# for senders: init file_props
|
||||
if result == 1 and self.state == 5:
|
||||
if self.file_props.type_ == 's':
|
||||
|
@ -1233,7 +1204,6 @@ class Socks5Client(Socks5):
|
|||
else:
|
||||
# receiving file contents from socket
|
||||
self.idlequeue.plug_idle(self, False, True)
|
||||
|
||||
self.file_props.continue_cb = self.continue_paused_transfer
|
||||
# we have set up the connection, next - retrieve file
|
||||
self.state = 6
|
||||
|
@ -1445,3 +1415,5 @@ class Socks5Listener(IdleObject):
|
|||
_sock[0].setblocking(False)
|
||||
self.connections.append(_sock[0])
|
||||
return _sock
|
||||
|
||||
|
||||
|
|
|
@ -1662,9 +1662,9 @@ class YesNoDialog(HigDialog):
|
|||
*self.user_response_yes[1:])
|
||||
else:
|
||||
if self.textview:
|
||||
self.user_response_yes(self.is_checked())
|
||||
else:
|
||||
self.user_response_yes(self.is_checked(), txt)
|
||||
else:
|
||||
self.user_response_yes(self.is_checked())
|
||||
self.call_cancel_on_destroy = False
|
||||
self.destroy()
|
||||
|
||||
|
|
Loading…
Reference in New Issue