enable FT over proxy
This commit is contained in:
parent
2fec9f56f3
commit
c29fbdb617
|
@ -24,6 +24,7 @@ import xmpp
|
||||||
from jingle_content import contents, JingleContent
|
from jingle_content import contents, JingleContent
|
||||||
from jingle_transport import JingleTransportICEUDP, JingleTransportSocks5
|
from jingle_transport import JingleTransportICEUDP, JingleTransportSocks5
|
||||||
from common import helpers
|
from common import helpers
|
||||||
|
from common.socks5 import Socks5Receiver
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -99,6 +100,7 @@ class JingleFileTransfer(JingleContent):
|
||||||
file_props['transfered_size'] = []
|
file_props['transfered_size'] = []
|
||||||
|
|
||||||
self.file_props = file_props
|
self.file_props = file_props
|
||||||
|
self.session.connection.files_props[file_props['sid']] = file_props
|
||||||
if self.transport is None:
|
if self.transport is None:
|
||||||
self.transport = JingleTransportSocks5()
|
self.transport = JingleTransportSocks5()
|
||||||
self.transport.set_our_jid(self.session.ourjid)
|
self.transport.set_our_jid(self.session.ourjid)
|
||||||
|
@ -134,6 +136,36 @@ 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")
|
||||||
|
|
||||||
|
streamhost_cid = content.getTag('transport').getTag('candidate-used').getAttr('cid')
|
||||||
|
streamhost_used = None
|
||||||
|
for cand in self.transport.candidates:
|
||||||
|
if cand['candidate_id'] == streamhost_cid:
|
||||||
|
streamhost_used = cand
|
||||||
|
break
|
||||||
|
if streamhost_used == None:
|
||||||
|
log.info("unknow streamhost")
|
||||||
|
return
|
||||||
|
if streamhost_used['type'] == 'proxy':
|
||||||
|
self.file_props['streamhost-used'] = True
|
||||||
|
for proxy in self.file_props['proxyhosts']:
|
||||||
|
if proxy['host'] == streamhost_used['host'] and \
|
||||||
|
proxy['port'] == streamhost_used['port'] and \
|
||||||
|
proxy['jid'] == streamhost_used['jid']:
|
||||||
|
streamhost_used = proxy
|
||||||
|
break
|
||||||
|
if 'streamhosts' not in self.file_props:
|
||||||
|
self.file_props['streamhosts'] = []
|
||||||
|
self.file_props['streamhosts'].append(streamhost_used)
|
||||||
|
self.file_props['is_a_proxy'] = True
|
||||||
|
receiver = Socks5Receiver(gajim.idlequeue, streamhost_used,
|
||||||
|
self.file_props['sid'], self.file_props)
|
||||||
|
#gajim.socks5queue.add_file_props(self.session.ourjid, self.file_props)
|
||||||
|
gajim.socks5queue.add_receiver(self.session.ourjid, receiver)
|
||||||
|
streamhost_used['idx'] = receiver.queue_idx
|
||||||
|
gajim.socks5queue.on_success = self.transport._on_proxy_auth_ok
|
||||||
|
pass
|
||||||
|
else:
|
||||||
jid = gajim.get_jid_without_resource(self.session.ourjid)
|
jid = gajim.get_jid_without_resource(self.session.ourjid)
|
||||||
gajim.socks5queue.send_file(self.file_props, jid)
|
gajim.socks5queue.send_file(self.file_props, jid)
|
||||||
|
|
||||||
|
@ -141,6 +173,7 @@ class JingleFileTransfer(JingleContent):
|
||||||
log.info("__on_iq_result")
|
log.info("__on_iq_result")
|
||||||
|
|
||||||
if self.weinitiate:
|
if self.weinitiate:
|
||||||
|
self.session.connection.files_props[self.file_props['sid']] = self.file_props
|
||||||
receiver = self.file_props['receiver']
|
receiver = self.file_props['receiver']
|
||||||
sender = self.file_props['sender']
|
sender = self.file_props['sender']
|
||||||
|
|
||||||
|
|
|
@ -160,6 +160,8 @@ class JingleTransportSocks5(JingleTransport):
|
||||||
c['type'] = 'direct'
|
c['type'] = 'direct'
|
||||||
c['jid'] = self.ourjid
|
c['jid'] = self.ourjid
|
||||||
c['priority'] = (2**16) * type_preference
|
c['priority'] = (2**16) * type_preference
|
||||||
|
c['initiator'] = self.file_props['sender']
|
||||||
|
c['target'] = self.file_props['receiver']
|
||||||
local_ip_cand.append(c)
|
local_ip_cand.append(c)
|
||||||
|
|
||||||
self.candidates += local_ip_cand
|
self.candidates += local_ip_cand
|
||||||
|
@ -181,6 +183,8 @@ class JingleTransportSocks5(JingleTransport):
|
||||||
c['type'] = 'direct'
|
c['type'] = 'direct'
|
||||||
c['jid'] = self.ourjid
|
c['jid'] = self.ourjid
|
||||||
c['priority'] = (2**16) * type_preference
|
c['priority'] = (2**16) * type_preference
|
||||||
|
c['initiator'] = self.file_props['sender']
|
||||||
|
c['target'] = self.file_props['receiver']
|
||||||
additional_ip_cand.append(c)
|
additional_ip_cand.append(c)
|
||||||
self.candidates += additional_ip_cand
|
self.candidates += additional_ip_cand
|
||||||
|
|
||||||
|
@ -205,9 +209,26 @@ class JingleTransportSocks5(JingleTransport):
|
||||||
c['type'] = 'proxy'
|
c['type'] = 'proxy'
|
||||||
c['jid'] = proxyhost['jid']
|
c['jid'] = proxyhost['jid']
|
||||||
c['priority'] = (2**16) * type_preference
|
c['priority'] = (2**16) * type_preference
|
||||||
|
c['initiator'] = self.file_props['sender']
|
||||||
|
c['target'] = self.file_props['receiver']
|
||||||
proxy_cand.append(c)
|
proxy_cand.append(c)
|
||||||
self.candidates += proxy_cand
|
self.candidates += proxy_cand
|
||||||
|
|
||||||
|
def _on_proxy_auth_ok(self, proxy):
|
||||||
|
log.info('proxy auth ok for ' + str(proxy))
|
||||||
|
# send activate request to proxy, send activated confirmation to peer
|
||||||
|
if not self.connection:
|
||||||
|
return
|
||||||
|
file_props = self.file_props
|
||||||
|
iq = xmpp.Iq(to=proxy['initiator'], typ='set')
|
||||||
|
auth_id = "au_" + proxy['sid']
|
||||||
|
iq.setID(auth_id)
|
||||||
|
query = iq.setTag('query', namespace=xmpp.NS_BYTESTREAM)
|
||||||
|
query.setAttr('sid', proxy['sid'])
|
||||||
|
activate = query.setTag('activate')
|
||||||
|
activate.setData(file_props['proxy_receiver'])
|
||||||
|
iq.setID(auth_id)
|
||||||
|
self.connection.connection.send(iq)
|
||||||
|
|
||||||
import farsight
|
import farsight
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue