From db294f3f1b0e08dfb1886e31d96e51d0fdaf932b Mon Sep 17 00:00:00 2001 From: vanitasvitae Date: Thu, 8 Jun 2017 17:32:37 +0200 Subject: [PATCH] Add functionality to create TransportElements --- .../JingleFileTransferManager.java | 11 ++++-- ...ingleInBandBytestreamTransportManager.java | 6 +++ .../JingleInBandBytestreamTransport.java | 2 +- ...ingleSocks5BytestreamTransportManager.java | 39 +++++++++++++++++++ ...gleSocks5BytestreamTransportCandidate.java | 6 ++- .../JingleInBandByteStreamTransportTest.java | 2 +- ...AbstractJingleContentTransportManager.java | 5 +++ .../smackx/jingle/JingleTransportManager.java | 2 +- 8 files changed, 65 insertions(+), 8 deletions(-) diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/JingleFileTransferManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/JingleFileTransferManager.java index 3bd2d863d..dec3d6258 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/JingleFileTransferManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/JingleFileTransferManager.java @@ -27,24 +27,25 @@ import java.util.logging.Logger; import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.hash.HashManager; import org.jivesoftware.smackx.hash.element.HashElement; +import org.jivesoftware.smackx.jingle.AbstractJingleContentTransportManager; +import org.jivesoftware.smackx.jingle.JingleContentProviderManager; import org.jivesoftware.smackx.jingle.JingleHandler; import org.jivesoftware.smackx.jingle.JingleManager; import org.jivesoftware.smackx.jingle.element.Jingle; import org.jivesoftware.smackx.jingle.element.JingleContent; import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionChildElement; -import org.jivesoftware.smackx.jingle.JingleContentProviderManager; import org.jivesoftware.smackx.jingle_filetransfer.callback.IncomingJingleFileTransferCallback; import org.jivesoftware.smackx.jingle_filetransfer.element.JingleFileTransferChildElement; import org.jivesoftware.smackx.jingle_filetransfer.element.JingleFileTransferContentDescription; import org.jivesoftware.smackx.jingle_filetransfer.listener.IncomingJingleFileTransferListener; import org.jivesoftware.smackx.jingle_filetransfer.provider.JingleFileTransferContentDescriptionProvider; import org.jivesoftware.smackx.jingle_ibb.JingleInBandBytestreamTransportManager; -import org.jivesoftware.smackx.jingle_ibb.element.JingleInBandBytestreamTransport; import org.jxmpp.jid.FullJid; /** @@ -112,7 +113,9 @@ public final class JingleFileTransferManager extends Manager implements JingleHa * QnD method. * @param file */ - public void sendFile(File file, final FullJid recipient) throws IOException, SmackException.NotConnectedException, InterruptedException { + public void sendFile(File file, final FullJid recipient) throws IOException, SmackException.NotConnectedException, InterruptedException, XMPPException.XMPPErrorException, SmackException.NoResponseException { + AbstractJingleContentTransportManager preferedTransportManager = JingleInBandBytestreamTransportManager.getInstanceFor(connection()); + JingleFileTransferSession session = new JingleFileTransferSession(connection(), recipient, connection().getUser(), recipient); JingleFileTransferChildElement.Builder b = JingleFileTransferChildElement.getBuilder(); b.setFile(file); @@ -132,7 +135,7 @@ public final class JingleFileTransferManager extends Manager implements JingleHa bb.setDescription(new JingleFileTransferContentDescription(payloads)) .setCreator(JingleContent.Creator.initiator) .setName(StringUtils.randomString(24)) - .addTransport(new JingleInBandBytestreamTransport()); + .addTransport(preferedTransportManager.createJingleContentTransport()); Jingle jingle = (Jingle) session.initiate(Collections.singletonList(bb.build())); jingle.setTo(recipient); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/JingleInBandBytestreamTransportManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/JingleInBandBytestreamTransportManager.java index 2ee4232ae..f04253704 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/JingleInBandBytestreamTransportManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/JingleInBandBytestreamTransportManager.java @@ -38,6 +38,7 @@ import org.jivesoftware.smackx.jingle.element.JingleContentTransport; import org.jivesoftware.smackx.jingle.provider.JingleContentTransportProvider; import org.jivesoftware.smackx.jingle_ibb.element.JingleInBandBytestreamTransport; import org.jivesoftware.smackx.jingle_ibb.provider.JingleInBandByteStreamTransportProvider; +import org.jxmpp.jid.Jid; /** * Manager for Jingle In-Band-Bytestreams. @@ -122,4 +123,9 @@ public final class JingleInBandBytestreamTransportManager extends AbstractJingle return ibs.getOutputStream(); } + + @Override + public JingleInBandBytestreamTransport createJingleContentTransport(Jid otherUser) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { + return new JingleInBandBytestreamTransport(); + } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/element/JingleInBandBytestreamTransport.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/element/JingleInBandBytestreamTransport.java index 1fd0c498f..cc5260c85 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/element/JingleInBandBytestreamTransport.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_ibb/element/JingleInBandBytestreamTransport.java @@ -38,7 +38,7 @@ public class JingleInBandBytestreamTransport extends JingleContentTransport { } public JingleInBandBytestreamTransport(short blockSize) { - this(blockSize, JingleTransportManager.generateSessionId()); + this(blockSize, JingleTransportManager.generateRandomId()); } public JingleInBandBytestreamTransport(short blockSize, String sid) { diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleSocks5BytestreamTransportManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleSocks5BytestreamTransportManager.java index 51138b2e1..21f592c1a 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleSocks5BytestreamTransportManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleSocks5BytestreamTransportManager.java @@ -17,18 +17,23 @@ package org.jivesoftware.smackx.jingle_s5b; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; import java.util.List; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager; import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream; +import org.jivesoftware.smackx.hash.HashManager; import org.jivesoftware.smackx.jingle.AbstractJingleContentTransportManager; import org.jivesoftware.smackx.jingle.JingleTransportInputStreamCallback; +import org.jivesoftware.smackx.jingle.JingleTransportManager; import org.jivesoftware.smackx.jingle.element.Jingle; import org.jivesoftware.smackx.jingle.provider.JingleContentTransportProvider; import org.jivesoftware.smackx.jingle_s5b.elements.JingleSocks5BytestreamTransport; +import org.jivesoftware.smackx.jingle_s5b.elements.JingleSocks5BytestreamTransportCandidate; import org.jivesoftware.smackx.jingle_s5b.provider.JingleSocks5BytestreamTransportProvider; import org.jxmpp.jid.Jid; @@ -71,4 +76,38 @@ public final class JingleSocks5BytestreamTransportManager extends AbstractJingle public OutputStream createOutputStream(Jingle jingle) { return null; } + + @Override + public JingleSocks5BytestreamTransport createJingleContentTransport(Jid otherUser) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { + JingleSocks5BytestreamTransport.Builder builder = JingleSocks5BytestreamTransport.getBuilder(); + + List localStreams = getLocalStreamHosts(); + List availableStreams = getAvailableStreamHosts(); + + for (Bytestream.StreamHost host : localStreams) { + JingleSocks5BytestreamTransportCandidate candidate = new JingleSocks5BytestreamTransportCandidate(host, 100); + builder.addTransportCandidate(candidate); + } + + for (Bytestream.StreamHost host : availableStreams) { + JingleSocks5BytestreamTransportCandidate candidate = new JingleSocks5BytestreamTransportCandidate(host, 0); + builder.addTransportCandidate(candidate); + } + + builder.setMode(Bytestream.Mode.tcp); + String sid = JingleTransportManager.generateRandomId(); + builder.setStreamId(sid); + String digestString = + sid + + connection().getUser().asFullJidIfPossible().toString() + + otherUser.asFullJidIfPossible().toString(); + try { + builder.setDestinationAddress( + new String(HashManager.sha_1(digestString.getBytes(StringUtils.UTF8)), StringUtils.UTF8)); + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); + } + + return builder.build(); + } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/elements/JingleSocks5BytestreamTransportCandidate.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/elements/JingleSocks5BytestreamTransportCandidate.java index af3e50a03..42681c5e5 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/elements/JingleSocks5BytestreamTransportCandidate.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/elements/JingleSocks5BytestreamTransportCandidate.java @@ -58,7 +58,7 @@ public final class JingleSocks5BytestreamTransportCandidate extends JingleConten } public JingleSocks5BytestreamTransportCandidate(Bytestream.StreamHost streamHost, int priority) { - this.cid = JingleTransportManager.generateSessionId(); + this.cid = JingleTransportManager.generateRandomId(); this.host = streamHost.getAddress(); this.jid = streamHost.getJID(); this.port = streamHost.getPort(); @@ -117,6 +117,10 @@ public final class JingleSocks5BytestreamTransportCandidate extends JingleConten return type; } + public Bytestream.StreamHost getStreamHost() { + return new Bytestream.StreamHost(jid, host, port); + } + @Override public CharSequence toXML() { XmlStringBuilder xml = new XmlStringBuilder(); diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/jingle_ibb/JingleInBandByteStreamTransportTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/jingle_ibb/JingleInBandByteStreamTransportTest.java index 0c11386b8..5c62f8aa6 100644 --- a/smack-experimental/src/test/java/org/jivesoftware/smackx/jingle_ibb/JingleInBandByteStreamTransportTest.java +++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/jingle_ibb/JingleInBandByteStreamTransportTest.java @@ -35,7 +35,7 @@ public class JingleInBandByteStreamTransportTest extends SmackTestSuite { @Test public void parserTest() throws Exception { - String sid = JingleTransportManager.generateSessionId(); + String sid = JingleTransportManager.generateRandomId(); short size = 8192; String xml = ""; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/AbstractJingleContentTransportManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/AbstractJingleContentTransportManager.java index 57ac4a735..34e6345dc 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/AbstractJingleContentTransportManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/AbstractJingleContentTransportManager.java @@ -19,11 +19,14 @@ package org.jivesoftware.smackx.jingle; import java.io.OutputStream; import org.jivesoftware.smack.Manager; +import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.jingle.element.Jingle; import org.jivesoftware.smackx.jingle.element.JingleContentTransport; import org.jivesoftware.smackx.jingle.provider.JingleContentTransportProvider; +import org.jxmpp.jid.Jid; /** * Interface with methods that JingleContentTransportManagers must implement. @@ -44,4 +47,6 @@ public abstract class AbstractJingleContentTransportManager