mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-23 20:42:06 +01:00
More progress
This commit is contained in:
parent
09548855dd
commit
5ebd07ac3c
2 changed files with 105 additions and 37 deletions
|
@ -177,4 +177,16 @@ public final class JingleS5BTransportManager extends JingleTransportManager<Jing
|
||||||
return jingle;
|
return jingle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Jingle createProxyError(FullJid remote, String sessionId, JingleContent.Senders senders, JingleContent.Creator creator, String name, String streamId) {
|
||||||
|
Jingle.Builder jb = Jingle.getBuilder();
|
||||||
|
jb.setSessionId(sessionId).setAction(JingleAction.transport_info);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Jingle jingle = jb.build();
|
||||||
|
jingle.setTo(remote);
|
||||||
|
jingle.setFrom(getConnection().getUser().asFullJidOrThrow());
|
||||||
|
return jingle;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,6 @@ import java.util.logging.Logger;
|
||||||
import org.jivesoftware.smack.SmackException;
|
import org.jivesoftware.smack.SmackException;
|
||||||
import org.jivesoftware.smack.XMPPException;
|
import org.jivesoftware.smack.XMPPException;
|
||||||
import org.jivesoftware.smack.packet.IQ;
|
import org.jivesoftware.smack.packet.IQ;
|
||||||
import org.jivesoftware.smackx.bytestreams.BytestreamSession;
|
|
||||||
import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamSession;
|
import org.jivesoftware.smackx.bytestreams.socks5.Socks5BytestreamSession;
|
||||||
import org.jivesoftware.smackx.bytestreams.socks5.Socks5Client;
|
import org.jivesoftware.smackx.bytestreams.socks5.Socks5Client;
|
||||||
import org.jivesoftware.smackx.bytestreams.socks5.Socks5ClientForInitiator;
|
import org.jivesoftware.smackx.bytestreams.socks5.Socks5ClientForInitiator;
|
||||||
|
@ -35,6 +34,7 @@ import org.jivesoftware.smackx.bytestreams.socks5.Socks5Utils;
|
||||||
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
|
import org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream;
|
||||||
import org.jivesoftware.smackx.jingle.JingleManager;
|
import org.jivesoftware.smackx.jingle.JingleManager;
|
||||||
import org.jivesoftware.smackx.jingle.JingleSession;
|
import org.jivesoftware.smackx.jingle.JingleSession;
|
||||||
|
import org.jivesoftware.smackx.jingle.JingleUtil;
|
||||||
import org.jivesoftware.smackx.jingle.element.Jingle;
|
import org.jivesoftware.smackx.jingle.element.Jingle;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleContent;
|
import org.jivesoftware.smackx.jingle.element.JingleContent;
|
||||||
import org.jivesoftware.smackx.jingle.element.JingleContentTransportCandidate;
|
import org.jivesoftware.smackx.jingle.element.JingleContentTransportCandidate;
|
||||||
|
@ -53,6 +53,7 @@ public class JingleS5BTransportSession extends JingleTransportSession<JingleS5BT
|
||||||
private static final Logger LOGGER = Logger.getLogger(JingleS5BTransportSession.class.getName());
|
private static final Logger LOGGER = Logger.getLogger(JingleS5BTransportSession.class.getName());
|
||||||
private final JingleS5BTransportManager transportManager;
|
private final JingleS5BTransportManager transportManager;
|
||||||
|
|
||||||
|
private final JingleUtil jutil;
|
||||||
private Socket connectedSocket;
|
private Socket connectedSocket;
|
||||||
private JingleS5BTransportCandidate localUsedCandidate;
|
private JingleS5BTransportCandidate localUsedCandidate;
|
||||||
private JingleS5BTransportCandidate remoteUsedCandidate;
|
private JingleS5BTransportCandidate remoteUsedCandidate;
|
||||||
|
@ -63,6 +64,7 @@ public class JingleS5BTransportSession extends JingleTransportSession<JingleS5BT
|
||||||
public JingleS5BTransportSession(JingleSession jingleSession) {
|
public JingleS5BTransportSession(JingleSession jingleSession) {
|
||||||
super(jingleSession);
|
super(jingleSession);
|
||||||
transportManager = JingleS5BTransportManager.getInstanceFor(jingleSession.getConnection());
|
transportManager = JingleS5BTransportManager.getInstanceFor(jingleSession.getConnection());
|
||||||
|
jutil = new JingleUtil(jingleSession.getConnection());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -184,6 +186,7 @@ public class JingleS5BTransportSession extends JingleTransportSession<JingleS5BT
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private JingleS5BTransportCandidate determineUsedCandidate() {
|
private JingleS5BTransportCandidate determineUsedCandidate() {
|
||||||
|
@ -226,37 +229,93 @@ public class JingleS5BTransportSession extends JingleTransportSession<JingleS5BT
|
||||||
|
|
||||||
if (remoteUsedCandidate == null) {
|
if (remoteUsedCandidate == null) {
|
||||||
callback.onException(new Exception("Unknown candidate"));
|
callback.onException(new Exception("Unknown candidate"));
|
||||||
return IQ.createResultIQ(candidateUsed);
|
return jutil.createErrorMalformedRequest(candidateUsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (localUsedCandidate != null) {
|
if (localUsedCandidate != null) {
|
||||||
JingleS5BTransportCandidate used = determineUsedCandidate();
|
connect(determineUsedCandidate());
|
||||||
|
|
||||||
// Our candidate is nominated.
|
|
||||||
if (used == remoteUsedCandidate) {
|
|
||||||
|
|
||||||
if (used.getType() == JingleS5BTransportCandidate.Type.proxy) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
callback.onSessionInitiated();
|
|
||||||
}
|
|
||||||
// Remotes candidate is nominated.
|
|
||||||
else {
|
|
||||||
if (connectedSocket != null) {
|
|
||||||
callback.onSessionInitiated(new Socks5BytestreamSession(connectedSocket,
|
|
||||||
used.getJid().asBareJid().equals(jingleSession.get().getRemote().asBareJid())));
|
|
||||||
} else {
|
|
||||||
throw new AssertionError("Connected socket is null.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return IQ.createResultIQ(candidateUsed);
|
return IQ.createResultIQ(candidateUsed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void connect(JingleS5BTransportCandidate candidate) {
|
||||||
|
JingleSession jSession = jingleSession.get();
|
||||||
|
if (jSession == null) {
|
||||||
|
throw new NullPointerException("Lost reference to JingleSession.");
|
||||||
|
}
|
||||||
|
// Used candidate belongs to remote.
|
||||||
|
if (candidate == localUsedCandidate) {
|
||||||
|
|
||||||
|
if (connectedSocket != null) {
|
||||||
|
callback.onSessionInitiated(new Socks5BytestreamSession(connectedSocket,
|
||||||
|
candidate.getJid().asBareJid().equals(jSession.getRemote().asBareJid())));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new AssertionError("Connected socket is null.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used candidate belongs to us.
|
||||||
|
else {
|
||||||
|
|
||||||
|
if (candidate.getType() == JingleS5BTransportCandidate.Type.proxy) {
|
||||||
|
|
||||||
|
if (candidate.getJid().asBareJid().equals(jSession.getLocal().asBareJid())) {
|
||||||
|
|
||||||
|
Socks5ClientForInitiator socks5Client = new Socks5ClientForInitiator(candidate.getStreamHost(),
|
||||||
|
((JingleS5BTransport) localTransport).getDestinationAddress(),
|
||||||
|
jSession.getConnection(), ((JingleS5BTransport) localTransport).getStreamId(),
|
||||||
|
jSession.getLocal());
|
||||||
|
try {
|
||||||
|
connectedSocket = socks5Client.getSocket(10 * 1000);
|
||||||
|
} catch (IOException | XMPPException | SmackException | InterruptedException | TimeoutException e) {
|
||||||
|
callback.onException(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
callback.onSessionInitiated(new Socks5BytestreamSession(connectedSocket, true));
|
||||||
|
} else {
|
||||||
|
Bytestream activateProxy = new Bytestream(((JingleS5BTransport) localTransport).getStreamId());
|
||||||
|
activateProxy.setToActivate(candidate.getJid());
|
||||||
|
activateProxy.setTo(candidate.getJid());
|
||||||
|
try {
|
||||||
|
jSession.getConnection().createStanzaCollectorAndSend(activateProxy).nextResultOrThrow();
|
||||||
|
} catch (SmackException.NoResponseException | XMPPException.XMPPErrorException | SmackException.NotConnectedException | InterruptedException e) {
|
||||||
|
LOGGER.log(Level.SEVERE, "Could not activate proxy server: " + e, e);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQ handleCandidateActivated(Jingle candidateActivated) {
|
||||||
|
|
||||||
|
return IQ.createResultIQ(candidateActivated);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQ handleCandidateError(Jingle candidateError) {
|
||||||
|
remoteError = true;
|
||||||
|
|
||||||
|
closeIfBothSidesFailed();
|
||||||
|
|
||||||
|
if (localUsedCandidate.getType() != JingleS5BTransportCandidate.Type.proxy) {
|
||||||
|
//TODO: Connect
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return IQ.createResultIQ(candidateError);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IQ handleProxyError(Jingle proxyError) {
|
||||||
|
|
||||||
|
return IQ.createResultIQ(proxyError);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getNamespace() {
|
public String getNamespace() {
|
||||||
return transportManager.getNamespace();
|
return transportManager.getNamespace();
|
||||||
|
@ -266,30 +325,27 @@ public class JingleS5BTransportSession extends JingleTransportSession<JingleS5BT
|
||||||
public IQ handleTransportInfo(Jingle transportInfo) {
|
public IQ handleTransportInfo(Jingle transportInfo) {
|
||||||
JingleS5BTransport transport = (JingleS5BTransport) transportInfo.getContents().get(0).getJingleTransport();
|
JingleS5BTransport transport = (JingleS5BTransport) transportInfo.getContents().get(0).getJingleTransport();
|
||||||
JingleS5BTransportInfo info = (JingleS5BTransportInfo) transport.getInfos().get(0);
|
JingleS5BTransportInfo info = (JingleS5BTransportInfo) transport.getInfos().get(0);
|
||||||
if (info != null) {
|
|
||||||
switch (info.getElementName()) {
|
|
||||||
|
|
||||||
|
if (info != null) {
|
||||||
|
|
||||||
|
switch (info.getElementName()) {
|
||||||
case JingleS5BTransportInfo.CandidateUsed.ELEMENT:
|
case JingleS5BTransportInfo.CandidateUsed.ELEMENT:
|
||||||
return handleCandidateUsed(transportInfo);
|
return handleCandidateUsed(transportInfo);
|
||||||
|
|
||||||
case JingleS5BTransportInfo.CandidateActivated.ELEMENT:
|
case JingleS5BTransportInfo.CandidateActivated.ELEMENT:
|
||||||
|
return handleCandidateActivated(transportInfo);
|
||||||
|
|
||||||
case JingleS5BTransportInfo.CandidateError.ELEMENT:
|
case JingleS5BTransportInfo.CandidateError.ELEMENT:
|
||||||
remoteError = true;
|
return handleCandidateError(transportInfo);
|
||||||
|
|
||||||
closeIfBothSidesFailed();
|
|
||||||
|
|
||||||
if (localUsedCandidate.getType() != JingleS5BTransportCandidate.Type.proxy) {
|
|
||||||
//TODO: Connect
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JingleS5BTransportInfo.ProxyError.ELEMENT:
|
case JingleS5BTransportInfo.ProxyError.ELEMENT:
|
||||||
|
return handleProxyError(transportInfo);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return IQ.createResultIQ(transportInfo);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return jutil.createErrorMalformedRequest(transportInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue