Search in sources :

Example 6 with StreamHost

use of org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost in project Smack by igniterealtime.

the class Socks5ByteStreamManagerTest method shouldPrioritizeSecondSocks5ProxyOnSecondAttempt.

/**
     * Invoking {@link Socks5BytestreamManager#establishSession(org.jxmpp.jid.Jid, String)} the first time
     * should successfully negotiate a SOCKS5 Bytestream via the second SOCKS5 proxy and should
     * prioritize this proxy for a second SOCKS5 Bytestream negotiation.
     * 
     * @throws Exception should not happen
     */
@Test
public void shouldPrioritizeSecondSocks5ProxyOnSecondAttempt() throws Exception {
    // disable clients local SOCKS5 proxy
    Socks5Proxy.setLocalSocks5ProxyEnabled(false);
    // get Socks5ByteStreamManager for connection
    Socks5BytestreamManager byteStreamManager = Socks5BytestreamManager.getBytestreamManager(connection);
    assertTrue(byteStreamManager.isProxyPrioritizationEnabled());
    Verification<Bytestream, Bytestream> streamHostUsedVerification1 = new Verification<Bytestream, Bytestream>() {

        @Override
        public void verify(Bytestream request, Bytestream response) {
            assertEquals(response.getSessionID(), request.getSessionID());
            assertEquals(2, request.getStreamHosts().size());
            // verify that the used stream host is the second in list
            StreamHost streamHost = (StreamHost) request.getStreamHosts().toArray()[1];
            assertEquals(response.getUsedHost().getJID(), streamHost.getJID());
        }
    };
    createResponses(streamHostUsedVerification1);
    // start a local SOCKS5 proxy
    Socks5TestProxy socks5Proxy = Socks5TestProxy.getProxy(7778);
    socks5Proxy.start();
    // create digest to get the socket opened by target
    String digest = Socks5Utils.createDigest(sessionID, initiatorJID, targetJID);
    // call the method that should be tested
    OutputStream outputStream = byteStreamManager.establishSession(targetJID, sessionID).getOutputStream();
    // test the established bytestream
    InputStream inputStream = socks5Proxy.getSocket(digest).getInputStream();
    byte[] data = new byte[] { 1, 2, 3 };
    outputStream.write(data);
    byte[] result = new byte[3];
    inputStream.read(result);
    assertArrayEquals(data, result);
    protocol.verifyAll();
    Verification<Bytestream, Bytestream> streamHostUsedVerification2 = new Verification<Bytestream, Bytestream>() {

        @Override
        public void verify(Bytestream request, Bytestream response) {
            assertEquals(response.getSessionID(), request.getSessionID());
            assertEquals(2, request.getStreamHosts().size());
            // verify that the used stream host is the first in list
            StreamHost streamHost = (StreamHost) request.getStreamHosts().toArray()[0];
            assertEquals(response.getUsedHost().getJID(), streamHost.getJID());
        }
    };
    createResponses(streamHostUsedVerification2);
    // call the method that should be tested again
    outputStream = byteStreamManager.establishSession(targetJID, sessionID).getOutputStream();
    // test the established bytestream
    inputStream = socks5Proxy.getSocket(digest).getInputStream();
    outputStream.write(data);
    inputStream.read(result);
    assertArrayEquals(data, result);
    protocol.verifyAll();
}
Also used : Bytestream(org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) Verification(org.jivesoftware.util.Verification) StreamHost(org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost) Test(org.junit.Test)

Example 7 with StreamHost

use of org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost in project Smack by igniterealtime.

the class Socks5ByteStreamManagerTest method shouldFailIfInitiatorCannotConnectToSocks5Proxy.

/**
     * Invoking {@link Socks5BytestreamManager#establishSession(org.jxmpp.jid.Jid, String)} should fail if
     * initiator can not connect to the SOCKS5 proxy used by target.
     */
@Test
public void shouldFailIfInitiatorCannotConnectToSocks5Proxy() {
    // disable clients local SOCKS5 proxy
    Socks5Proxy.setLocalSocks5ProxyEnabled(false);
    // get Socks5ByteStreamManager for connection
    Socks5BytestreamManager byteStreamManager = Socks5BytestreamManager.getBytestreamManager(connection);
    /**
         * create responses in the order they should be queried specified by the XEP-0065
         * specification
         */
    // build discover info that supports the SOCKS5 feature
    DiscoverInfo discoverInfo = Socks5PacketUtils.createDiscoverInfo(targetJID, initiatorJID);
    discoverInfo.addFeature(Bytestream.NAMESPACE);
    // return that SOCKS5 is supported if target is queried
    protocol.addResponse(discoverInfo, Verification.correspondingSenderReceiver, Verification.requestTypeGET);
    // build discover items containing a proxy item
    DiscoverItems discoverItems = Socks5PacketUtils.createDiscoverItems(xmppServer, initiatorJID);
    Item item = new Item(proxyJID);
    discoverItems.addItem(item);
    // return the proxy item if XMPP server is queried
    protocol.addResponse(discoverItems, Verification.correspondingSenderReceiver, Verification.requestTypeGET);
    // build discover info for proxy containing information about being a SOCKS5 proxy
    DiscoverInfo proxyInfo = Socks5PacketUtils.createDiscoverInfo(proxyJID, initiatorJID);
    Identity identity = new Identity("proxy", proxyJID.toString(), "bytestreams");
    proxyInfo.addIdentity(identity);
    // return the socks5 bytestream proxy identity if proxy is queried
    protocol.addResponse(proxyInfo, Verification.correspondingSenderReceiver, Verification.requestTypeGET);
    // build a socks5 stream host info containing the address and the port of the
    // proxy
    Bytestream streamHostInfo = Socks5PacketUtils.createBytestreamResponse(proxyJID, initiatorJID);
    streamHostInfo.addStreamHost(proxyJID, proxyAddress, 7778);
    // return stream host info if it is queried
    protocol.addResponse(streamHostInfo, Verification.correspondingSenderReceiver, Verification.requestTypeGET);
    // build used stream host response
    Bytestream streamHostUsedPacket = Socks5PacketUtils.createBytestreamResponse(targetJID, initiatorJID);
    streamHostUsedPacket.setSessionID(sessionID);
    streamHostUsedPacket.setUsedHost(proxyJID);
    // return used stream host info as response to the bytestream initiation
    protocol.addResponse(streamHostUsedPacket, new Verification<Bytestream, Bytestream>() {

        @Override
        public void verify(Bytestream request, Bytestream response) {
            // verify SOCKS5 Bytestream request
            assertEquals(response.getSessionID(), request.getSessionID());
            assertEquals(1, request.getStreamHosts().size());
            StreamHost streamHost = (StreamHost) request.getStreamHosts().toArray()[0];
            assertEquals(response.getUsedHost().getJID(), streamHost.getJID());
        }
    }, Verification.correspondingSenderReceiver, Verification.requestTypeSET);
    try {
        // start SOCKS5 Bytestream
        byteStreamManager.establishSession(targetJID, sessionID);
        fail("exception should be thrown");
    } catch (IOException e) {
        // initiator can't connect to proxy because it is not running
        protocol.verifyAll();
        assertEquals(ConnectException.class, e.getClass());
    } catch (Exception e) {
        fail(e.getMessage());
    }
}
Also used : DiscoverInfo(org.jivesoftware.smackx.disco.packet.DiscoverInfo) Item(org.jivesoftware.smackx.disco.packet.DiscoverItems.Item) Bytestream(org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream) DiscoverItems(org.jivesoftware.smackx.disco.packet.DiscoverItems) IOException(java.io.IOException) Identity(org.jivesoftware.smackx.disco.packet.DiscoverInfo.Identity) StreamHost(org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost) SmackException(org.jivesoftware.smack.SmackException) FeatureNotSupportedException(org.jivesoftware.smack.SmackException.FeatureNotSupportedException) ConnectException(java.net.ConnectException) IOException(java.io.IOException) XMPPErrorException(org.jivesoftware.smack.XMPPException.XMPPErrorException) XmppStringprepException(org.jxmpp.stringprep.XmppStringprepException) XMPPException(org.jivesoftware.smack.XMPPException) ConnectException(java.net.ConnectException) Test(org.junit.Test)

Example 8 with StreamHost

use of org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost in project Smack by igniterealtime.

the class Socks5ClientForInitiatorTest method shouldSuccessfullyEstablishConnectionAndActivateSocks5Proxy.

/**
     * Target and initiator should successfully connect to a "remote" SOCKS5 proxy and the initiator
     * activates the bytestream.
     * 
     * @throws Exception should not happen
     */
@Test
public void shouldSuccessfullyEstablishConnectionAndActivateSocks5Proxy() throws Exception {
    // build activation confirmation response
    IQ activationResponse = new EmptyResultIQ();
    activationResponse.setFrom(proxyJID);
    activationResponse.setTo(initiatorJID);
    protocol.addResponse(activationResponse, Verification.correspondingSenderReceiver, Verification.requestTypeSET, new Verification<Bytestream, IQ>() {

        @Override
        public void verify(Bytestream request, IQ response) {
            // verify that the correct stream should be activated
            assertNotNull(request.getToActivate());
            assertEquals(targetJID, request.getToActivate().getTarget());
        }
    });
    // start a local SOCKS5 proxy
    Socks5TestProxy socks5Proxy = Socks5TestProxy.getProxy(proxyPort);
    socks5Proxy.start();
    StreamHost streamHost = new StreamHost(proxyJID, loopbackAddress, socks5Proxy.getPort());
    // create digest to get the socket opened by target
    String digest = Socks5Utils.createDigest(sessionID, initiatorJID, targetJID);
    Socks5ClientForInitiator socks5Client = new Socks5ClientForInitiator(streamHost, digest, connection, sessionID, targetJID);
    Socket initiatorSocket = socks5Client.getSocket(10000);
    InputStream in = initiatorSocket.getInputStream();
    Socket targetSocket = socks5Proxy.getSocket(digest);
    OutputStream out = targetSocket.getOutputStream();
    // verify test data
    for (int i = 0; i < 10; i++) {
        out.write(i);
        assertEquals(i, in.read());
    }
    protocol.verifyAll();
    initiatorSocket.close();
    targetSocket.close();
    socks5Proxy.stop();
}
Also used : InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) EmptyResultIQ(org.jivesoftware.smack.packet.EmptyResultIQ) ErrorIQ(org.jivesoftware.smack.packet.ErrorIQ) IQ(org.jivesoftware.smack.packet.IQ) EmptyResultIQ(org.jivesoftware.smack.packet.EmptyResultIQ) Bytestream(org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream) StreamHost(org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost) Socket(java.net.Socket) Test(org.junit.Test)

Example 9 with StreamHost

use of org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost in project Smack by igniterealtime.

the class Socks5ClientForInitiatorTest method shouldFailIfActivateSocks5ProxyFails.

/**
     * If the initiator can connect to a SOCKS5 proxy but activating the stream fails an exception
     * should be thrown.
     * 
     * @throws Exception should not happen
     */
@Test
public void shouldFailIfActivateSocks5ProxyFails() throws Exception {
    // build error response as reply to the stream activation
    IQ error = new ErrorIQ(XMPPError.getBuilder(XMPPError.Condition.internal_server_error));
    error.setFrom(proxyJID);
    error.setTo(initiatorJID);
    protocol.addResponse(error, Verification.correspondingSenderReceiver, Verification.requestTypeSET);
    // start a local SOCKS5 proxy
    Socks5TestProxy socks5Proxy = Socks5TestProxy.getProxy(proxyPort);
    socks5Proxy.start();
    StreamHost streamHost = new StreamHost(proxyJID, loopbackAddress, socks5Proxy.getPort());
    // create digest to get the socket opened by target
    String digest = Socks5Utils.createDigest(sessionID, initiatorJID, targetJID);
    Socks5ClientForInitiator socks5Client = new Socks5ClientForInitiator(streamHost, digest, connection, sessionID, targetJID);
    try {
        socks5Client.getSocket(10000);
        fail("exception should be thrown");
    } catch (XMPPErrorException e) {
        assertTrue(XMPPError.Condition.internal_server_error.equals(e.getXMPPError().getCondition()));
        protocol.verifyAll();
    }
    socks5Proxy.stop();
}
Also used : ErrorIQ(org.jivesoftware.smack.packet.ErrorIQ) XMPPErrorException(org.jivesoftware.smack.XMPPException.XMPPErrorException) EmptyResultIQ(org.jivesoftware.smack.packet.EmptyResultIQ) ErrorIQ(org.jivesoftware.smack.packet.ErrorIQ) IQ(org.jivesoftware.smack.packet.IQ) StreamHost(org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost) Test(org.junit.Test)

Example 10 with StreamHost

use of org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost in project Smack by igniterealtime.

the class Socks5ClientTest method shouldCloseSocketIfServerRepliesWithError.

/**
     * The SOCKS5 client should close connection if server replies with an error.
     * 
     * @throws Exception should not happen
     */
@Test
public void shouldCloseSocketIfServerRepliesWithError() throws Exception {
    // start thread to connect to SOCKS5 proxy
    Thread serverThread = new Thread() {

        @Override
        public void run() {
            StreamHost streamHost = new StreamHost(proxyJID, serverAddress, serverPort);
            Socks5Client socks5Client = new Socks5Client(streamHost, digest);
            try {
                socks5Client.getSocket(10000);
                fail("exception should be thrown");
            } catch (SmackException e) {
                assertTrue(e.getMessage().contains("SOCKS5 negotiation failed"));
            } catch (Exception e) {
                fail(e.getMessage());
            }
        }
    };
    serverThread.start();
    Socket socket = serverSocket.accept();
    DataInputStream in = new DataInputStream(socket.getInputStream());
    DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    // validate authentication request
    // version
    assertEquals((byte) 0x05, (byte) in.read());
    // number of supported auth methods
    assertEquals((byte) 0x01, (byte) in.read());
    // no-authentication method
    assertEquals((byte) 0x00, (byte) in.read());
    // respond that no no-authentication method is used
    out.write(new byte[] { (byte) 0x05, (byte) 0x00 });
    out.flush();
    Socks5Utils.receiveSocks5Message(in);
    // reply with full SOCKS5 message with an error code (01 = general SOCKS server
    // failure)
    out.write(new byte[] { (byte) 0x05, (byte) 0x01, (byte) 0x00, (byte) 0x03 });
    byte[] address = digest.getBytes(StringUtils.UTF8);
    out.write(address.length);
    out.write(address);
    out.write(new byte[] { (byte) 0x00, (byte) 0x00 });
    out.flush();
    // wait for client to shutdown
    serverThread.join();
    // assert socket is closed
    assertEquals(-1, in.read());
}
Also used : DataOutputStream(java.io.DataOutputStream) SmackException(org.jivesoftware.smack.SmackException) DataInputStream(java.io.DataInputStream) StreamHost(org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost) SmackException(org.jivesoftware.smack.SmackException) Socket(java.net.Socket) ServerSocket(java.net.ServerSocket) Test(org.junit.Test)

Aggregations

StreamHost (org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream.StreamHost)18 Test (org.junit.Test)13 Bytestream (org.jivesoftware.smackx.bytestreams.socks5.packet.Bytestream)12 SmackException (org.jivesoftware.smack.SmackException)10 Socket (java.net.Socket)8 InputStream (java.io.InputStream)6 OutputStream (java.io.OutputStream)5 XMPPErrorException (org.jivesoftware.smack.XMPPException.XMPPErrorException)5 DataInputStream (java.io.DataInputStream)4 DataOutputStream (java.io.DataOutputStream)4 IOException (java.io.IOException)4 ServerSocket (java.net.ServerSocket)4 XMPPException (org.jivesoftware.smack.XMPPException)4 ArrayList (java.util.ArrayList)3 TimeoutException (java.util.concurrent.TimeoutException)3 FeatureNotSupportedException (org.jivesoftware.smack.SmackException.FeatureNotSupportedException)3 XMPPConnection (org.jivesoftware.smack.XMPPConnection)3 ErrorIQ (org.jivesoftware.smack.packet.ErrorIQ)3 IQ (org.jivesoftware.smack.packet.IQ)3 DiscoverInfo (org.jivesoftware.smackx.disco.packet.DiscoverInfo)3