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 2871f5ced..c8566b4a6 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 @@ -56,7 +56,7 @@ import org.jivesoftware.smackx.jingle_filetransfer.handler.InitiatorOutgoingFile import org.jivesoftware.smackx.jingle_filetransfer.handler.ResponderIncomingFileTransferAccepted; import org.jivesoftware.smackx.jingle_filetransfer.listener.IncomingJingleFileTransferListener; import org.jivesoftware.smackx.jingle_filetransfer.provider.JingleFileTransferContentDescriptionProvider; -import org.jivesoftware.smackx.jingle_ibb.JingleIBBTransportManager; +import org.jivesoftware.smackx.jingle_s5b.JingleS5BTransportManager; import org.jxmpp.jid.FullJid; /** @@ -88,8 +88,8 @@ public final class JingleFileTransferManager extends Manager implements JingleHa NAMESPACE_V5, this); JingleContentProviderManager.addJingleContentDescriptionProvider( NAMESPACE_V5, new JingleFileTransferContentDescriptionProvider()); - JingleIBBTransportManager.getInstanceFor(connection); - //JingleS5BTransportManager.getInstanceFor(connection); + //JingleIBBTransportManager.getInstanceFor(connection); + JingleS5BTransportManager.getInstanceFor(connection); } /** diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleS5BTransportHandler.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleS5BTransportHandler.java index 9f285e442..23300450b 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleS5BTransportHandler.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleS5BTransportHandler.java @@ -1,19 +1,32 @@ package org.jivesoftware.smackx.jingle_s5b; +import java.io.IOException; import java.lang.ref.WeakReference; +import java.net.Socket; +import java.util.ArrayList; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smackx.bytestreams.socks5.Socks5Client; +import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream; import org.jivesoftware.smackx.jingle.JingleManager; import org.jivesoftware.smackx.jingle.JingleSessionHandler; import org.jivesoftware.smackx.jingle.JingleTransportEstablishedCallback; import org.jivesoftware.smackx.jingle.JingleTransportHandler; import org.jivesoftware.smackx.jingle.element.JingleContentTransport; +import org.jivesoftware.smackx.jingle.element.JingleContentTransportCandidate; import org.jivesoftware.smackx.jingle_s5b.elements.JingleS5BTransport; +import org.jivesoftware.smackx.jingle_s5b.elements.JingleS5BTransportCandidate; /** * JingleTransportHandler for Socks5Bytestreams. */ public class JingleS5BTransportHandler implements JingleTransportHandler { + private static final Logger LOGGER = Logger.getLogger(JingleS5BTransportHandler.class.getName()); private final WeakReference sessionHandler; @@ -27,11 +40,78 @@ public class JingleS5BTransportHandler implements JingleTransportHandler streamHosts = new ArrayList<>(); + for (JingleContentTransportCandidate c : transport.getCandidates()) { + streamHosts.add(((JingleS5BTransportCandidate) c).getStreamHost()); + } + + for (Bytestream.StreamHost streamHost : streamHosts) { + String address = streamHost.getAddress() + ":" + streamHost.getPort(); + + LOGGER.log(Level.INFO, "Connect outwards to " + address); + // establish socket + try { + + // build SOCKS5 client + final Socks5Client socks5Client = new Socks5Client(streamHost, transport.getDestinationAddress()); + + // connect to SOCKS5 proxy with a timeout + Socket socket = socks5Client.getSocket(10 * 1000); + + // set selected host + break; + + } + catch (TimeoutException | IOException | SmackException | XMPPException e) { + + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } } @Override - public void establishIncomingSession(JingleManager.FullJidAndSessionId target, JingleContentTransport transport, JingleTransportEstablishedCallback callback) { + public void establishIncomingSession(JingleManager.FullJidAndSessionId target, JingleContentTransport hopefullyS5BTransport, JingleTransportEstablishedCallback callback) { + if (!hopefullyS5BTransport.getNamespace().equals(JingleS5BTransport.NAMESPACE_V1)) { + throw new IllegalArgumentException("Transport must be a JingleS5BTransport."); + } + JingleS5BTransport transport = (JingleS5BTransport) hopefullyS5BTransport; + + + ArrayList streamHosts = new ArrayList<>(); + for (JingleContentTransportCandidate c : transport.getCandidates()) { //TODO Sort + streamHosts.add(((JingleS5BTransportCandidate) c).getStreamHost()); + } + + for (Bytestream.StreamHost streamHost : streamHosts) { + String address = streamHost.getAddress() + ":" + streamHost.getPort(); + + LOGGER.log(Level.INFO, "Connect inwards to " + address); + // establish socket + try { + + // build SOCKS5 client + final Socks5Client socks5Client = new Socks5Client(streamHost, transport.getDestinationAddress()); + + // connect to SOCKS5 proxy with a timeout + Socket socket = socks5Client.getSocket(10 * 1000); + + // set selected host + break; + + } + catch (TimeoutException | IOException | SmackException | XMPPException e) { + + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } } @Override diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleS5BTransportManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleS5BTransportManager.java index d15aa077c..d1a35567a 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleS5BTransportManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_s5b/JingleS5BTransportManager.java @@ -66,7 +66,7 @@ public final class JingleS5BTransportManager extends AbstractJingleTransportMana @Override public JingleS5BTransportHandler createJingleTransportHandler(JingleSessionHandler sessionHandler) { - return null; + return new JingleS5BTransportHandler(sessionHandler); } @Override @@ -140,9 +140,4 @@ public final class JingleS5BTransportManager extends AbstractJingleTransportMana return streamHosts; } - - public void connectToStreamHost() { - - } - } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5Client.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5Client.java index 91e2dbe31..55add4d35 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5Client.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/Socks5Client.java @@ -45,7 +45,7 @@ import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost; * * @author Henning Staib */ -class Socks5Client { +public class Socks5Client { private static final Logger LOGGER = Logger.getLogger(Socks5Client.class.getName());