merge
This commit is contained in:
commit
c51fb07d09
|
@ -38,6 +38,7 @@ from jingle_session import JingleSession, JingleStates
|
||||||
if gajim.HAVE_FARSIGHT:
|
if gajim.HAVE_FARSIGHT:
|
||||||
from jingle_rtp import JingleAudio, JingleVideo
|
from jingle_rtp import JingleAudio, JingleVideo
|
||||||
from jingle_ft import JingleFileTransfer
|
from jingle_ft import JingleFileTransfer
|
||||||
|
from jingle_transport import JingleTransportSocks5, JingleTransportIBB
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger('gajim.c.jingle')
|
logger = logging.getLogger('gajim.c.jingle')
|
||||||
|
@ -78,11 +79,11 @@ class ConnectionJingle(object):
|
||||||
"""
|
"""
|
||||||
# get data
|
# get data
|
||||||
jid = helpers.get_full_jid_from_iq(stanza)
|
jid = helpers.get_full_jid_from_iq(stanza)
|
||||||
id = stanza.getID()
|
id_ = stanza.getID()
|
||||||
|
|
||||||
if (jid, id) in self.__iq_responses.keys():
|
if (jid, id_) in self.__iq_responses.keys():
|
||||||
self.__iq_responses[(jid, id)].on_stanza(stanza)
|
self.__iq_responses[(jid, id_)].on_stanza(stanza)
|
||||||
del self.__iq_responses[(jid, id)]
|
del self.__iq_responses[(jid, id_)]
|
||||||
raise xmpp.NodeProcessed
|
raise xmpp.NodeProcessed
|
||||||
|
|
||||||
jingle = stanza.getTag('jingle')
|
jingle = stanza.getTag('jingle')
|
||||||
|
@ -93,7 +94,7 @@ class ConnectionJingle(object):
|
||||||
else:
|
else:
|
||||||
sid = None
|
sid = None
|
||||||
for sesn in self._sessions.values():
|
for sesn in self._sessions.values():
|
||||||
if id in sesn.iq_ids:
|
if id_ in sesn.iq_ids:
|
||||||
sesn.on_stanza(stanza)
|
sesn.on_stanza(stanza)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -101,14 +102,15 @@ class ConnectionJingle(object):
|
||||||
if sid not in self._sessions:
|
if sid not in self._sessions:
|
||||||
#TODO: tie-breaking and other things...
|
#TODO: tie-breaking and other things...
|
||||||
newjingle = JingleSession(con=self, weinitiate=False, jid=jid,
|
newjingle = JingleSession(con=self, weinitiate=False, jid=jid,
|
||||||
iq_id=id, sid=sid)
|
iq_id=id_, sid=sid)
|
||||||
self._sessions[sid] = newjingle
|
self._sessions[sid] = newjingle
|
||||||
|
|
||||||
# we already have such session in dispatcher...
|
# we already have such session in dispatcher...
|
||||||
self._sessions[sid].collect_iq_id(id)
|
self._sessions[sid].collect_iq_id(id_)
|
||||||
self._sessions[sid].on_stanza(stanza)
|
self._sessions[sid].on_stanza(stanza)
|
||||||
# Delete invalid/unneeded sessions
|
# Delete invalid/unneeded sessions
|
||||||
if sid in self._sessions and self._sessions[sid].state == JingleStates.ended:
|
if sid in self._sessions and \
|
||||||
|
self._sessions[sid].state == JingleStates.ended:
|
||||||
self.delete_jingle_session(sid)
|
self.delete_jingle_session(sid)
|
||||||
|
|
||||||
raise xmpp.NodeProcessed
|
raise xmpp.NodeProcessed
|
||||||
|
@ -142,16 +144,20 @@ class ConnectionJingle(object):
|
||||||
def start_file_transfer(self, jid, file_props):
|
def start_file_transfer(self, jid, file_props):
|
||||||
logger.info("start file transfer with file: %s" % file_props)
|
logger.info("start file transfer with file: %s" % file_props)
|
||||||
contact = gajim.contacts.get_contact_with_highest_priority(self.name,
|
contact = gajim.contacts.get_contact_with_highest_priority(self.name,
|
||||||
gajim.get_jid_without_resource(jid))
|
gajim.get_jid_without_resource(jid))
|
||||||
if contact is None:
|
if contact is None:
|
||||||
return
|
return
|
||||||
use_security = contact.supports(xmpp.NS_JINGLE_XTLS)
|
use_security = contact.supports(xmpp.NS_JINGLE_XTLS)
|
||||||
jingle = JingleSession(self, weinitiate=True, jid=jid)
|
jingle = JingleSession(self, weinitiate=True, jid=jid)
|
||||||
self._sessions[jingle.sid] = jingle
|
self._sessions[jingle.sid] = jingle
|
||||||
file_props['sid'] = jingle.sid
|
file_props['sid'] = jingle.sid
|
||||||
c = JingleFileTransfer(jingle, file_props=file_props,
|
if contact.supports(xmpp.NS_JINGLE_BYTESTREAM):
|
||||||
use_security=use_security)
|
transport = JingleTransportSocks5()
|
||||||
c.hash_algo = self.__hash_support(contact)
|
elif contact.supports(xmpp.NS_JINGLE_IBB):
|
||||||
|
transport = JingleTransportIBB()
|
||||||
|
c = JingleFileTransfer(jingle, transport=transport,
|
||||||
|
file_props=file_props, use_security=use_security)
|
||||||
|
c.hash_algo = self.__hash_support(contact)
|
||||||
jingle.add_content('file' + helpers.get_random_string_16(), c)
|
jingle.add_content('file' + helpers.get_random_string_16(), c)
|
||||||
jingle.start_session()
|
jingle.start_session()
|
||||||
return c.transport.sid
|
return c.transport.sid
|
||||||
|
@ -172,13 +178,16 @@ class ConnectionJingle(object):
|
||||||
|
|
||||||
def iter_jingle_sessions(self, jid, sid=None, media=None):
|
def iter_jingle_sessions(self, jid, sid=None, media=None):
|
||||||
if sid:
|
if sid:
|
||||||
return (session for session in self._sessions.values() if session.sid == sid)
|
return (session for session in self._sessions.values() if \
|
||||||
sessions = (session for session in self._sessions.values() if session.peerjid == jid)
|
session.sid == sid)
|
||||||
|
sessions = (session for session in self._sessions.values() if \
|
||||||
|
session.peerjid == jid)
|
||||||
if media:
|
if media:
|
||||||
if media not in ('audio', 'video', 'file'):
|
if media not in ('audio', 'video', 'file'):
|
||||||
return tuple()
|
return tuple()
|
||||||
else:
|
else:
|
||||||
return (session for session in sessions if session.get_content(media))
|
return (session for session in sessions if \
|
||||||
|
session.get_content(media))
|
||||||
else:
|
else:
|
||||||
return sessions
|
return sessions
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,8 @@ Handles Jingle File Transfer (XEP 0234)
|
||||||
import gajim
|
import gajim
|
||||||
import xmpp
|
import xmpp
|
||||||
from jingle_content import contents, JingleContent
|
from jingle_content import contents, JingleContent
|
||||||
from jingle_transport import JingleTransportICEUDP, JingleTransportSocks5, JingleTransportIBB, TransportType
|
from jingle_transport import JingleTransportICEUDP, JingleTransportSocks5
|
||||||
|
from jingle_transport import JingleTransportIBB, TransportType
|
||||||
from common import helpers
|
from common import helpers
|
||||||
from common.socks5 import Socks5ReceiverClient, Socks5SenderClient
|
from common.socks5 import Socks5ReceiverClient, Socks5SenderClient
|
||||||
from common.connection_handlers_events import FileRequestReceivedEvent
|
from common.connection_handlers_events import FileRequestReceivedEvent
|
||||||
|
@ -150,9 +151,9 @@ class JingleFileTransfer(JingleContent):
|
||||||
|
|
||||||
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())
|
||||||
|
@ -161,15 +162,15 @@ class JingleFileTransfer(JingleContent):
|
||||||
if not gajim.socks5queue.get_file_props(
|
if not gajim.socks5queue.get_file_props(
|
||||||
self.session.connection.name, self.file_props['sid']):
|
self.session.connection.name, self.file_props['sid']):
|
||||||
gajim.socks5queue.add_file_props(self.session.connection.name,
|
gajim.socks5queue.add_file_props(self.session.connection.name,
|
||||||
self.file_props)
|
self.file_props)
|
||||||
fingerprint = None
|
fingerprint = None
|
||||||
if self.use_security:
|
if self.use_security:
|
||||||
fingerprint = 'client'
|
fingerprint = 'client'
|
||||||
if self.transport.type == TransportType.SOCKS5:
|
if self.transport.type == TransportType.SOCKS5:
|
||||||
gajim.socks5queue.connect_to_hosts(self.session.connection.name,
|
gajim.socks5queue.connect_to_hosts(self.session.connection.name,
|
||||||
self.file_props['sid'], self.send_candidate_used,
|
self.file_props['sid'], self.send_candidate_used,
|
||||||
self._on_connect_error, fingerprint=fingerprint,
|
self._on_connect_error, fingerprint=fingerprint,
|
||||||
receiving=False)
|
receiving=False)
|
||||||
elif self.transport.type == TransportType.IBB:
|
elif self.transport.type == TransportType.IBB:
|
||||||
self.state = STATE_TRANSFERING
|
self.state = STATE_TRANSFERING
|
||||||
self.__start_IBB_transfer(self.session.connection)
|
self.__start_IBB_transfer(self.session.connection)
|
||||||
|
@ -286,11 +287,11 @@ class JingleFileTransfer(JingleContent):
|
||||||
def __start_IBB_transfer(self, con):
|
def __start_IBB_transfer(self, con):
|
||||||
con.files_props[self.file_props['sid']] = self.file_props
|
con.files_props[self.file_props['sid']] = self.file_props
|
||||||
fp = open(self.file_props['file-name'], 'r')
|
fp = open(self.file_props['file-name'], 'r')
|
||||||
con.OpenStream( self.transport.sid, self.session.peerjid,
|
con.OpenStream( self.transport.sid, self.session.peerjid, fp,
|
||||||
fp, blocksize=4096)
|
blocksize=4096)
|
||||||
|
|
||||||
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.SOCKS5:
|
if self.transport.type == TransportType.SOCKS5:
|
||||||
self._listen_host()
|
self._listen_host()
|
||||||
|
@ -377,7 +378,7 @@ class JingleFileTransfer(JingleContent):
|
||||||
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')
|
||||||
|
@ -388,15 +389,15 @@ class JingleFileTransfer(JingleContent):
|
||||||
|
|
||||||
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,
|
||||||
fingerprint=fingerprint, type='sender')
|
fingerprint=fingerprint, type='sender')
|
||||||
else:
|
else:
|
||||||
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, type='receiver')
|
fingerprint=fingerprint, type='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):
|
||||||
'''
|
'''
|
||||||
|
@ -467,21 +468,18 @@ class JingleFileTransfer(JingleContent):
|
||||||
gajim.socks5queue.idx += 1
|
gajim.socks5queue.idx += 1
|
||||||
idx = gajim.socks5queue.idx
|
idx = gajim.socks5queue.idx
|
||||||
sockobj = Socks5SenderClient(gajim.idlequeue, idx,
|
sockobj = Socks5SenderClient(gajim.idlequeue, idx,
|
||||||
gajim.socks5queue,
|
gajim.socks5queue, _sock=None,
|
||||||
_sock=None,
|
host=str(streamhost_used['host']),
|
||||||
host=str(streamhost_used['host']),
|
port=int(streamhost_used['port']), fingerprint=None,
|
||||||
port=int(streamhost_used['port']),
|
connected=False, file_props=self.file_props)
|
||||||
fingerprint=None,
|
|
||||||
connected=False,
|
|
||||||
file_props=self.file_props)
|
|
||||||
else:
|
else:
|
||||||
sockobj = Socks5ReceiverClient(gajim.idlequeue, streamhost_used,
|
sockobj = Socks5ReceiverClient(gajim.idlequeue, streamhost_used,
|
||||||
sid=self.file_props['sid'],
|
sid=self.file_props['sid'],
|
||||||
file_props=self.file_props, fingerprint=None)
|
file_props=self.file_props, fingerprint=None)
|
||||||
sockobj.proxy = True
|
sockobj.proxy = True
|
||||||
sockobj.streamhost = streamhost_used
|
sockobj.streamhost = streamhost_used
|
||||||
gajim.socks5queue.add_sockobj(self.session.connection.name,
|
gajim.socks5queue.add_sockobj(self.session.connection.name,
|
||||||
sockobj, 'sender')
|
sockobj, 'sender')
|
||||||
streamhost_used['idx'] = sockobj.queue_idx
|
streamhost_used['idx'] = sockobj.queue_idx
|
||||||
# If we offered the nominated candidate used, we activate
|
# If we offered the nominated candidate used, we activate
|
||||||
# the proxy
|
# the proxy
|
||||||
|
|
|
@ -957,13 +957,17 @@ class ConnectionIBBytestream(ConnectionBytestream):
|
||||||
log.debug('StreamCloseHandler called sid->%s' % sid)
|
log.debug('StreamCloseHandler called sid->%s' % sid)
|
||||||
# look in sending files
|
# look in sending files
|
||||||
if sid in self.files_props.keys():
|
if sid in self.files_props.keys():
|
||||||
conn.send(stanza.buildReply('result'))
|
reply = stanza.buildReply('result')
|
||||||
|
reply.delChild('close')
|
||||||
|
conn.send(reply)
|
||||||
gajim.socks5queue.complete_transfer_cb(self.name, self.files_props[sid])
|
gajim.socks5queue.complete_transfer_cb(self.name, self.files_props[sid])
|
||||||
del self.files_props[sid]
|
del self.files_props[sid]
|
||||||
# look in receiving files
|
# look in receiving files
|
||||||
elif gajim.socks5queue.get_file_props(self.name, sid):
|
elif gajim.socks5queue.get_file_props(self.name, sid):
|
||||||
file_props = gajim.socks5queue.get_file_props(self.name, sid)
|
file_props = gajim.socks5queue.get_file_props(self.name, sid)
|
||||||
conn.send(stanza.buildReply('result'))
|
reply = stanza.buildReply('result')
|
||||||
|
reply.delChild('close')
|
||||||
|
conn.send(reply)
|
||||||
file_props['fp'].close()
|
file_props['fp'].close()
|
||||||
gajim.socks5queue.complete_transfer_cb(self.name, file_props)
|
gajim.socks5queue.complete_transfer_cb(self.name, file_props)
|
||||||
gajim.socks5queue.remove_file_props(self.name, sid)
|
gajim.socks5queue.remove_file_props(self.name, sid)
|
||||||
|
@ -1003,6 +1007,7 @@ class ConnectionIBBytestream(ConnectionBytestream):
|
||||||
if stanza.getTag('data'):
|
if stanza.getTag('data'):
|
||||||
if self.IBBMessageHandler(conn, stanza):
|
if self.IBBMessageHandler(conn, stanza):
|
||||||
reply = stanza.buildReply('result')
|
reply = stanza.buildReply('result')
|
||||||
|
reply.delChild('data')
|
||||||
conn.send(reply)
|
conn.send(reply)
|
||||||
raise xmpp.NodeProcessed
|
raise xmpp.NodeProcessed
|
||||||
elif syn_id == self.last_sent_ibb_id:
|
elif syn_id == self.last_sent_ibb_id:
|
||||||
|
|
Loading…
Reference in New Issue