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