diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleContent.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleContent.java index f24b687f5..f942e2e3e 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleContent.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleContent.java @@ -161,13 +161,18 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal public IQ handleSessionAccept(JingleElement request, XMPPConnection connection) { LOGGER.log(Level.INFO, "RECEIVED SESSION ACCEPT!"); - for (JingleContentElement contentElement : request.getContents()) { - if (contentElement.getName().equals(getName())) { - JingleContent content = fromElement(contentElement); - getTransport().setPeersProposal(content.getTransport()); - break; + JingleContentElement contentElement = null; + for (JingleContentElement c : request.getContents()) { + if (c.getName().equals(getName())) { + contentElement = c; } } + + if (contentElement == null) { + throw new AssertionError("Session Accept did not contain this content."); + } + + getTransport().handleSessionAccept(contentElement.getTransport(), connection); onAccept(connection); return IQ.createResultIQ(request); } @@ -313,9 +318,12 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal } public void onAccept(final XMPPConnection connection) { + transport.prepare(connection); + if (security != null) { security.prepare(connection, getParent().getPeer()); } + //Establish transport Async.go(new Runnable() { @Override diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleSession.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleSession.java index b2ce59881..6db92f840 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleSession.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleSession.java @@ -17,10 +17,8 @@ package org.jivesoftware.smackx.jingle.components; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -66,9 +64,6 @@ public class JingleSession { private SessionState sessionState; - private final Map pendingJingleActions = - Collections.synchronizedMap(new HashMap()); - public JingleSession(JingleManager manager, FullJid initiator, FullJid responder, Role role, String sessionId) { this.jingleManager = manager; this.initiator = initiator; @@ -88,7 +83,7 @@ public class JingleSession { List initiateContents = initiate.getContents(); for (JingleContentElement content : initiateContents) { - session.addContent(content); + session.addContent(content, manager); } session.sessionState = SessionState.pending; @@ -481,7 +476,7 @@ public class JingleSession { content.setParent(this); } - public void addContent(JingleContentElement content) + public void addContent(JingleContentElement content, JingleManager manager) throws UnsupportedSecurityException, UnsupportedTransportException, UnsupportedDescriptionException { addContent(JingleContent.fromElement(content)); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleTransport.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleTransport.java index 44557cdf0..20ad3b59a 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleTransport.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/components/JingleTransport.java @@ -100,6 +100,8 @@ public abstract class JingleTransport e } } + public abstract void prepare(XMPPConnection connection); + public List> getOurCandidates() { return ourCandidates; } @@ -116,8 +118,6 @@ public abstract class JingleTransport e public abstract void establishOutgoingBytestreamSession(XMPPConnection connection, JingleTransportCallback callback, JingleSession session) throws SmackException.NotConnectedException, InterruptedException; - public abstract void setPeersProposal(JingleTransport peersProposal); - public abstract IQ handleTransportInfo(JingleContentTransportInfoElement info, JingleElement wrapping); public void setParent(JingleContent parent) { @@ -133,4 +133,6 @@ public abstract class JingleTransport e public BytestreamSession getBytestreamSession() { return bytestreamSession; } + + public abstract void handleSessionAccept(JingleContentTransportElement transportElement, XMPPConnection connection); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_ibb/JingleIBBTransport.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_ibb/JingleIBBTransport.java index 77333e66c..5052f92d0 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_ibb/JingleIBBTransport.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_ibb/JingleIBBTransport.java @@ -33,6 +33,7 @@ import org.jivesoftware.smackx.jingle.callbacks.JingleTransportCallback; import org.jivesoftware.smackx.jingle.components.JingleSession; import org.jivesoftware.smackx.jingle.components.JingleTransport; import org.jivesoftware.smackx.jingle.components.JingleTransportCandidate; +import org.jivesoftware.smackx.jingle.element.JingleContentTransportElement; import org.jivesoftware.smackx.jingle.element.JingleContentTransportInfoElement; import org.jivesoftware.smackx.jingle.element.JingleElement; import org.jivesoftware.smackx.jingle.transport.jingle_ibb.element.JingleIBBTransportElement; @@ -76,6 +77,12 @@ public class JingleIBBTransport extends JingleTransport peersProposal) { - JingleIBBTransport transport = (JingleIBBTransport) peersProposal; - //Respect peers wish for smaller block size. - blockSize = (blockSize < transport.blockSize ? blockSize : transport.blockSize); + public void addOurCandidate(JingleTransportCandidate candidate) { + // Sorry, we don't want any candidates. } @Override - public void addOurCandidate(JingleTransportCandidate candidate) { - // Sorry, we don't want any candidates. + public void prepare(XMPPConnection connection) { + // Nuffin taddooh. } @Override diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransport.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransport.java index 107bc06e0..f32b9cf1a 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransport.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransport.java @@ -35,10 +35,11 @@ import org.jivesoftware.smackx.bytestreams.socks5.Socks5Utils; import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream; import org.jivesoftware.smackx.jingle.JingleManager; import org.jivesoftware.smackx.jingle.callbacks.JingleTransportCallback; -import org.jivesoftware.smackx.jingle.components.JingleContent; import org.jivesoftware.smackx.jingle.components.JingleSession; import org.jivesoftware.smackx.jingle.components.JingleTransport; import org.jivesoftware.smackx.jingle.components.JingleTransportCandidate; +import org.jivesoftware.smackx.jingle.element.JingleContentTransportCandidateElement; +import org.jivesoftware.smackx.jingle.element.JingleContentTransportElement; import org.jivesoftware.smackx.jingle.element.JingleContentTransportInfoElement; import org.jivesoftware.smackx.jingle.element.JingleElement; import org.jivesoftware.smackx.jingle.exception.FailedTransportException; @@ -62,8 +63,11 @@ public class JingleS5BTransport extends JingleTransport> ourCandidates, List> theirCandidates) { - this(sid, Socks5Utils.createDigest(sid, initiator, responder), Bytestream.Mode.tcp, ourCandidates, theirCandidates); + @Override + public void handleSessionAccept(JingleContentTransportElement transportElement, XMPPConnection connection) { + JingleS5BTransportElement transport = (JingleS5BTransportElement) transportElement; + theirDstAddr = transport.getDestinationAddress(); + theirMode = transport.getMode(); + for (JingleContentTransportCandidateElement c : transport.getCandidates()) { + JingleS5BTransportCandidateElement candidate = (JingleS5BTransportCandidateElement) c; + addTheirCandidate(new JingleS5BTransportCandidate(candidate)); + } } /** - * Create a JingleS5BTransport as response to another JingleS5BTransport proposal. - * @param content content which this transport will be child of. - * @param other other JingleS5BTransport proposal. - * @param candidates list of available JingleS5BTransportCandidates. - */ - public JingleS5BTransport(JingleContent content, JingleS5BTransport other, List> candidates) { - this(other.getSid(), - Socks5Utils.createDigest(other.getSid(), content.getParent().getInitiator(), content.getParent().getResponder()), - other.mode, candidates, other.getOurCandidates()); - setPeersProposal(other); - } - - /** - * Create a new JingleS5BTransport. + * Create transport as initiator. + * @param initiator + * @param responder * @param sid - * @param dstAddr * @param mode - * @param candidates + * @param ourCandidates */ - public JingleS5BTransport(String sid, String dstAddr, Bytestream.Mode mode, List> candidates, List> theirCandidates) { + public JingleS5BTransport(FullJid initiator, FullJid responder, String sid, Bytestream.Mode mode, List> ourCandidates) { this.sid = sid; - this.dstAddr = dstAddr; - this.mode = mode; + this.ourMode = mode; + this.ourDstAddr = Socks5Utils.createDigest(sid, initiator, responder); + Socks5Proxy.getSocks5Proxy().addTransfer(ourDstAddr); - for (JingleTransportCandidate c : (candidates != null ? - candidates : Collections.emptySet())) { + for (JingleTransportCandidate c : ourCandidates) { + addOurCandidate(c); + } + } + + /** + * Create simple transport as responder. + * @param initiator + * @param responder + * @param ourCandidates + * @param other + */ + public JingleS5BTransport(FullJid initiator, FullJid responder, List> ourCandidates, JingleS5BTransport other) { + this.sid = other.sid; + this.ourMode = other.theirMode; + this.ourDstAddr = Socks5Utils.createDigest(other.sid, initiator, responder); + Socks5Proxy.getSocks5Proxy().addTransfer(ourDstAddr); + this.theirMode = other.theirMode; + this.theirDstAddr = other.theirDstAddr; + + for (JingleTransportCandidate c : ourCandidates) { addOurCandidate(c); } - for (JingleTransportCandidate c : (theirCandidates != null ? - theirCandidates : Collections.emptySet())) { + for (JingleTransportCandidate c : other.getTheirCandidates()) { + addTheirCandidate(c); + } + } + + /** + * Create custom transport as responder. + * @param sid + * @param ourMode + * @param theirMode + * @param ourDstAddr + * @param theirDstAddr + * @param ourCandidates + * @param theirCandidates + */ + public JingleS5BTransport(String sid, Bytestream.Mode ourMode, Bytestream.Mode theirMode, String ourDstAddr, String theirDstAddr, List> ourCandidates, List> theirCandidates) { + this.sid = sid; + this.ourMode = ourMode; + this.theirMode = theirMode; + this.ourDstAddr = ourDstAddr; + Socks5Proxy.getSocks5Proxy().addTransfer(ourDstAddr); + this.theirDstAddr = theirDstAddr; + + for (JingleTransportCandidate c : (ourCandidates != null ? ourCandidates : + Collections.emptySet())) { + addOurCandidate(c); + } + + for (JingleTransportCandidate c : (theirCandidates != null ? theirCandidates : + Collections.emptySet())) { addTheirCandidate(c); } } /** * Copy constructor. - * @param transport which will be copied. + * @param original */ - public JingleS5BTransport(JingleS5BTransport transport) { - this(transport.sid, transport.dstAddr, transport.mode, null, null); - for (JingleTransportCandidate c : transport.getOurCandidates()) { - this.addOurCandidate(new JingleS5BTransportCandidate((JingleS5BTransportCandidate) c)); + public JingleS5BTransport(JingleS5BTransport original) { + this.sid = original.sid; + this.ourDstAddr = original.ourDstAddr; + this.theirDstAddr = original.theirDstAddr; + this.ourMode = original.ourMode; + this.theirMode = original.theirMode; + + for (JingleTransportCandidate c : original.getOurCandidates()) { + addOurCandidate(new JingleS5BTransportCandidate((JingleS5BTransportCandidate) c)); + } + + for (JingleTransportCandidate c : original.getTheirCandidates()) { + addTheirCandidate(new JingleS5BTransportCandidate((JingleS5BTransportCandidate) c)); } } @@ -131,8 +182,8 @@ public class JingleS5BTransport extends JingleTransport candidate : getOurCandidates()) { builder.addTransportCandidate((JingleS5BTransportCandidateElement) candidate.getElement()); @@ -145,12 +196,16 @@ public class JingleS5BTransport extends JingleTransport> candidates = JingleS5BTransportManager.getInstanceFor(connection).collectCandidates(); + for (JingleTransportCandidate c : candidates) { + addOurCandidate(c); + } + } + } + @Override public void establishOutgoingBytestreamSession(XMPPConnection connection, JingleTransportCallback callback, JingleSession session) throws SmackException.NotConnectedException, InterruptedException { @@ -172,18 +247,9 @@ public class JingleS5BTransport extends JingleTransport peersProposal) { - JingleS5BTransport transport = (JingleS5BTransport) peersProposal; - getTheirCandidates().clear(); - for (JingleTransportCandidate c : transport.getOurCandidates()) { - addTheirCandidate(c); - } - } - void establishBytestreamSession(XMPPConnection connection) throws SmackException.NotConnectedException, InterruptedException { - Socks5Proxy.getSocks5Proxy().addTransfer(dstAddr); + Socks5Proxy.getSocks5Proxy().addTransfer(ourDstAddr); JingleS5BTransportManager transportManager = JingleS5BTransportManager.getInstanceFor(connection); this.ourSelectedCandidate = connectToCandidates(MAX_TIMEOUT); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportAdapter.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportAdapter.java index 3a302b912..09b3ef340 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportAdapter.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportAdapter.java @@ -39,7 +39,7 @@ public class JingleS5BTransportAdapter implements JingleTransportAdapter localStreamHosts = null; private List availableStreamHosts = null; - private static boolean useLocalCandidates = true; + private static boolean useLocalCandidates = false; private static boolean useExternalCandidates = true; static { @@ -99,16 +99,13 @@ public final class JingleS5BTransportManager extends Manager implements JingleTr public JingleTransport createTransport(JingleContent content) { JingleSession session = content.getParent(); List> candidates = collectCandidates(); - return new JingleS5BTransport(session.getInitiator(), session.getResponder(), StringUtils.randomString(24), candidates, null); + return new JingleS5BTransport(session.getInitiator(), session.getResponder(), StringUtils.randomString(24), Bytestream.Mode.tcp, candidates); } @Override public JingleTransport createTransport(JingleContent content, JingleTransport peersTransport) { - JingleS5BTransport transport = (JingleS5BTransport) peersTransport; - List> candidates = collectCandidates(); - JingleS5BTransport mTransport = new JingleS5BTransport(content, transport, candidates); - mTransport.setPeersProposal(transport); - return mTransport; + JingleSession session = content.getParent(); + return new JingleS5BTransport(session.getInitiator(), session.getResponder(), collectCandidates(), (JingleS5BTransport) peersTransport); } @Override @@ -116,7 +113,7 @@ public final class JingleS5BTransportManager extends Manager implements JingleTr return 10000; } - private List> collectCandidates() { + public List> collectCandidates() { List> candidates = new ArrayList<>(); //Local host diff --git a/smack-integration-test/src/main/java/org/jivesoftware/smackx/jingle/transport/JingleTransportTest.java b/smack-integration-test/src/main/java/org/jivesoftware/smackx/jingle/transport/JingleTransportTest.java index 0e9a1e678..93f7eee5e 100644 --- a/smack-integration-test/src/main/java/org/jivesoftware/smackx/jingle/transport/JingleTransportTest.java +++ b/smack-integration-test/src/main/java/org/jivesoftware/smackx/jingle/transport/JingleTransportTest.java @@ -93,8 +93,8 @@ public class JingleTransportTest extends AbstractSmackIntegrationTest { JingleS5BTransport rTransport = (JingleS5BTransport) JingleS5BTransportManager.getInstanceFor(receiver).createTransport(rContent, sTransport); sContent.setTransport(sTransport); rContent.setTransport(rTransport); - sTransport.setPeersProposal(new JingleS5BTransport(rTransport)); - rTransport.setPeersProposal(new JingleS5BTransport(sTransport)); + sTransport.handleSessionAccept(rTransport.getElement(), sender); + rTransport.handleSessionAccept(sTransport.getElement(), receiver); basicTransportTest(sSession, rSession, sTransport, rTransport); }