Yann Leboulanger pushed to branch master at gajim / gajim
Commits: 2b9f9f3b by Emmanuel Gil Peyrot at 2017-06-14T20:26:37+01:00 Synchronise hashes support with XEP-0300 in Jingle
- - - - - 71f0e40c by Emmanuel Gil Peyrot at 2017-06-14T20:26:37+01:00 Update JingleFT to its latest experimental version
- - - - - 8356256f by Emmanuel Gil Peyrot at 2017-06-14T20:29:52+01:00 Update to XEP-0300 version 0.5 (:2 namespace).
- - - - - 09e6cfbb by Emmanuel Gil Peyrot at 2017-06-14T20:31:29+01:00 Update to XEP-0234 version 0.18.0 (:5 namespace).
- - - - - 785a0b61 by Emmanuel Gil Peyrot at 2017-06-14T20:47:41+01:00 Update to XEP-0300 version 0.5 (:2 namespace).
- - - - - aad5c160 by Emmanuel Gil Peyrot at 2017-06-14T20:47:41+01:00 Update to XEP-0234 version 0.18.0 (:5 namespace).
- - - - - 5606e5b9 by Yann Leboulanger at 2017-06-14T22:32:21+02:00 Merge branch 'jingleft' of https://dev.gajim.org/linkmauve/gajim into HEAD
- - - - - 7f4e9306 by Yann Leboulanger at 2017-06-16T21:15:24+02:00 do not decode received data via IBB before writing them to a file
- - - - - 46506150 by Yann Leboulanger at 2017-06-16T21:19:38+02:00 Merge branch 'jingleft' into 'master'
Update JingleFT support, and fix sending files
See merge request !89 - - - - -
14 changed files:
- src/chat_control.py - src/common/caps_cache.py - src/common/connection_handlers.py - src/common/connection_handlers_events.py - src/common/gajim.py - src/common/helpers.py - src/common/jingle.py - src/common/jingle_content.py - src/common/jingle_ft.py - src/common/jingle_session.py - src/common/protocol/bytestream.py - src/filetransfers_window.py - src/gui_interface.py - src/gui_menu_builder.py
Changes:
===================================== src/chat_control.py ===================================== --- a/src/chat_control.py +++ b/src/chat_control.py @@ -51,7 +51,7 @@ from common.logger import KindConstant from nbxmpp.protocol import NS_XHTML, NS_XHTML_IM, NS_FILE, NS_MUC from nbxmpp.protocol import NS_ESESSION from nbxmpp.protocol import NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO -from nbxmpp.protocol import NS_JINGLE_ICE_UDP, NS_JINGLE_FILE_TRANSFER +from nbxmpp.protocol import NS_JINGLE_ICE_UDP, NS_JINGLE_FILE_TRANSFER_5 from nbxmpp.protocol import NS_CHATSTATES from common.connection_handlers_events import MessageOutgoingEvent from common.exceptions import GajimGeneralException @@ -387,7 +387,7 @@ class ChatControl(ChatControlBase):
# Send file if ((self.contact.supports(NS_FILE) or \ - self.contact.supports(NS_JINGLE_FILE_TRANSFER)) and \ + self.contact.supports(NS_JINGLE_FILE_TRANSFER_5)) and \ (self.type_id == 'chat' or self.gc_contact.resource)) and \ self.contact.show != 'offline': self._send_file_button.set_sensitive(True) @@ -395,7 +395,7 @@ class ChatControl(ChatControlBase): else: self._send_file_button.set_sensitive(False) if not (self.contact.supports(NS_FILE) or self.contact.supports( - NS_JINGLE_FILE_TRANSFER)): + NS_JINGLE_FILE_TRANSFER_5)): self._send_file_button.set_tooltip_text(_( "This contact does not support file transfer.")) else:
===================================== src/common/caps_cache.py ===================================== --- a/src/common/caps_cache.py +++ b/src/common/caps_cache.py @@ -39,11 +39,11 @@ log = logging.getLogger('gajim.c.caps_cache')
from nbxmpp import (NS_XHTML_IM, NS_ESESSION, NS_CHATSTATES, NS_JINGLE_ICE_UDP, NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO, - NS_JINGLE_FILE_TRANSFER) + NS_JINGLE_FILE_TRANSFER_5) # Features where we cannot safely assume that the other side supports them FEATURE_BLACKLIST = [NS_CHATSTATES, NS_XHTML_IM, NS_ESESSION, NS_JINGLE_ICE_UDP, NS_JINGLE_RTP_AUDIO, NS_JINGLE_RTP_VIDEO, - NS_JINGLE_FILE_TRANSFER] + NS_JINGLE_FILE_TRANSFER_5]
# Query entry status codes NEW = 0
===================================== src/common/connection_handlers.py ===================================== --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -187,7 +187,7 @@ class ConnectionDisco: query.setAttr('node', 'http://gajim.org#' + gajim.version.split('-', 1)[ 0]) for f in (nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE, - nbxmpp.NS_COMMANDS, nbxmpp.NS_JINGLE_FILE_TRANSFER, + nbxmpp.NS_COMMANDS, nbxmpp.NS_JINGLE_FILE_TRANSFER_5, nbxmpp.NS_JINGLE_XTLS, nbxmpp.NS_PUBKEY_PUBKEY, nbxmpp.NS_PUBKEY_REVOKE, nbxmpp.NS_PUBKEY_ATTEST): feature = nbxmpp.Node('feature')
===================================== src/common/connection_handlers_events.py ===================================== --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -2306,12 +2306,12 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): self.file_props.session_type = 'jingle' self.file_props.stream_methods = nbxmpp.NS_BYTESTREAM desc = self.jingle_content.getTag('description') - if desc.getTag('offer'): - file_tag = desc.getTag('offer').getTag('file') + if self.jingle_content.getAttr('creator') == 'initiator': + file_tag = desc.getTag('file') self.file_props.sender = self.fjid self.file_props.receiver = self.conn._ft_get_our_jid() else: - file_tag = desc.getTag('request').getTag('file') + file_tag = desc.getTag('file') h = file_tag.getTag('hash') h = h.getData() if h else None n = file_tag.getTag('name')
===================================== src/common/gajim.py ===================================== --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -253,7 +253,7 @@ gajim_common_features = [nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE, nbxmpp.NS_REGISTER, nbxmpp.NS_VERSION, nbxmpp.NS_DATA, nbxmpp.NS_ENCRYPTED, 'msglog', 'sslc2s', 'stringprep', nbxmpp.NS_PING, nbxmpp.NS_TIME_REVISED, nbxmpp.NS_SSN, nbxmpp.NS_MOOD, nbxmpp.NS_ACTIVITY, nbxmpp.NS_NICK, - nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES, + nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES_2, nbxmpp.NS_HASHES_MD5, nbxmpp.NS_HASHES_SHA1, nbxmpp.NS_HASHES_SHA256, nbxmpp.NS_HASHES_SHA512, nbxmpp.NS_CONFERENCE]
===================================== src/common/helpers.py ===================================== --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -1289,7 +1289,7 @@ def update_optional_features(account = None): gajim.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_RTP_VIDEO) gajim.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_ICE_UDP) gajim.gajim_optional_features[a].append( - nbxmpp.NS_JINGLE_FILE_TRANSFER) + nbxmpp.NS_JINGLE_FILE_TRANSFER_5) gajim.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_XTLS) gajim.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_BYTESTREAM) gajim.gajim_optional_features[a].append(nbxmpp.NS_JINGLE_IBB)
===================================== src/common/jingle.py ===================================== --- a/src/common/jingle.py +++ b/src/common/jingle.py @@ -172,15 +172,19 @@ class ConnectionJingle(object): return c.transport.sid
def __hash_support(self, contact): - if contact.supports(nbxmpp.NS_HASHES): - if contact.supports(nbxmpp.NS_HASHES_SHA512): + if contact.supports(nbxmpp.NS_HASHES_2): + if contact.supports(nbxmpp.NS_HASHES_BLAKE2B_512): + return 'blake2b-512' + elif contact.supports(nbxmpp.NS_HASHES_BLAKE2B_256): + return 'blake2b-256' + elif contact.supports(nbxmpp.NS_HASHES_SHA3_512): + return 'sha3-512' + elif contact.supports(nbxmpp.NS_HASHES_SHA3_256): + return 'sha3-256' + elif contact.supports(nbxmpp.NS_HASHES_SHA512): return 'sha-512' elif contact.supports(nbxmpp.NS_HASHES_SHA256): return 'sha-256' - elif contact.supports(nbxmpp.NS_HASHES_SHA1): - return 'sha-1' - elif contact.supports(nbxmpp.NS_HASHES_MD5): - return 'md5' return None
def iter_jingle_sessions(self, jid, sid=None, media=None):
===================================== src/common/jingle_content.py ===================================== --- a/src/common/jingle_content.py +++ b/src/common/jingle_content.py @@ -175,12 +175,8 @@ class JingleContent:
def _fill_content(self, content): description_node = nbxmpp.simplexml.Node( - tag=nbxmpp.NS_JINGLE_FILE_TRANSFER + ' description') - if self.session.werequest: - simode = nbxmpp.simplexml.Node(tag='request') - else: - simode = nbxmpp.simplexml.Node(tag='offer') - file_tag = simode.setTag('file') + tag=nbxmpp.NS_JINGLE_FILE_TRANSFER_5 + ' description') + file_tag = description_node.setTag('file') if self.file_props.name: node = nbxmpp.simplexml.Node(tag='name') node.addData(self.file_props.name) @@ -196,7 +192,7 @@ class JingleContent: if self.file_props.type_ == 'r': if self.file_props.hash_: file_tag.addChild('hash', attrs={'algo': self.file_props.algo}, - namespace=nbxmpp.NS_HASHES, + namespace=nbxmpp.NS_HASHES_2, payload=self.file_props.hash_) else: # if the file is less than 10 mb, then it is small @@ -217,7 +213,6 @@ class JingleContent: desc = file_tag.setTag('desc') if self.file_props.desc: desc.setData(self.file_props.desc) - description_node.addChild(node=simode) if self.use_security: security = nbxmpp.simplexml.Node( tag=nbxmpp.NS_JINGLE_XTLS + ' security')
===================================== src/common/jingle_ft.py ===================================== --- a/src/common/jingle_ft.py +++ b/src/common/jingle_ft.py @@ -155,7 +155,7 @@ class JingleFileTransfer(JingleContent): checksum = nbxmpp.Node(tag='checksum', payload=[nbxmpp.Node(tag='file', payload=[self._compute_hash()])]) - checksum.setNamespace(nbxmpp.NS_JINGLE_FILE_TRANSFER) + checksum.setNamespace(nbxmpp.NS_JINGLE_FILE_TRANSFER_5) self.session.__session_info(checksum) pjid = gajim.get_jid_without_resource(self.session.peerjid) file_info = {'name' : self.file_props.name, @@ -176,7 +176,7 @@ class JingleFileTransfer(JingleContent): except IOError: # can't open file return - h = nbxmpp.Hashes() + h = nbxmpp.Hashes2() hash_ = h.calculateHash(self.file_props.algo, file_) file_.close() # DEBUG @@ -410,4 +410,4 @@ class JingleFileTransfer(JingleContent): def get_content(desc): return JingleFileTransfer
-contents[nbxmpp.NS_JINGLE_FILE_TRANSFER] = get_content +contents[nbxmpp.NS_JINGLE_FILE_TRANSFER_5] = get_content
===================================== src/common/jingle_session.py ===================================== --- a/src/common/jingle_session.py +++ b/src/common/jingle_session.py @@ -444,9 +444,9 @@ class JingleSession: for child in payload: if child.getName() == 'checksum': hash_ = child.getTag('file').getTag(name='hash', - namespace=nbxmpp.NS_HASHES) + namespace=nbxmpp.NS_HASHES_2) algo = hash_.getAttr('algo') - if algo in nbxmpp.Hashes.supported: + if algo in nbxmpp.Hashes2.supported: file_props = FilesProp.getFileProp(self.connection.name, self.sid) file_props.algo = algo
===================================== src/common/protocol/bytestream.py ===================================== --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -926,10 +926,10 @@ class ConnectionIBBytestream(ConnectionBytestream): log.debug('ReceiveHandler called sid->%s seq->%s' % (sid, seq)) try: seq = int(seq) - data = base64.b64decode(data.encode('utf-8')).decode('utf-8') + data = base64.b64decode(data.encode('utf-8')) except Exception: seq = '' - data = '' + data = b'' err = None file_props = FilesProp.getFilePropByTransportSid(self.name, sid) if file_props is None:
===================================== src/filetransfers_window.py ===================================== --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -40,7 +40,7 @@ from common import helpers from common.file_props import FilesProp from common.protocol.bytestream import (is_transfer_active, is_transfer_paused, is_transfer_stopped) -from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER +from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER_5 import logging log = logging.getLogger('gajim.filetransfer_window')
@@ -357,7 +357,7 @@ class FileTransfersWindow: file_path, file_name, file_desc) if file_props is None: return False - if contact.supports(NS_JINGLE_FILE_TRANSFER): + if contact.supports(NS_JINGLE_FILE_TRANSFER_5): log.info("contact %s supports jingle file transfer"%(contact.get_full_jid())) gajim.connections[account].start_file_transfer(contact.get_full_jid(), file_props)
===================================== src/gui_interface.py ===================================== --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -73,7 +73,7 @@ from session import ChatControlSession from common import sleepy
from nbxmpp import idlequeue -from nbxmpp import Hashes +from nbxmpp import Hashes2 from common.zeroconf import connection_zeroconf from common import resolver from common import caps_cache @@ -988,7 +988,7 @@ class Interface: session = gajim.connections[account].get_jingle_session(jid=None, sid=file_props.sid) ft_win = self.instances['file_transfers'] - h = Hashes() + h = Hashes2() try: file_ = open(file_props.file_name, 'rb') except:
===================================== src/gui_menu_builder.py ===================================== --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -27,7 +27,7 @@ from common import gajim from common import helpers from common import i18n from nbxmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC, NS_ESESSION -from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER, NS_CONFERENCE +from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER_5, NS_CONFERENCE from gtkgui_helpers import get_action
def build_resources_submenu(contacts, account, action, room_jid=None, @@ -260,7 +260,7 @@ control=None, gc_contact=None, is_anonymous=True): else: start_chat_menuitem.connect('activate', gajim.interface.on_open_chat_window, contact, account) - if contact.supports(NS_FILE) or contact.supports(NS_JINGLE_FILE_TRANSFER): + if contact.supports(NS_FILE) or contact.supports(NS_JINGLE_FILE_TRANSFER_5): send_file_menuitem.set_sensitive(True) send_file_menuitem.connect('activate', roster.on_send_file_menuitem_activate, contact, account)
View it on GitLab: https://dev.gajim.org/gajim/gajim/compare/44430988a5d04cc763a10b1a6008a4430d...