Move XEP-0231 into its own module
This commit is contained in:
parent
2ec1baa7bd
commit
b4d34bf7f6
|
@ -116,8 +116,6 @@ class CommonConnection:
|
||||||
self.muc_jid = {} # jid of muc server for each transport type
|
self.muc_jid = {} # jid of muc server for each transport type
|
||||||
self._stun_servers = [] # STUN servers of our jabber server
|
self._stun_servers = [] # STUN servers of our jabber server
|
||||||
|
|
||||||
self.awaiting_cids = {} # Used for XEP-0231
|
|
||||||
|
|
||||||
# Tracks the calls of the connect_machine() method
|
# Tracks the calls of the connect_machine() method
|
||||||
self._connect_machine_calls = 0
|
self._connect_machine_calls = 0
|
||||||
|
|
||||||
|
|
|
@ -446,54 +446,6 @@ class ConnectionHandlers(ConnectionSocks5Bytestream,
|
||||||
app.nec.push_incoming_event(GcMessageReceivedEvent(None,
|
app.nec.push_incoming_event(GcMessageReceivedEvent(None,
|
||||||
conn=self, msg_obj=msg_obj))
|
conn=self, msg_obj=msg_obj))
|
||||||
|
|
||||||
def _on_bob_received(self, conn, result, cid):
|
|
||||||
"""
|
|
||||||
Called when we receive BoB data
|
|
||||||
"""
|
|
||||||
if cid not in self.awaiting_cids:
|
|
||||||
return
|
|
||||||
|
|
||||||
if result.getType() == 'result':
|
|
||||||
data = result.getTags('data', namespace=nbxmpp.NS_BOB)
|
|
||||||
if data.getAttr('cid') == cid:
|
|
||||||
for func in self.awaiting_cids[cid]:
|
|
||||||
cb = func[0]
|
|
||||||
args = func[1]
|
|
||||||
pos = func[2]
|
|
||||||
bob_data = data.getData()
|
|
||||||
def recurs(node, cid, data):
|
|
||||||
if node.getData() == 'cid:' + cid:
|
|
||||||
node.setData(data)
|
|
||||||
else:
|
|
||||||
for child in node.getChildren():
|
|
||||||
recurs(child, cid, data)
|
|
||||||
recurs(args[pos], cid, bob_data)
|
|
||||||
cb(*args)
|
|
||||||
del self.awaiting_cids[cid]
|
|
||||||
return
|
|
||||||
|
|
||||||
# An error occured, call callback without modifying data.
|
|
||||||
for func in self.awaiting_cids[cid]:
|
|
||||||
cb = func[0]
|
|
||||||
args = func[1]
|
|
||||||
cb(*args)
|
|
||||||
del self.awaiting_cids[cid]
|
|
||||||
|
|
||||||
def get_bob_data(self, cid, to, callback, args, position):
|
|
||||||
"""
|
|
||||||
Request for BoB (XEP-0231) and when data will arrive, call callback
|
|
||||||
with given args, after having replaced cid by it's data in
|
|
||||||
args[position]
|
|
||||||
"""
|
|
||||||
if cid in self.awaiting_cids:
|
|
||||||
self.awaiting_cids[cid].appends((callback, args, position))
|
|
||||||
else:
|
|
||||||
self.awaiting_cids[cid] = [(callback, args, position)]
|
|
||||||
iq = nbxmpp.Iq(to=to, typ='get')
|
|
||||||
iq.addChild(name='data', attrs={'cid': cid}, namespace=nbxmpp.NS_BOB)
|
|
||||||
self.connection.SendAndCallForResponse(iq, self._on_bob_received,
|
|
||||||
{'cid': cid})
|
|
||||||
|
|
||||||
def _nec_agent_removed(self, obj):
|
def _nec_agent_removed(self, obj):
|
||||||
if obj.conn.name != self.name:
|
if obj.conn.name != self.name:
|
||||||
return
|
return
|
||||||
|
|
|
@ -490,7 +490,8 @@ class GcMessageReceivedEvent(nec.NetworkIncomingEvent):
|
||||||
uri.setData(data.getData())
|
uri.setData(data.getData())
|
||||||
found = True
|
found = True
|
||||||
if not found:
|
if not found:
|
||||||
self.conn.get_bob_data(uri_data, self.fjid,
|
self.conn.get_module('BitsOfBinary').get_bob_data(
|
||||||
|
uri_data, self.fjid,
|
||||||
self.conn._dispatch_gc_msg_with_captcha,
|
self.conn._dispatch_gc_msg_with_captcha,
|
||||||
[self.stanza, self.msg_obj], 0)
|
[self.stanza, self.msg_obj], 0)
|
||||||
return
|
return
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
# Copyright (C) 2018 Emmanuel Gil Peyrot <linkmauve AT linkmauve.fr>
|
||||||
|
#
|
||||||
|
# This file is part of Gajim.
|
||||||
|
#
|
||||||
|
# Gajim is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published
|
||||||
|
# by the Free Software Foundation; version 3 only.
|
||||||
|
#
|
||||||
|
# Gajim is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Gajim. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
import nbxmpp
|
||||||
|
|
||||||
|
log = logging.getLogger('gajim.c.m.bob')
|
||||||
|
|
||||||
|
|
||||||
|
class BitsOfBinary:
|
||||||
|
def __init__(self, con):
|
||||||
|
self._con = con
|
||||||
|
self._account = con.name
|
||||||
|
|
||||||
|
self.handlers = [
|
||||||
|
('iq', self._answer_bob_request, 'get', nbxmpp.NS_BOB)
|
||||||
|
]
|
||||||
|
|
||||||
|
# Used to track which cids are in-flight.
|
||||||
|
self.awaiting_cids = {}
|
||||||
|
|
||||||
|
def _answer_bob_request(self, _con, stanza):
|
||||||
|
log.info('Request from %s for BoB data', stanza.getFrom())
|
||||||
|
iq = stanza.buildReply('error')
|
||||||
|
err = nbxmpp.ErrorNode(nbxmpp.ERR_ITEM_NOT_FOUND)
|
||||||
|
iq.addChild(node=err)
|
||||||
|
log.info('Sending item-not-found')
|
||||||
|
self._con.connection.send(iq)
|
||||||
|
raise nbxmpp.NodeProcessed
|
||||||
|
|
||||||
|
def _on_bob_received(self, _con, result, cid):
|
||||||
|
"""
|
||||||
|
Called when we receive BoB data
|
||||||
|
"""
|
||||||
|
if cid not in self.awaiting_cids:
|
||||||
|
return
|
||||||
|
|
||||||
|
if result.getType() == 'result':
|
||||||
|
data = result.getTags('data', namespace=nbxmpp.NS_BOB)
|
||||||
|
if data.getAttr('cid') == cid:
|
||||||
|
for func in self.awaiting_cids[cid]:
|
||||||
|
cb = func[0]
|
||||||
|
args = func[1]
|
||||||
|
pos = func[2]
|
||||||
|
bob_data = data.getData()
|
||||||
|
def recurs(node, cid, data):
|
||||||
|
if node.getData() == 'cid:' + cid:
|
||||||
|
node.setData(data)
|
||||||
|
else:
|
||||||
|
for child in node.getChildren():
|
||||||
|
recurs(child, cid, data)
|
||||||
|
recurs(args[pos], cid, bob_data)
|
||||||
|
cb(*args)
|
||||||
|
del self.awaiting_cids[cid]
|
||||||
|
return
|
||||||
|
|
||||||
|
# An error occured, call callback without modifying data.
|
||||||
|
for func in self.awaiting_cids[cid]:
|
||||||
|
cb = func[0]
|
||||||
|
args = func[1]
|
||||||
|
cb(*args)
|
||||||
|
del self.awaiting_cids[cid]
|
||||||
|
|
||||||
|
def get_bob_data(self, cid, to, callback, args, position):
|
||||||
|
"""
|
||||||
|
Request for BoB (XEP-0231) and when data will arrive, call callback
|
||||||
|
with given args, after having replaced cid by it's data in
|
||||||
|
args[position]
|
||||||
|
"""
|
||||||
|
if cid in self.awaiting_cids:
|
||||||
|
self.awaiting_cids[cid].appends((callback, args, position))
|
||||||
|
else:
|
||||||
|
self.awaiting_cids[cid] = [(callback, args, position)]
|
||||||
|
iq = nbxmpp.Iq(to=to, typ='get')
|
||||||
|
iq.addChild(name='data', attrs={'cid': cid}, namespace=nbxmpp.NS_BOB)
|
||||||
|
self._con.connection.SendAndCallForResponse(
|
||||||
|
iq, self._on_bob_received, {'cid': cid})
|
||||||
|
|
||||||
|
|
||||||
|
def get_instance(*args, **kwargs):
|
||||||
|
return BitsOfBinary(*args, **kwargs), 'BitsOfBinary'
|
Loading…
Reference in New Issue