def accept_tube_si_connection(): bytestream, profile = create_from_si_offer(stream, q, bytestream_cls, si_event.stanza, '[email protected]/test') assert profile == ns.TUBES muc_stream_node = xpath.queryForNodes('/iq/si/muc-stream[@xmlns="%s"]' % ns.TUBES, si_event.stanza)[0] assert muc_stream_node is not None assert muc_stream_node['tube'] == str(stream_tube_id) # set the real jid of the target as 'to' because the XMPP server changes # it when delivering the IQ result, si = bytestream.create_si_reply(si_event.stanza, 'test@localhost/Resource') si.addElement((ns.TUBES, 'tube')) stream.send(result) bytestream.wait_bytestream_open() return bytestream
def _check_file_transfer_offer_iq(self, iq_event): self.iq = iq_event.stanza self.bytestream, profile = create_from_si_offer( self.stream, self.q, self.bytestream_cls, iq_event.stanza, 'test@localhost/Resource') assert self.iq['to'] == self.contact_full_jid assert profile == ns.FILE_TRANSFER file_node = xpath.queryForNodes('/iq/si/file', self.iq)[0] assert file_node['name'] == self.file.name assert file_node['size'] == str(self.file.size) assert file_node['mime-type'] == self.file.content_type assert file_node['hash'] == self.file.hash date = datetime.datetime.utcfromtimestamp( self.file.date).strftime('%FT%H:%M:%SZ') assert file_node['date'] == date, file_node['date'] desc_node = xpath.queryForNodes("/iq/si/file/desc", self.iq)[0] self.desc = desc_node.children[0] assert self.desc == self.file.description # Gabble supports resume range = xpath.queryForNodes('/iq/si/file/range', self.iq)[0] assert range is not None # Metadata forms forms = extract_data_forms( xpath.queryForNodes('/iq/si/file/x', self.iq)) if self.service_name: assertEquals({'ServiceName': [self.service_name]}, forms[ns.TP_FT_METADATA_SERVICE]) else: assert ns.TP_FT_METADATA_SERVICE not in forms if self.metadata: assertEquals(self.metadata, forms[ns.TP_FT_METADATA]) else: assert ns.TP_FT_METADATA not in forms
def wait_si_and_return_proxies(q, stream): e = q.expect('stream-iq', to='alice@localhost/Test') bytestream, profile = create_from_si_offer(stream, q, BytestreamS5B, e.stanza, 'test@localhost/Resource') # Alice accepts the SI result, si = bytestream.create_si_reply(e.stanza) stream.send(result) e = q.expect('stream-iq', to='alice@localhost/Test') proxies = [] for node in xpath.queryForNodes('/iq/query/streamhost', e.stanza): if node['jid'] == 'test@localhost/Resource': # skip our own stream hosts continue proxies.append((node['jid'], node['host'], node['port'])) return proxies
def accept_tube_si_connection(): bytestream, profile = create_from_si_offer(stream, q, bytestream_cls, si_event.stanza, '[email protected]/test') assert profile == ns.TUBES muc_stream_node = xpath.queryForNodes( '/iq/si/muc-stream[@xmlns="%s"]' % ns.TUBES, si_event.stanza)[0] assert muc_stream_node is not None assert muc_stream_node['tube'] == str(stream_tube_id) # set the real jid of the target as 'to' because the XMPP server changes # it when delivering the IQ result, si = bytestream.create_si_reply(si_event.stanza, 'test@localhost/Resource') si.addElement((ns.TUBES, 'tube')) stream.send(result) bytestream.wait_bytestream_open() return bytestream
def alice_accepts_tube(q, stream, iq_event, dbus_tube_id, bytestream_cls): iq = iq_event.stanza bytestream, profile = create_from_si_offer(stream, q, bytestream_cls, iq, 'test@localhost/Resource') assert profile == ns.TUBES tube_nodes = xpath.queryForNodes('/iq/si/tube[@xmlns="%s"]' % ns.TUBES, iq) assert len(tube_nodes) == 1 tube = tube_nodes[0] tube['type'] = 'dbus' assert tube['initiator'] == 'test@localhost' assert tube['service'] == 'com.example.TestCase' assert tube['id'] == str(dbus_tube_id) params = {} parameter_nodes = xpath.queryForNodes('/tube/parameters/parameter', tube) for node in parameter_nodes: assert node['name'] not in params params[node['name']] = (node['type'], str(node)) assert params == { 'ay': ('bytes', 'aGVsbG8='), 's': ('str', 'hello'), 'i': ('int', '-123'), 'u': ('uint', '123'), } # Alice accepts the tube result, si = bytestream.create_si_reply(iq) si.addElement((ns.TUBES, 'tube')) stream.send(result) bytestream.wait_bytestream_open() q.expect('dbus-signal', signal='TubeChannelStateChanged', args=[cs.TUBE_STATE_OPEN]) return bytestream
def alice_accepts_tube(q, stream, iq_event, dbus_tube_id, bytestream_cls): iq = iq_event.stanza bytestream, profile = create_from_si_offer(stream, q, bytestream_cls, iq, 'test@localhost/Resource') assert profile == ns.TUBES tube_nodes = xpath.queryForNodes('/iq/si/tube[@xmlns="%s"]' % ns.TUBES, iq) assert len(tube_nodes) == 1 tube = tube_nodes[0] tube['type'] = 'dbus' assert tube['initiator'] == 'test@localhost' assert tube['service'] == 'com.example.TestCase' assert tube['id'] == str(dbus_tube_id) params = {} parameter_nodes = xpath.queryForNodes('/tube/parameters/parameter', tube) for node in parameter_nodes: assert node['name'] not in params params[node['name']] = (node['type'], str(node)) assert params == {'ay': ('bytes', 'aGVsbG8='), 's': ('str', 'hello'), 'i': ('int', '-123'), 'u': ('uint', '123'), } # Alice accepts the tube result, si = bytestream.create_si_reply(iq) si.addElement((ns.TUBES, 'tube')) stream.send(result) bytestream.wait_bytestream_open() q.expect('dbus-signal', signal='TubeChannelStateChanged', args=[cs.TUBE_STATE_OPEN]) return bytestream
def _check_file_transfer_offer_iq(self, iq_event): self.iq = iq_event.stanza self.bytestream, profile = create_from_si_offer(self.stream, self.q, self.bytestream_cls, iq_event.stanza, 'test@localhost/Resource') assert self.iq['to'] == self.contact_full_jid assert profile == ns.FILE_TRANSFER file_node = xpath.queryForNodes('/iq/si/file', self.iq)[0] assert file_node['name'] == self.file.name assert file_node['size'] == str(self.file.size) assert file_node['mime-type'] == self.file.content_type assert file_node['hash'] == self.file.hash date = datetime.datetime.utcfromtimestamp(self.file.date).strftime('%FT%H:%M:%SZ') assert file_node['date'] == date, file_node['date'] desc_node = xpath.queryForNodes("/iq/si/file/desc", self.iq)[0] self.desc = desc_node.children[0] assert self.desc == self.file.description # Gabble supports resume range = xpath.queryForNodes('/iq/si/file/range', self.iq)[0] assert range is not None # Metadata forms forms = extract_data_forms(xpath.queryForNodes('/iq/si/file/x', self.iq)) if self.service_name: assertEquals({'ServiceName': [self.service_name]}, forms[ns.TP_FT_METADATA_SERVICE]) else: assert ns.TP_FT_METADATA_SERVICE not in forms if self.metadata: assertEquals(self.metadata, forms[ns.TP_FT_METADATA]) else: assert ns.TP_FT_METADATA not in forms
def expect_tube_activity(q, bus, conn, stream, bytestream_cls, address_type, address, access_control, access_control_param): event_socket, event_iq, conn_id = t.connect_to_cm_socket( q, bob_jid, address_type, address, access_control, access_control_param) protocol = event_socket.protocol data = "hello initiator" protocol.sendData(data) bytestream, profile = create_from_si_offer(stream, q, bytestream_cls, event_iq.stanza, 'test@localhost/Resource') assert profile == ns.TUBES stream_node = xpath.queryForNodes('/iq/si/stream[@xmlns="%s"]' % ns.TUBES, event_iq.stanza)[0] assert stream_node is not None assert stream_node['tube'] == str(stream_tube_id) result, si = bytestream.create_si_reply(event_iq.stanza) si.addElement((ns.TUBES, 'tube')) stream.send(result) bytestream.wait_bytestream_open() binary = bytestream.get_data(len(data)) assert data == binary, binary # reply to the initiator bytestream.send_data('hello joiner') e = q.expect('socket-data') assert e.data == 'hello joiner' return bytestream, conn_id
def _check_file_transfer_offer_iq(self, iq_event): self.iq = iq_event.stanza self.bytestream, profile = create_from_si_offer(self.stream, self.q, self.bytestream_cls, iq_event.stanza, 'test@localhost/Resource') assert self.iq['to'] == self.contact_full_jid assert profile == ns.FILE_TRANSFER file_node = xpath.queryForNodes('/iq/si/file', self.iq)[0] assert file_node['name'] == self.file.name assert file_node['size'] == str(self.file.size) assert file_node['mime-type'] == self.file.content_type assert file_node['hash'] == self.file.hash date = datetime.datetime.utcfromtimestamp(self.file.date).strftime('%FT%H:%M:%SZ') assert file_node['date'] == date, file_node['date'] desc_node = xpath.queryForNodes("/iq/si/file/desc", self.iq)[0] self.desc = desc_node.children[0] assert self.desc == self.file.description # Gabble supports resume range = xpath.queryForNodes('/iq/si/file/range', self.iq)[0] assert range is not None
def expect_tube_activity(q, bus, conn, stream, bytestream_cls, address_type, address, access_control, access_control_param): event_socket, event_iq, conn_id = t.connect_to_cm_socket(q, bob_jid, address_type, address, access_control, access_control_param) protocol = event_socket.protocol data = "hello initiator" protocol.sendData(data) bytestream, profile = create_from_si_offer(stream, q, bytestream_cls, event_iq.stanza, 'test@localhost/Resource') assert profile == ns.TUBES stream_node = xpath.queryForNodes('/iq/si/stream[@xmlns="%s"]' % ns.TUBES, event_iq.stanza)[0] assert stream_node is not None assert stream_node['tube'] == str(stream_tube_id) result, si = bytestream.create_si_reply(event_iq.stanza) si.addElement((ns.TUBES, 'tube')) stream.send(result) bytestream.wait_bytestream_open() binary = bytestream.get_data(len(data)) assert data == binary, binary # reply to the initiator bytestream.send_data('hello joiner') e = q.expect('socket-data') assert e.data == 'hello joiner' return bytestream, conn_id
def test(q, bus, conn, stream): iq_event, disco_event = q.expect_many( EventPattern('stream-iq', to=None, query_ns='vcard-temp', query_name='vCard'), EventPattern('stream-iq', to='localhost', query_ns=ns.DISCO_ITEMS)) acknowledge_iq(stream, iq_event.stanza) announce_socks5_proxy(q, stream, disco_event.stanza) join_muc(q, bus, conn, stream, '*****@*****.**') # bob offers a stream tube stream_tube_id = 1 presence = make_muc_presence('owner', 'moderator', '*****@*****.**', 'bob') tubes = presence.addElement((ns.TUBES, 'tubes')) tube = tubes.addElement((None, 'tube')) tube['type'] = 'stream' tube['service'] = 'echo' tube['id'] = str(stream_tube_id) parameters = tube.addElement((None, 'parameters')) stream.send(presence) def new_chan_predicate(e): path, props = e.args[0][0] return props[cs.CHANNEL_TYPE] == cs.CHANNEL_TYPE_STREAM_TUBE e = q.expect('dbus-signal', signal='NewChannels', predicate=new_chan_predicate) channels = e.args[0] assert len(channels) == 1 path, props = channels[0] assert props[cs.CHANNEL_TYPE] == cs.CHANNEL_TYPE_STREAM_TUBE tube_chan = bus.get_object(conn.bus_name, path) tube_iface = dbus.Interface(tube_chan, cs.CHANNEL_TYPE_STREAM_TUBE) call_async(q, tube_iface, 'Accept', 0, 0, '', byte_arrays=True) accept_return_event, _ = q.expect_many( EventPattern('dbus-return', method='Accept'), EventPattern('dbus-signal', signal='TubeChannelStateChanged', args=[cs.TUBE_CHANNEL_STATE_OPEN])) unix_socket_adr = accept_return_event.value[0] factory = EventProtocolClientFactory(q) reactor.connectUNIX(unix_socket_adr, factory) # expect SI request e = q.expect('stream-iq', to='[email protected]/bob', query_ns=ns.SI, query_name='si') bytestream, profile = create_from_si_offer(stream, q, BytestreamS5BRelay, e.stanza, '[email protected]/bob') result, si = bytestream.create_si_reply(e.stanza, 'test@localhost/Resource') si.addElement((ns.TUBES, 'tube')) stream.send(result) # wait SOCKS5 init iq id, mode, si, hosts = bytestream._expect_socks5_init() for jid, host, port in hosts: # the proxy is not announced because we are in a muc assert jid != 'proxy.localhost'