Reuse S5B-Managers discovery methods

This commit is contained in:
vanitasvitae 2017-06-08 16:46:39 +02:00
parent 135f1ed77b
commit 6c0162c341
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
3 changed files with 24 additions and 36 deletions

View File

@ -17,24 +17,20 @@
package org.jivesoftware.smackx.jingle_s5b; package org.jivesoftware.smackx.jingle_s5b;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.StanzaListener;
import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Stanza; import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamManager;
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream; import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
import org.jivesoftware.smackx.disco.packet.DiscoverInfo;
import org.jivesoftware.smackx.disco.packet.DiscoverItems;
import org.jivesoftware.smackx.jingle.AbstractJingleContentTransportManager; import org.jivesoftware.smackx.jingle.AbstractJingleContentTransportManager;
import org.jivesoftware.smackx.jingle.JingleTransportInputStreamCallback; import org.jivesoftware.smackx.jingle.JingleTransportInputStreamCallback;
import org.jivesoftware.smackx.jingle.element.Jingle; import org.jivesoftware.smackx.jingle.element.Jingle;
import org.jivesoftware.smackx.jingle.provider.JingleContentTransportProvider; import org.jivesoftware.smackx.jingle.provider.JingleContentTransportProvider;
import org.jivesoftware.smackx.jingle_s5b.elements.JingleSocks5BytestreamTransport; import org.jivesoftware.smackx.jingle_s5b.elements.JingleSocks5BytestreamTransport;
import org.jivesoftware.smackx.jingle_s5b.provider.JingleSocks5BytestreamTransportProvider; import org.jivesoftware.smackx.jingle_s5b.provider.JingleSocks5BytestreamTransportProvider;
import org.jxmpp.jid.Jid;
/** /**
* Manager for JingleSocks5BytestreamTransports. * Manager for JingleSocks5BytestreamTransports.
@ -45,34 +41,15 @@ public final class JingleSocks5BytestreamTransportManager extends AbstractJingle
super(connection); super(connection);
} }
public ArrayList<Bytestream.StreamHost> getProxyIdentities() throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException { public List<Bytestream.StreamHost> getAvailableStreamHosts() throws XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException, SmackException.NoResponseException {
final ArrayList<Bytestream.StreamHost> streamHosts = new ArrayList<>(); Socks5BytestreamManager s5m = Socks5BytestreamManager.getBytestreamManager(connection());
DiscoverInfo.Feature bytestreams = new DiscoverInfo.Feature(Bytestream.NAMESPACE); List<Jid> proxies = s5m.determineProxies();
ServiceDiscoveryManager dm = ServiceDiscoveryManager.getInstanceFor(connection()); return s5m.determineStreamHostInfos(proxies);
DiscoverItems disco = dm.discoverItems(connection().getXMPPServiceDomain()); }
for (DiscoverItems.Item item : disco.getItems()) { public List<Bytestream.StreamHost> getLocalStreamHosts() {
DiscoverInfo info = dm.discoverInfo(item.getEntityID()); return Socks5BytestreamManager.getBytestreamManager(connection())
if (!info.getFeatures().contains(bytestreams)) { .getLocalStreamHost();
continue;
}
List<DiscoverInfo.Identity> identities = info.getIdentities("proxy", "bytestreams");
if (identities.isEmpty()) {
continue;
}
Bytestream b = new Bytestream();
b.setTo(item.getEntityID());
connection().sendIqWithResponseCallback(b, new StanzaListener() {
@Override
public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {
Bytestream result = (Bytestream) packet;
if (result != null) {
streamHosts.addAll(result.getStreamHosts());
}
}
});
}
return streamHosts;
} }
@Override @Override

View File

@ -20,6 +20,8 @@ import java.util.logging.Logger;
import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.Objects;
import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smack.util.XmlStringBuilder;
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
import org.jivesoftware.smackx.jingle.JingleTransportManager;
import org.jivesoftware.smackx.jingle.element.JingleContentTransportCandidate; import org.jivesoftware.smackx.jingle.element.JingleContentTransportCandidate;
import org.jxmpp.jid.Jid; import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.jid.impl.JidCreate;
@ -55,6 +57,15 @@ public final class JingleSocks5BytestreamTransportCandidate extends JingleConten
this.type = type; this.type = type;
} }
public JingleSocks5BytestreamTransportCandidate(Bytestream.StreamHost streamHost, int priority) {
this.cid = JingleTransportManager.generateSessionId();
this.host = streamHost.getAddress();
this.jid = streamHost.getJID();
this.port = streamHost.getPort();
this.priority = priority;
this.type = Type.proxy;
}
public enum Type { public enum Type {
assisted (120), assisted (120),
direct (126), direct (126),

View File

@ -536,7 +536,7 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream
* @throws NotConnectedException * @throws NotConnectedException
* @throws InterruptedException * @throws InterruptedException
*/ */
private List<Jid> determineProxies() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { public List<Jid> determineProxies() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
XMPPConnection connection = connection(); XMPPConnection connection = connection();
ServiceDiscoveryManager serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection); ServiceDiscoveryManager serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(connection);
@ -585,7 +585,7 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream
* @param proxies a list of SOCKS5 proxy JIDs * @param proxies a list of SOCKS5 proxy JIDs
* @return a list of stream hosts containing the IP address an the port * @return a list of stream hosts containing the IP address an the port
*/ */
private List<StreamHost> determineStreamHostInfos(List<Jid> proxies) { public List<StreamHost> determineStreamHostInfos(List<Jid> proxies) {
XMPPConnection connection = connection(); XMPPConnection connection = connection();
List<StreamHost> streamHosts = new ArrayList<StreamHost>(); List<StreamHost> streamHosts = new ArrayList<StreamHost>();
@ -632,7 +632,7 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream
* @return the stream host information of the local SOCKS5 proxy or null if local SOCKS5 proxy * @return the stream host information of the local SOCKS5 proxy or null if local SOCKS5 proxy
* is not running * is not running
*/ */
private List<StreamHost> getLocalStreamHost() { public List<StreamHost> getLocalStreamHost() {
XMPPConnection connection = connection(); XMPPConnection connection = connection();
// get local proxy singleton // get local proxy singleton
Socks5Proxy socks5Server = Socks5Proxy.getSocks5Proxy(); Socks5Proxy socks5Server = Socks5Proxy.getSocks5Proxy();