From cac35d74b43b5eeb098c79a1af43fa3f9d65ab41 Mon Sep 17 00:00:00 2001 From: vanitasvitae Date: Mon, 7 Aug 2017 14:35:00 +0200 Subject: [PATCH] Check for disco support before file transfers --- .../jivesoftware/smackx/jet/JetManager.java | 8 ++++++- .../smackx/jft/JingleFileTransferManager.java | 8 +++++-- .../smackx/jingle/JingleManager.java | 22 ++++++++++++------- .../jingle/component/JingleContent.java | 15 ++++++------- .../jingle/component/JingleSession.java | 2 +- .../JingleS5BTransportCandidate.java | 4 ++-- 6 files changed, 37 insertions(+), 22 deletions(-) diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jet/JetManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jet/JetManager.java index f2ee51884..38ecf0613 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jet/JetManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jet/JetManager.java @@ -22,6 +22,7 @@ import java.util.WeakHashMap; import java.util.logging.Logger; import org.jivesoftware.smack.Manager; +import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.provider.ExtensionElementProvider; import org.jivesoftware.smackx.ciphers.Aes256GcmNoPadding; @@ -82,6 +83,11 @@ public final class JetManager extends Manager implements JingleDescriptionManage throw new IllegalArgumentException("File MUST NOT be null and MUST exist."); } + ServiceDiscoveryManager disco = ServiceDiscoveryManager.getInstanceFor(connection()); + if (!disco.supportsFeature(recipient, getNamespace()) || !disco.supportsFeature(recipient, method.getNamespace())) { + throw new SmackException.FeatureNotSupportedException(getNamespace(), recipient); + } + JingleSession session = jingleManager.createSession(Role.initiator, recipient); JingleContent content = new JingleContent(JingleContentElement.Creator.initiator, JingleContentElement.Senders.initiator); @@ -90,7 +96,7 @@ public final class JetManager extends Manager implements JingleDescriptionManage JingleOutgoingFileOffer offer = new JingleOutgoingFileOffer(file); content.setDescription(offer); - JingleTransportManager transportManager = jingleManager.getBestAvailableTransportManager(); + JingleTransportManager transportManager = jingleManager.getBestAvailableTransportManager(recipient); content.setTransport(transportManager.createTransportForInitiator(content)); JetSecurity security = new JetSecurity(method, recipient, content.getName(), Aes256GcmNoPadding.NAMESPACE); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferManager.java index eafbd5d33..004c72dda 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jft/JingleFileTransferManager.java @@ -90,12 +90,16 @@ public final class JingleFileTransferManager extends Manager implements JingleDe public OutgoingFileOfferController sendFile(File file, FullJid to) throws SmackException.NotConnectedException, InterruptedException, XMPPException.XMPPErrorException, - SmackException.NoResponseException { + SmackException.NoResponseException, SmackException.FeatureNotSupportedException { if (file == null || !file.exists()) { throw new IllegalArgumentException("File MUST NOT be null and MUST exist."); } + if (!ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(to, getNamespace())) { + throw new SmackException.FeatureNotSupportedException(getNamespace(), to); + } + JingleSession session = jingleManager.createSession(Role.initiator, to); JingleContent content = new JingleContent(JingleContentElement.Creator.initiator, JingleContentElement.Senders.initiator); @@ -104,7 +108,7 @@ public final class JingleFileTransferManager extends Manager implements JingleDe JingleOutgoingFileOffer offer = new JingleOutgoingFileOffer(file); content.setDescription(offer); - JingleTransportManager transportManager = jingleManager.getBestAvailableTransportManager(); + JingleTransportManager transportManager = jingleManager.getBestAvailableTransportManager(to); content.setTransport(transportManager.createTransportForInitiator(content)); session.initiate(connection()); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleManager.java index 04617bf54..36e0c550e 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/JingleManager.java @@ -28,11 +28,14 @@ import java.util.logging.Level; 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.iqrequest.AbstractIqRequestHandler; import org.jivesoftware.smack.iqrequest.IQRequestHandler; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.util.StringUtils; +import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.jingle.adapter.JingleDescriptionAdapter; import org.jivesoftware.smackx.jingle.adapter.JingleSecurityAdapter; import org.jivesoftware.smackx.jingle.adapter.JingleTransportAdapter; @@ -50,6 +53,7 @@ import org.jivesoftware.smackx.jingle.util.FullJidAndSessionId; import org.jivesoftware.smackx.jingle.util.Role; import org.jxmpp.jid.FullJid; +import org.jxmpp.jid.Jid; /** * Manager for Jingle (XEP-0166). @@ -213,17 +217,19 @@ public final class JingleManager extends Manager { return securityManagers.get(namespace); } - public List getAvailableTransportManagers() { - return getAvailableTransportManagers(Collections.emptySet()); + public List getAvailableTransportManagers(Jid to) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { + return getAvailableTransportManagers(to, Collections.emptySet()); } - public List getAvailableTransportManagers(Set except) { + public List getAvailableTransportManagers(Jid to, Set except) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { Set available = new HashSet<>(transportManagers.keySet()); available.removeAll(except); List remaining = new ArrayList<>(); for (String namespace : available) { - remaining.add(transportManagers.get(namespace)); + if (ServiceDiscoveryManager.getInstanceFor(connection()).supportsFeature(to, namespace)) { + remaining.add(transportManagers.get(namespace)); + } } Collections.sort(remaining, new Comparator() { @@ -236,12 +242,12 @@ public final class JingleManager extends Manager { return remaining; } - public JingleTransportManager getBestAvailableTransportManager() { - return getBestAvailableTransportManager(Collections.emptySet()); + public JingleTransportManager getBestAvailableTransportManager(Jid to) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { + return getBestAvailableTransportManager(to, Collections.emptySet()); } - public JingleTransportManager getBestAvailableTransportManager(Set except) { - List managers = getAvailableTransportManagers(except); + public JingleTransportManager getBestAvailableTransportManager(Jid to, Set except) throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { + List managers = getAvailableTransportManagers(to, except); if (managers.size() > 0) { return managers.get(0); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleContent.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleContent.java index fdaac0efb..5b11907f9 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleContent.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleContent.java @@ -146,7 +146,7 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal } public void handleContentAccept(JingleElement request, XMPPConnection connection) { - onAccept(connection); + start(connection); } @@ -165,7 +165,7 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal } getTransport().handleSessionAccept(contentElement.getTransport(), connection); - onAccept(connection); + start(connection); return IQ.createResultIQ(request); } @@ -198,7 +198,7 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal transport = pendingReplacingTransport; pendingReplacingTransport = null; - onAccept(connection); + start(connection); return IQ.createResultIQ(request); } @@ -285,7 +285,7 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal } } }); - onAccept(connection); + start(connection); } return IQ.createResultIQ(request); @@ -384,8 +384,7 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal getSenders() == JingleContentElement.Senders.both; } - public void onAccept(final XMPPConnection connection) { - LOGGER.log(Level.INFO, "Accepted content " + getName()); + public void start(final XMPPConnection connection) { transport.prepare(connection); if (security != null) { @@ -416,7 +415,7 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal @Override public void onTransportReady(BytestreamSession bytestreamSession) { - LOGGER.log(Level.INFO, "TransportReady: " + (isReceiving() ? "Send" : "Receive")); + LOGGER.log(Level.INFO, "TransportReady: " + (isReceiving() ? "Receive" : "Send")); if (bytestreamSession == null) { throw new AssertionError("bytestreamSession MUST NOT be null at this point."); } @@ -469,7 +468,7 @@ public class JingleContent implements JingleTransportCallback, JingleSecurityCal JingleSession session = getParent(); JingleManager jingleManager = session.getJingleManager(); - JingleTransportManager rManager = jingleManager.getBestAvailableTransportManager(blacklist); + JingleTransportManager rManager = jingleManager.getBestAvailableTransportManager(getParent().getPeer(), blacklist); if (rManager == null) { JingleElement failedTransport = JingleElement.createSessionTerminate(session.getPeer(), session.getSessionId(), JingleReasonElement.Reason.failed_transport); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleSession.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleSession.java index 1ec1d0a5e..b57c49e59 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleSession.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/component/JingleSession.java @@ -111,7 +111,7 @@ public class JingleSession { } for (JingleContent content : contents.values()) { - content.onAccept(connection); + content.start(connection); } connection.createStanzaCollectorAndSend(createSessionAccept()).nextResultOrThrow(); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportCandidate.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportCandidate.java index cb0d89a79..5898008f1 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportCandidate.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transport/jingle_s5b/JingleS5BTransportCandidate.java @@ -113,10 +113,10 @@ public class JingleS5BTransportCandidate extends JingleTransportCandidate